Version 1.5.0-dev.0.0

svn merge -r 35841:36409 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@36412 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/dart.gyp b/dart.gyp
index 0dbe443..86a0bae 100644
--- a/dart.gyp
+++ b/dart.gyp
@@ -104,6 +104,19 @@
       ],
     },
     {
+      # This is the target that is built on the dart2js debug build bots.
+      # It must depend on anything that is required by the dart2js
+      # test suites.
+      # We have this additional target because the try target takes to long
+      # to build in debug mode and will make the build step time out.
+      'target_name': 'dart2js_bot_debug',
+      'type': 'none',
+      'dependencies': [
+        'create_sdk',
+        'packages',
+      ],
+    },
+    {
       'target_name': 'api_docs',
       'type': 'none',
       'dependencies': [
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 73d0fe0..fa2e883 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -5,7 +5,7 @@
 \usepackage{hyperref}
 \newcommand{\code}[1]{{\sf #1}}
 \title{Dart Programming Language  Specification \\
-{\large Version 1.3}}
+{\large Version 1.4}}
 %\author{The Dart Team}
 \begin{document}
 \maketitle
@@ -1059,7 +1059,7 @@
     .
  \end{grammar}
 
-A {\em constructor parameter list} is a parenthesized, comma-separated list of formal constructor parameters. A {\em formal constructor parameter} is either a formal parameter (\ref{formalParameters}) or an initializing formal. An {\em initializing formal} has the form \code{\THIS{}.id}, where \code{id} is the name of an instance variable of the immediately enclosing class. It is a compile-time error if an initializing formal is used by a function other than a non-redirecting generative constructor. 
+A {\em constructor parameter list} is a parenthesized, comma-separated list of formal constructor parameters. A {\em formal constructor parameter} is either a formal parameter (\ref{formalParameters}) or an initializing formal. An {\em initializing formal} has the form \code{\THIS{}.id}, where \code{id} is the name of an instance variable of the immediately enclosing class.  It is a compile-time error if \code{id} is not an instance variable of the immediately enclosing class. It is a compile-time error if an initializing formal is used by a function other than a non-redirecting generative constructor. 
 
 If an explicit type is attached to the initializing formal, that is its static type. Otherwise, the type of an initializing formal named \code{id} is $T_{id}$, where $T_{id}$ is the type of the field named \code{id} in the immediately enclosing class. It is a static warning if the static type of \code{id} is not assignable to $T_{id}$.
 
@@ -1914,7 +1914,38 @@
 The normative versions of these  are given in the appropriate sections of this specification. Some of these restrictions may be lifted in the future.
 }
 
+%The {\em induced type set}, $S$, of a parameterized type $T$ is the set consisting of 
+%\begin{itemize}
+%\item The supertypes of any type in $S$.
+%\item The type arguments of any parameterized type in $S$.
+%\end{itemize}
 
+%Let $P$ be the instantiation of a generic type with its own type parameters. It is a compile-time error if the induced type set of $P$ is not finite.
+
+%\rationale {A typical recursive type declaration such as}
+
+%\begin{dartCode}
+%\CLASS{} B$<$S$>$ \{\}
+%\CLASS{} D$<$T$>$ \EXTENDS{} B$<$D$<$T$>>$ \{\}
+%\end{dartCode}
+
+%\rationale{
+%poses no problem under this rule. The instantiation \cd{D$<$T$>$} has an induced
+%set consisting of: \cd{B$<$D$<$T$>>$, Object, D$<$T$>$, T}. However, the following variant
+%}
+
+%\begin{dartCode}
+%\CLASS{} B$<$S$>$ \{\}
+%\CLASS{} D$<$T$>$ \EXTENDS{} B$<$D$<$D$<$T$>>>$ \{\}
+%\end{dartCode}
+
+%\rationale{
+%is disallowed. Consider again the instantiation \cd{D$<$T$>$}. It leads to the
+%superclass \cd{B$<$D$<$D$<$T$>>>$}, and so adds \cd{D$<$D$< $T$>>$} to the induced set. The latter in turn leads to  \cd{B$<$D$<$D$<$D$<$T$>>>>$} and \cd{D$<$D$<$D$<$T$>>>$}
+%and so on ad infinitum.}
+
+%\commentary{
+%The above requirement does not preclude the use of arbitrary recursive types in the body of a generic class. }
 %A generic has a type parameter scope. The enclosing scope of a type parameter scope of a generic G  is the enclosing scope of G.
 
 
@@ -2047,7 +2078,7 @@
    \item $c_1$ and $c_2$ are non-zero and \code{$c_1$ == $c_2$}.
    \item  Both $c_1$ and $c_2$ are $+0.0$.
    \item Both  $c_1$ and $c_2$ are $-0.0$.
-   \item Both $c_1$ and $c_2$ represent a NaN value.
+   \item Both $c_1$ and $c_2$ represent a NaN value with the same underlying bit pattern.
  \end{itemize}
  OR
  \item $c_1$ and $c_2$ are constant lists that are defined to be identical in the specification of literal list expressions (\ref{lists}), OR
@@ -2573,7 +2604,10 @@
 If a map literal begins with the reserved word \CONST{}, it is a {\em constant map literal} which is a compile-time constant (\ref{constants}) and therefore evaluated at compile-time. Otherwise, it is a {\em run-time map literal} and it is evaluated at run-time. Only run-time map literals can be mutated
 after they are created. Attempting to mutate a constant map literal will result in a dynamic error.
 
-It is a compile-time error if either a key or a value of an entry in a constant map literal is not a compile-time constant. It is a compile-time error if the key of an entry in a constant map literal is an instance of a class that implements the operator $==$ unless the key is a string or integer. It is a compile-time error if the type arguments of a constant map literal include a type parameter. 
+It is a compile-time error if either a key or a value of an entry in a constant map literal is not a compile-time constant. It is a compile-time error if the key of an entry in a constant map literal is an instance of a class that implements the operator $==$ unless the key is a 
+%symbol, 
+string, an integer, a literal symbol or the result of invoking a constant constructor of class \cd{Symbol}. 
+It is a compile-time error if the type arguments of a constant map literal include a type parameter. 
 
 The value of a constant map literal  \CONST{}$ <K, V>\{k_1:e_1\ldots k_n :e_n\}$ is an object $m$ whose class implements the built-in class $Map<K, V>$. The entries of $m$ are $u_i:v_i, i \in 1 .. n$, where $u_i$ is the value of the compile-time expression $k_i$ and $v_i$ is the value of the compile-time expression $e_i$.  The value of a constant map literal  \CONST{} $\{k_1:e_1\ldots k_n :e_n\}$ is defined as the value of a constant map literal \CONST{} $<\DYNAMIC{}, \DYNAMIC{}>\{k_1:e_1\ldots k_n :e_n\}$.
 
@@ -3113,7 +3147,7 @@
 
 $id(a_1, \ldots, a_n, x_{n+1}: a_{n+1}, \ldots, x_{n+k}: a_{n+k})$, 
 
-where $id$ is an identifier. 
+where $id$ is an identifier or an identifier qualified with a library prefix. 
 
 If there exists a lexically visible declaration named $id$, let $f_{id}$ be the innermost such declaration. Then:
 \begin{itemize}
@@ -3134,6 +3168,11 @@
 
 If $i$ does not occur inside a top level or static function, $i$ is equivalent to $\THIS{}.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
 
+% Should also say:
+% It is a static warning if $i$  occurs inside a top level or static function (be it function, method, getter,  or setter) or variable initializer and there is no lexically visible declaration named $id$ in scope.
+
+
+
 
 
 \subsubsection{ Function Expression Invocation}
@@ -3550,9 +3589,9 @@
  
 A {\em logical boolean expression} is either an equality expression (\ref{equality}), or an invocation of a logical boolean operator on an expression $e_1$ with argument $e_2$.
  
-Evaluation of a logical boolean expression $b$ of the form $e_1 || e_2$ causes the evaluation of $e_1$; if $e_1$ evaluates to true, the result of evaluating $b$ is true, otherwise $e_2$ is evaluated to an object $o$, which is then subjected to boolean conversion (\ref{booleanConversion}) producing an object $r$, which is the value of $b$. 
+Evaluation of a logical boolean expression $b$ of the form $e_1 || e_2$ causes the evaluation of $e_1$ which is then  subjected to boolean conversion, yielding an object $o_1$; if $o_1$ is true, the result of evaluating $b$ is true, otherwise $e_2$ is evaluated to an object $o_2$, which is then subjected to boolean conversion (\ref{booleanConversion}) producing an object $r$, which is the value of $b$. 
 
-Evaluation of a logical boolean expression $b$ of the form $e_1 \&\& e_2$ causes the evaluation of $e_1$; if $e_1$ does not evaluate to true, the result of evaluating $b$ is false, otherwise $e_2$ is evaluated to an object $o$, which is then subjected to boolean conversion producing an object $r$, which is the value of $b$. 
+Evaluation of a logical boolean expression $b$ of the form $e_1 \&\& e_2$ causes the evaluation of $e_1$ which is then subjected to boolean conversion, yielding an object $o_1$; if $o_1$ is not  true, the result of evaluating $b$ is false, otherwise $e_2$ is evaluated to an object $o_2$, which is then subjected to boolean conversion producing an object $r$, which is the value of $b$. 
 
 A logical boolean expression $b$ of the form $e_1 \&\& e_2$ shows that a variable $v$ has type 
 $T$ if all of the following conditions hold:
@@ -3570,7 +3609,7 @@
 \end{itemize}
 then the type of $v$ is known to be $T$ in $e_2$.
 
-It is a static warning if the static types of both $e_1$ and $e_2$ may not be assigned to \cd{bool}. The static type of a logical boolean expression is \code{bool}.
+It is a static warning if the static type of $e_1$ may not be assigned to \cd{bool} or if the static type of $e_2$ may not be assigned to \cd{bool}. The static type of a logical boolean expression is \code{bool}.
 
      
  \subsection{ Equality}
@@ -4467,7 +4506,7 @@
 \commentary{In other words,  all the expressions in the cases evaluate to constants of the exact same user defined class or are of certain known types.  Note that the values of the expressions are known at compile-time, and are independent of any static type annotations.
 }
 
-It is a compile-time error if the class $C$ has an implementation of the operator $==$ other than the one inherited from \code{Object} unless the value of the expression is a string or an integer.
+It is a compile-time error if the class $C$ has an implementation of the operator $==$ other than the one inherited from \code{Object} unless the value of the expression is a string, an integer, literal symbol or the result of invoking a constant constructor class \cd{Symbol}.
  
  \rationale{
  The prohibition on user defined equality allows us to implement the switch efficiently for user defined types. We could formulate matching in terms of identity instead with the same efficiency. However, if a type defines an equality operator, programmers would find it quite surprising that equal objects did not match.
@@ -4711,7 +4750,7 @@
 
 If a matching \ON{}-\CATCH{} was found, it will execute first, and then the \FINALLY{} clause will be executed. 
 
-If an exception is raised during execution of an \ON{}-\CATCH{} clause, this will transfer control to the handler for the \FINALLY{} clause, causing the \FINALLY{} clause to execute in this case as well. 
+If an exception is thrown during execution of an \ON{}-\CATCH{} clause, this will transfer control to the handler for the \FINALLY{} clause, causing the \FINALLY{} clause to execute in this case as well. 
 
 If no exception was raised, the \FINALLY{} clause is also executed. Execution of the \FINALLY{} clause could also raise an exception, which will cause transfer of control to the next enclosing handler. 
 }
@@ -5050,7 +5089,7 @@
 If a name $N$ is referenced by a library $L$ and $N$ is  introduced into  the top level scope of $L$ by more than one import, and not all the imports denote the same declaration, then:
 \begin{itemize}
 \item A static warning occurs.
-\item If $N$ is referenced as a function, getter or setter, a \code{NoSuchMethodError} is raised. 
+\item If $N$ is referenced as a function, getter or setter, a \code{NoSuchMethodError} is thrown. 
 \item  If $N$ is referenced as a type, it is treated as a malformed type.
 
 \end{itemize}
@@ -5184,7 +5223,11 @@
 A {\em script} is a library whose exported namespace  (\ref{exports}) includes a top-level function \code{main}. 
 A script $S$ may be executed as follows:
 
-First, $S$ is compiled as a library as specified above. Then, the top-level function \code{main} that is in the exported namespace of $S$ is invoked with no arguments. It is a run time error if $S$ does not declare or import a top-level function \code{main}.
+First, $S$ is compiled as a library as specified above. Then, the top-level function \code{main} that is in the exported namespace of $S$ is invoked. If \code{main} has no formal parameters, it is invoked with no arguments. Otherwise \code{main} is invoked with a single actual argument whose type implements \code{List$<$String$>$}. It is a run time error if $S$ does not declare or import a top-level function \code{main}. It is a static warning if \code{main} has more than one required parameter.
+
+\commentary {
+If \code{main} requires more than one argument, a run time error will occur.
+}
 
 \rationale{
 The names of scripts are optional, in the interests of interactive, informal use. However, any script of long term value should be given a name as a matter of good practice. 
@@ -5620,7 +5663,7 @@
 (2)  \code{typedAPI(new G()); }
 
 
-Under the alternative rules, (2) would cause a runtime error in checked mode. This seems desirable from the perspective of error localization. However, when a dynamic error is raised at (2), the only way to keep running is rewriting (2) into
+Under the alternative rules, (2) would cause a runtime error in checked mode. This seems desirable from the perspective of error localization. However, when a dynamic error is thrown at (2), the only way to keep running is rewriting (2) into
 
 (3) \code{typedAPI(new G\lt{String}\gt());}
 
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 7af6afd..af8c32e 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -24,6 +24,11 @@
   static const String ERROR_NOTIFICATION_NAME = 'context.errors';
 
   /**
+   * The name of the contextId parameter.
+   */
+  static const String CONTEXT_ID_PARAM = 'contextId';
+
+  /**
    * The name of the parameter whose value is a list of errors.
    */
   static const String ERRORS_PARAM = 'errors';
@@ -63,6 +68,11 @@
   final Map<String, AnalysisContext> contextMap = new Map<String, AnalysisContext>();
 
   /**
+   * A table mapping analysis contexts to the context id's associated with them.
+   */
+  final Map<AnalysisContext, String> contextIdMap = new Map<AnalysisContext, String>();
+
+  /**
    * A list of the analysis contexts for which analysis work needs to be
    * performed.
    *
@@ -157,8 +167,10 @@
     // Look for a context that has work to be done and then perform one task.
     //
     List<ChangeNotice> notices = null;
+    String contextId;
     try {
       AnalysisContext context = contextWorkQueue[0];
+      contextId = contextIdMap[context];
       AnalysisResult result = context.performAnalysisTask();
       notices = result.changeNotices;
     } finally {
@@ -178,17 +190,18 @@
       }
     }
     if (notices != null) {
-      sendNotices(notices);
+      sendNotices(contextId, notices);
     }
   }
 
   /**
    * Send the information in the given list of notices back to the client.
    */
-  void sendNotices(List<ChangeNotice> notices) {
+  void sendNotices(String contextId, List<ChangeNotice> notices) {
     for (int i = 0; i < notices.length; i++) {
       ChangeNotice notice = notices[i];
       Notification notification = new Notification(ERROR_NOTIFICATION_NAME);
+      notification.setParameter(CONTEXT_ID_PARAM, contextId);
       notification.setParameter(SOURCE_PARAM, notice.source.encoding);
       notification.setParameter(ERRORS_PARAM, notice.errors.map(
           errorToJson).toList());
diff --git a/pkg/analysis_server/lib/src/channel.dart b/pkg/analysis_server/lib/src/channel.dart
index f6b3230..895316a 100644
--- a/pkg/analysis_server/lib/src/channel.dart
+++ b/pkg/analysis_server/lib/src/channel.dart
@@ -170,10 +170,54 @@
 }
 
 /**
- * Instances of the class [ByteStreamServerChannel] implement a
+ * Instances of the class [ByteStreamClientChannel] implement a
  * [ClientCommunicationChannel] that uses a stream and a sink (typically,
  * standard input and standard output) to communicate with servers.
  */
+class ByteStreamClientChannel implements ClientCommunicationChannel {
+  final Stream input;
+  final IOSink output;
+
+  @override
+  Stream<Response> responseStream;
+
+  @override
+  Stream<Notification> notificationStream;
+
+  ByteStreamClientChannel(this.input, this.output) {
+    Stream jsonStream = input.transform((new Utf8Codec()).decoder)
+        .transform(new LineSplitter())
+        .transform(new JsonStreamDecoder())
+        .where((json) => json is Map)
+        .asBroadcastStream();
+    responseStream = jsonStream
+        .where((json) => json[Notification.EVENT] == null)
+        .transform(new ResponseConverter())
+        .asBroadcastStream();
+    notificationStream = jsonStream
+        .where((json) => json[Notification.EVENT] != null)
+        .transform(new NotificationConverter())
+        .asBroadcastStream();
+  }
+
+  @override
+  Future close() {
+    return output.close();
+  }
+
+  @override
+  Future<Response> sendRequest(Request request) {
+    String id = request.id;
+    output.writeln(JSON.encode(request.toJson()));
+    return responseStream.firstWhere((Response response) => response.id == id);
+  }
+}
+
+/**
+ * Instances of the class [ByteStreamServerChannel] implement a
+ * [ServerCommunicationChannel] that uses a stream and a sink (typically,
+ * standard input and standard output) to communicate with clients.
+ */
 class ByteStreamServerChannel implements ServerCommunicationChannel {
   final Stream input;
   final IOSink output;
diff --git a/pkg/analysis_server/lib/src/domain_context.dart b/pkg/analysis_server/lib/src/domain_context.dart
index 843045c..46ad6fa 100644
--- a/pkg/analysis_server/lib/src/domain_context.dart
+++ b/pkg/analysis_server/lib/src/domain_context.dart
@@ -154,15 +154,21 @@
   ChangeSet createChangeSet(Request request, SourceFactory sourceFactory,
                             RequestDatum jsonData) {
     ChangeSet changeSet = new ChangeSet();
-    convertSources(request, sourceFactory, jsonData[ADDED_PARAM], (Source source) {
-      changeSet.addedSource(source);
-    });
-    convertSources(request, sourceFactory, jsonData[MODIFIED_PARAM], (Source source) {
-      changeSet.changedSource(source);
-    });
-    convertSources(request, sourceFactory, jsonData[REMOVED_PARAM], (Source source) {
-      changeSet.removedSource(source);
-    });
+    if (jsonData.hasKey(ADDED_PARAM)) {
+      convertSources(request, sourceFactory, jsonData[ADDED_PARAM], (Source source) {
+        changeSet.addedSource(source);
+      });
+    }
+    if (jsonData.hasKey(MODIFIED_PARAM)) {
+      convertSources(request, sourceFactory, jsonData[MODIFIED_PARAM], (Source source) {
+        changeSet.changedSource(source);
+      });
+    }
+    if (jsonData.hasKey(REMOVED_PARAM)) {
+      convertSources(request, sourceFactory, jsonData[REMOVED_PARAM], (Source source) {
+        changeSet.removedSource(source);
+      });
+    }
     return changeSet;
   }
 
diff --git a/pkg/analysis_server/lib/src/domain_server.dart b/pkg/analysis_server/lib/src/domain_server.dart
index 102a79c..e213bdd 100644
--- a/pkg/analysis_server/lib/src/domain_server.dart
+++ b/pkg/analysis_server/lib/src/domain_server.dart
@@ -38,11 +38,6 @@
   static const String VERSION_METHOD = 'server.version';
 
   /**
-   * The name of the contextId parameter.
-   */
-  static const String CONTEXT_ID_PARAM = 'contextId';
-
-  /**
    * The name of the packageMap parameter.
    */
   static const String PACKAGE_MAP_PARAM = 'packageMap';
@@ -95,7 +90,7 @@
     String sdkDirectory = request.getRequiredParameter(SDK_DIRECTORY_PARAM).asString();
     Map<String, String> packageMap = request.getParameter(PACKAGE_MAP_PARAM, {}).asStringMap();
 
-    String contextId = request.getRequiredParameter(CONTEXT_ID_PARAM).asString();
+    String contextId = request.getRequiredParameter(AnalysisServer.CONTEXT_ID_PARAM).asString();
     if (server.contextMap.containsKey(contextId)) {
       return new Response.contextAlreadyExists(request);
     }
@@ -116,6 +111,7 @@
       // new PackageUriResolver(),
     ]);
     server.contextMap[contextId] = context;
+    server.contextIdMap[context] = contextId;
 
     Response response = new Response(request.id);
     return response;
@@ -126,12 +122,13 @@
    * will result in an error being returned.
    */
   Response deleteContext(Request request) {
-    String contextId = request.getRequiredParameter(CONTEXT_ID_PARAM).asString();
+    String contextId = request.getRequiredParameter(AnalysisServer.CONTEXT_ID_PARAM).asString();
 
     AnalysisContext removedContext = server.contextMap.remove(contextId);
     if (removedContext == null) {
       return new Response.contextDoesNotExist(request);
     }
+    server.contextIdMap.remove(removedContext);
     Response response = new Response(request.id);
     return response;
   }
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart
index ef58a8a..75b29c7 100644
--- a/pkg/analysis_server/lib/src/protocol.dart
+++ b/pkg/analysis_server/lib/src/protocol.dart
@@ -173,7 +173,7 @@
    * a [RequestDatum] containing the corresponding value.
    */
   RequestDatum operator [](String key) {
-    if (datum is! Map<String, dynamic>) {
+    if (datum is! Map) {
       throw new RequestFailure(new Response.invalidParameter(request, path,
           "be a map"));
     }
@@ -185,11 +185,22 @@
   }
 
   /**
+   * Return `true` if the datum is a Map containing the given [key].
+   */
+  bool hasKey(String key) {
+    if (datum is! Map) {
+      throw new RequestFailure(new Response.invalidParameter(request, path,
+          "be a map"));
+    }
+    return datum.containsKey(key);
+  }
+
+  /**
    * Validate that the datum is a Map whose keys are strings, and call [f] on
    * each key/value pair in the map.
    */
   void forEachMap(void f(String key, RequestDatum value)) {
-    if (datum is! Map<String, dynamic>) {
+    if (datum is! Map) {
       throw new RequestFailure(new Response.invalidParameter(request, path,
           "be a map"));
     }
@@ -226,9 +237,9 @@
     if (datum is bool) {
       return datum;
     } else if (datum == 'true') {
-      return datum == 'true';
+      return true;
     } else if (datum == 'false') {
-      return datum == 'false';
+      return false;
     }
     throw new RequestFailure(new Response.invalidParameter(request, datum,
         "be a boolean"));
@@ -246,10 +257,25 @@
   }
 
   /**
+   * Determine if the datum is a list of strings.
+   */
+  bool isStringList() {
+    if (datum is! List) {
+      return false;
+    }
+    for (var element in datum) {
+      if (element is! String) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
    * Validate that the datum is a list of strings, and return it.
    */
   List<String> asStringList() {
-    if (datum is! List<String>) {
+    if (!isStringList()) {
       throw new RequestFailure(new Response.invalidParameter(request, path,
           "be a list of strings"));
     }
@@ -257,10 +283,28 @@
   }
 
   /**
+   * Determine if the datum is a map whose values are all strings.
+   *
+   * Note: we can safely assume that the keys are all strings, since JSON maps
+   * cannot have any other key type.
+   */
+  bool isStringMap() {
+    if (datum is! Map) {
+      return false;
+    }
+    for (var value in datum.values) {
+      if (value is! String) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
    * Validate that the datum is a map from strings to strings, and return it.
    */
   Map<String, String> asStringMap() {
-    if (datum is! Map<String, String>) {
+    if (!isStringMap()) {
       throw new RequestFailure(new Response.invalidParameter(request, path,
           "be a string map"));
     }
@@ -412,9 +456,7 @@
   Map<String, Object> toJson() {
     Map<String, Object> jsonObject = new Map<String, Object>();
     jsonObject[ID] = id;
-    if (error == null) {
-      jsonObject[ERROR] = null;
-    } else {
+    if (error != null) {
       jsonObject[ERROR] = error.toJson();
     }
     if (!result.isEmpty) {
@@ -451,7 +493,7 @@
    * server. An error occurred on the server while parsing the JSON text.
    */
   static const int CODE_PARSE_ERROR = -32700;
-  
+
   /**
    * An error code indicating that the analysis server has already been
    * started (and hence won't accept new connections).
@@ -523,7 +565,7 @@
    */
   RequestError.serverAlreadyStarted()
     : this(CODE_SERVER_ALREADY_STARTED, "Server already started");
-  
+
   /**
    * Initialize a newly created [Error] to indicate an invalid request. The
    * JSON sent is not a valid [Request] object.
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index da3c136..0768143 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -11,4 +11,5 @@
   args: any
   logging: any
 dev_dependencies:
+  mock: '>=0.10.0 <0.11.0'
   unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index 59b4cdd..c79f3c8 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -65,12 +65,13 @@
   static Future addContextToWorkQueue_whenRunning() {
     MockAnalysisContext context = new MockAnalysisContext();
     server.addContextToWorkQueue(context);
+    server.contextIdMap[context] = 'context-27';
     MockSource source = new MockSource();
     source.when(callsTo('get encoding')).alwaysReturn('foo.dart');
     ChangeNoticeImpl changeNoticeImpl = new ChangeNoticeImpl(source);
     LineInfo lineInfo = new LineInfo([0]);
     AnalysisError analysisError = new AnalysisError.con1(source,
-        CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, []);
+        CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, ['Foo']);
     changeNoticeImpl.setErrors([analysisError], lineInfo);
     context.when(callsTo('performAnalysisTask')).thenReturn(
         new AnalysisResult([changeNoticeImpl], 0, 'myClass', 0));
@@ -78,14 +79,13 @@
         new AnalysisResult(null, 0, null, 0));
     return pumpEventQueue().then((_) {
       context.getLogs(callsTo('performAnalysisTask')).verify(happenedExactly(2));
-      expect(channel.notificationsReceived, hasLength(2));
-      expect(channel.notificationsReceived[0].event, equals('server.connected')
-          );
-      expect(channel.notificationsReceived[1].event, equals('context.errors'));
-      expect(channel.notificationsReceived[1].params['source'], equals(
-          'foo.dart'));
-      List<AnalysisError> errors =
-          channel.notificationsReceived[1].params['errors'];
+      var notifications = channel.notificationsReceived;
+      expect(notifications, hasLength(2));
+      expect(notifications[0].event, equals('server.connected'));
+      expect(notifications[1].event, equals('context.errors'));
+      expect(notifications[1].params['source'], equals('foo.dart'));
+      expect(notifications[1].params['contextId'], equals('context-27'));
+      List<AnalysisError> errors = notifications[1].params['errors'];
       expect(errors, hasLength(1));
       expect(errors[0], equals(AnalysisServer.errorToJson(analysisError)));
     });
@@ -106,7 +106,7 @@
     server.handlers = [new ServerDomainHandler(server)];
     var request = new Request('my27', ServerDomainHandler.CREATE_CONTEXT_METHOD);
     request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
-    request.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, 'ctx');
+    request.setParameter(AnalysisServer.CONTEXT_ID_PARAM, 'ctx');
     return channel.sendRequest(request)
         .then((Response response) {
           expect(response.id, equals('my27'));
@@ -142,14 +142,14 @@
     CompileTimeErrorCode errorCode =
         CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER;
     AnalysisError analysisError =
-        new AnalysisError.con2(source, 10, 5, errorCode, []);
+        new AnalysisError.con2(source, 10, 5, errorCode, ['Foo']);
     Map<String, Object> json = AnalysisServer.errorToJson(analysisError);
     expect(json, hasLength(5));
     expect(json['source'], equals('foo.dart'));
     expect(json['errorCode'], equals(errorCode.ordinal));
     expect(json['offset'], equals(analysisError.offset));
     expect(json['length'], equals(analysisError.length));
-    expect(json['message'], equals(errorCode.message));
+    expect(json['message'], equals(errorCode.message.replaceAll('%s', 'Foo')));
   }
 
   static void errorToJson_withCorrection() {
diff --git a/pkg/analysis_server/test/channel_test.dart b/pkg/analysis_server/test/channel_test.dart
index 1f23745..95e9cc6 100644
--- a/pkg/analysis_server/test/channel_test.dart
+++ b/pkg/analysis_server/test/channel_test.dart
@@ -26,6 +26,13 @@
     test('requestResponse', WebSocketChannelTest.requestResponse);
     test('response', WebSocketChannelTest.response);
   });
+  group('ByteStreamClientChannel',  () {
+    setUp(ByteStreamClientChannelTest.setUp);
+    test('close', ByteStreamClientChannelTest.close);
+    test('listen_notification', ByteStreamClientChannelTest.listen_notification);
+    test('listen_response', ByteStreamClientChannelTest.listen_response);
+    test('sendRequest', ByteStreamClientChannelTest.sendRequest);
+  });
   group('ByteStreamServerChannel', () {
     setUp(ByteStreamServerChannelTest.setUp);
     test('closed', ByteStreamServerChannelTest.closed);
@@ -173,6 +180,93 @@
   }
 }
 
+class ByteStreamClientChannelTest {
+  static ByteStreamClientChannel channel;
+
+  /**
+   * Sink that may be used to deliver data to the channel, as though it's
+   * coming from the server.
+   */
+  static IOSink inputSink;
+
+  /**
+   * Sink through which the channel delivers data to the server.
+   */
+  static IOSink outputSink;
+
+  /**
+   * Stream of lines sent back to the client by the channel.
+   */
+  static Stream<String> outputLineStream;
+
+  static void setUp() {
+    var inputStream = new StreamController<List<int>>();
+    inputSink = new IOSink(inputStream);
+    var outputStream = new StreamController<List<int>>();
+    outputLineStream = outputStream.stream.transform((new Utf8Codec()).decoder
+        ).transform(new LineSplitter());
+    outputSink = new IOSink(outputStream);
+    channel = new ByteStreamClientChannel(inputStream.stream, outputSink);
+  }
+
+  static Future close() {
+    bool doneCalled = false;
+    bool closeCalled = false;
+    // add listener so that outputSink will trigger done/close futures
+    outputLineStream.listen((_) { /* no-op */ });
+    outputSink.done.then((_) {
+      doneCalled = true;
+    });
+    channel.close().then((_) {
+      closeCalled = true;
+    });
+    return pumpEventQueue().then((_) {
+      expect(doneCalled, isTrue);
+      expect(closeCalled, isTrue);
+    });
+  }
+
+  static Future listen_notification() {
+    List<Notification> notifications = [];
+    channel.notificationStream.forEach((n) => notifications.add(n));
+    inputSink.writeln('{"event":"server.connected"}');
+    return pumpEventQueue().then((_) {
+      expect(notifications.length, equals(1));
+      expect(notifications[0].event, equals('server.connected'));
+    });
+  }
+
+  static Future listen_response() {
+    List<Response> responses = [];
+    channel.responseStream.forEach((n) => responses.add(n));
+    inputSink.writeln('{"id":"72"}');
+    return pumpEventQueue().then((_) {
+      expect(responses.length, equals(1));
+      expect(responses[0].id, equals('72'));
+    });
+  }
+
+  static Future sendRequest() {
+    int assertCount = 0;
+    Request request = new Request('72', 'foo.bar');
+    outputLineStream.first
+        .then((line) => new JsonDecoder().convert(line))
+        .then((json) {
+          expect(json[Request.ID], equals('72'));
+          expect(json[Request.METHOD], equals('foo.bar'));
+          inputSink.writeln('{"id":"73"}');
+          inputSink.writeln('{"id":"72"}');
+          assertCount++;
+        });
+    channel.sendRequest(request)
+        .then((Response response) {
+          expect(response.id, equals('72'));
+          assertCount++;
+        });
+    return pumpEventQueue().then((_) => expect(assertCount, equals(2)));
+  }
+}
+
 class ByteStreamServerChannelTest {
   static ByteStreamServerChannel channel;
 
diff --git a/pkg/analysis_server/test/domain_context_test.dart b/pkg/analysis_server/test/domain_context_test.dart
index 2181565..96b887c 100644
--- a/pkg/analysis_server/test/domain_context_test.dart
+++ b/pkg/analysis_server/test/domain_context_test.dart
@@ -19,6 +19,7 @@
   group('ContextDomainHandlerTest', () {
     test('applyChanges', ContextDomainHandlerTest.applyChanges);
     test('createChangeSet', ContextDomainHandlerTest.createChangeSet);
+    test('createChangeSet_onlyAdded', ContextDomainHandlerTest.createChangeSet_onlyAdded);
     test('setOptions', ContextDomainHandlerTest.setOptions);
     test('setPrioritySources_empty', ContextDomainHandlerTest.setPrioritySources_empty);
     test('setPrioritySources_nonEmpty', ContextDomainHandlerTest.setPrioritySources_nonEmpty);
@@ -46,8 +47,7 @@
     Response response = handler.handleRequest(request);
     expect(server.contextWorkQueue, hasLength(1));
     expect(response.toJson(), equals({
-      Response.ID: '0',
-      Response.ERROR: null
+      Response.ID: '0'
     }));
   }
 
@@ -68,6 +68,20 @@
     expect(changeSet.removedSources, hasLength(equals(2)));
   }
 
+  static void createChangeSet_onlyAdded() {
+    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+    Request request = new Request('0', ContextDomainHandler.APPLY_CHANGES_NAME);
+    ContextDomainHandler handler = new ContextDomainHandler(server);
+    SourceFactory sourceFactory = new SourceFactory([new FileUriResolver()]);
+    ChangeSet changeSet = handler.createChangeSet(request, sourceFactory,
+        new RequestDatum(request, ContextDomainHandler.CHANGES_PARAM, {
+      ContextDomainHandler.ADDED_PARAM: ['ffile:/one.dart'],
+    }));
+    expect(changeSet.addedSources, hasLength(equals(1)));
+    expect(changeSet.changedSources, hasLength(equals(0)));
+    expect(changeSet.removedSources, hasLength(equals(0)));
+  }
+
   static void setOptions() {
     AnalysisServer server = new AnalysisServer(new MockServerChannel());
     String contextId = _createContext(server);
@@ -79,8 +93,7 @@
     request.setParameter(ContextDomainHandler.OPTIONS_PARAM, options);
     Response response = handler.handleRequest(request);
     expect(response.toJson(), equals({
-      Response.ID: '0',
-      Response.ERROR: null
+      Response.ID: '0'
     }));
   }
 
@@ -95,8 +108,7 @@
     request.setParameter(ContextDomainHandler.SOURCES_PARAM, sources);
     Response response = handler.handleRequest(request);
     expect(response.toJson(), equals({
-      Response.ID: '0',
-      Response.ERROR: null
+      Response.ID: '0'
     }));
   }
 
@@ -112,8 +124,7 @@
     request.setParameter(ContextDomainHandler.SOURCES_PARAM, sources);
     Response response = handler.handleRequest(request);
     expect(response.toJson(), equals({
-      Response.ID: '0',
-      Response.ERROR: null
+      Response.ID: '0'
     }));
   }
 
@@ -122,7 +133,7 @@
     ServerDomainHandler handler = new ServerDomainHandler(server);
     Request request = new Request('0', ServerDomainHandler.CREATE_CONTEXT_METHOD);
     request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
-    request.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, contextId);
+    request.setParameter(AnalysisServer.CONTEXT_ID_PARAM, contextId);
     Response response = handler.handleRequest(request);
     if (response.error != null) {
       fail('Unexpected error: ${response.error.toJson()}');
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index cb63f61..031c95c 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -29,20 +29,20 @@
 
     Request createRequest = new Request('0', ServerDomainHandler.CREATE_CONTEXT_METHOD);
     createRequest.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
-    createRequest.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, 'ctx');
+    createRequest.setParameter(AnalysisServer.CONTEXT_ID_PARAM, 'ctx');
     Response response = handler.handleRequest(createRequest);
     expect(response.id, equals('0'));
     expect(response.error, isNull);
     expect(response.result, isEmpty);
   }
-  
+
   static void createContext_alreadyExists() {
     AnalysisServer server = new AnalysisServer(new MockServerChannel());
     ServerDomainHandler handler = new ServerDomainHandler(server);
 
     Request createRequest = new Request('0', ServerDomainHandler.CREATE_CONTEXT_METHOD);
     createRequest.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
-    createRequest.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, 'ctx');
+    createRequest.setParameter(AnalysisServer.CONTEXT_ID_PARAM, 'ctx');
     Response response = handler.handleRequest(createRequest);
     expect(response.error, isNull);
     response = handler.handleRequest(createRequest);
@@ -56,11 +56,11 @@
     String contextId = 'ctx';
     Request createRequest = new Request('0', ServerDomainHandler.CREATE_CONTEXT_METHOD);
     createRequest.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
-    createRequest.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, contextId);
+    createRequest.setParameter(AnalysisServer.CONTEXT_ID_PARAM, contextId);
     handler.handleRequest(createRequest);
 
     Request deleteRequest = new Request('0', ServerDomainHandler.DELETE_CONTEXT_METHOD);
-    deleteRequest.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, contextId);
+    deleteRequest.setParameter(AnalysisServer.CONTEXT_ID_PARAM, contextId);
     handler.handleRequest(deleteRequest);
     Response response = handler.handleRequest(deleteRequest);
     expect(response.id, equals('0'));
@@ -72,7 +72,7 @@
     ServerDomainHandler handler = new ServerDomainHandler(server);
 
     Request deleteRequest = new Request('0', ServerDomainHandler.DELETE_CONTEXT_METHOD);
-    deleteRequest.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, 'xyzzy');
+    deleteRequest.setParameter(AnalysisServer.CONTEXT_ID_PARAM, 'xyzzy');
     Response response = handler.handleRequest(deleteRequest);
     expect(response.id, equals('0'));
     expect(response.error, isNotNull);
@@ -85,15 +85,14 @@
     String contextId = 'ctx';
     Request createRequest = new Request('0', ServerDomainHandler.CREATE_CONTEXT_METHOD);
     createRequest.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
-    createRequest.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, contextId);
+    createRequest.setParameter(AnalysisServer.CONTEXT_ID_PARAM, contextId);
     handler.createContext(createRequest);
 
     Request deleteRequest = new Request('0', ServerDomainHandler.DELETE_CONTEXT_METHOD);
-    deleteRequest.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, contextId);
+    deleteRequest.setParameter(AnalysisServer.CONTEXT_ID_PARAM, contextId);
     Response response = handler.handleRequest(deleteRequest);
     expect(response.toJson(), equals({
-      Response.ID: '0',
-      Response.ERROR: null
+      Response.ID: '0'
     }));
   }
 
@@ -105,8 +104,7 @@
     Request shutdownRequest = new Request('0', ServerDomainHandler.SHUTDOWN_METHOD);
     Response response = handler.handleRequest(shutdownRequest);
     expect(response.toJson(), equals({
-      Response.ID: '0',
-      Response.ERROR: null
+      Response.ID: '0'
     }));
     expect(server.running, isFalse);
   }
@@ -119,7 +117,6 @@
     Response response = handler.handleRequest(versionRequest);
     expect(response.toJson(), equals({
       Response.ID: '0',
-      Response.ERROR: null,
       Response.RESULT: {
         ServerDomainHandler.VERSION_RESULT: '0.0.1'
       }
diff --git a/pkg/analysis_server/test/protocol_test.dart b/pkg/analysis_server/test/protocol_test.dart
index 0869923..61ec2b6 100644
--- a/pkg/analysis_server/test/protocol_test.dart
+++ b/pkg/analysis_server/test/protocol_test.dart
@@ -250,10 +250,13 @@
 
   @override
   bool matches(item, Map matchState) {
-    if (item is! Response) {
+    if (item is! RequestFailure) {
       return false;
     }
-    Response response = item;
+    var response = item.response;
+    if (response is! Response) {
+      return false;
+    }
     if (response.error is! RequestError) {
       return false;
     }
@@ -281,38 +284,61 @@
     return new RequestDatum(request, 'myPath', datum);
   }
 
+  @runTest
   static void indexOperator_nonMap() {
+    setUp();
     expect(() => makeDatum(1)['foo'], _throwsInvalidParameter);
   }
 
+  @runTest
   static void indexOperator_missingKey() {
+    setUp();
     expect(() => makeDatum({
       'foo': 'bar'
     })['baz'], _throwsInvalidParameter);
   }
 
+  @runTest
   static void indexOperator_hasKey() {
+    setUp();
     var indexResult = makeDatum({
       'foo': 'bar'
     })['foo'];
     expect(indexResult, isRequestDatum);
     expect(indexResult.datum, equals('bar'));
-    expect(indexResult.path, equals('myPath.bar'));
+    expect(indexResult.path, equals('myPath.foo'));
   }
 
+  @runTest
+  static void hasKey() {
+    setUp();
+    var datum = makeDatum({
+      'foo': 'bar'
+    });
+    expect(datum.hasKey('foo'), isTrue);
+    expect(datum.hasKey('bar'), isFalse);
+    expect(datum.hasKey('baz'), isFalse);
+  }
+
+  @runTest
   static void forEachMap_nonMap() {
+    setUp();
     expect(() => makeDatum(1).forEachMap((key, value) {
       fail('Non-map should not be iterated');
     }), _throwsInvalidParameter);
   }
 
+  @runTest
   static void forEachMap_emptyMap() {
+    setUp();
     makeDatum({}).forEachMap((key, value) {
       fail('Empty map should not be iterated');
     });
   }
 
+  @runTest
   static void forEachMap_oneElementMap() {
+    setUp();
     int callCount = 0;
     makeDatum({
       'key': 'value'
@@ -325,7 +351,9 @@
     expect(callCount, equals(1));
   }
 
+  @runTest
   static void forEachMap_twoElementMap() {
+    setUp();
     int callCount = 0;
     Map<String, String> map = {
       'key1': 'value1',
@@ -334,13 +362,16 @@
     Map iterationResult = {};
     makeDatum(map).forEachMap((key, value) {
       callCount++;
-      iterationResult[key] = value;
+      expect(value, isRequestDatum);
+      iterationResult[key] = value.datum;
     });
     expect(callCount, equals(2));
     expect(iterationResult, equals(map));
   }
 
+  @runTest
   static void asBool() {
+    setUp();
     expect(makeDatum(true).asBool(), isTrue);
     expect(makeDatum(false).asBool(), isFalse);
     expect(makeDatum('true').asBool(), isTrue);
@@ -348,26 +379,34 @@
     expect(() => makeDatum('abc').asBool(), _throwsInvalidParameter);
   }
 
+  @runTest
   static void asInt() {
+    setUp();
     expect(makeDatum(1).asInt(), equals(1));
     expect(makeDatum('2').asInt(), equals(2));
     expect(() => makeDatum('xxx').asInt(), _throwsInvalidParameter);
     expect(() => makeDatum(true).asInt(), _throwsInvalidParameter);
   }
 
+  @runTest
   static void asString() {
+    setUp();
     expect(makeDatum('foo').asString(), equals('foo'));
     expect(() => makeDatum(3).asString(), _throwsInvalidParameter);
   }
 
+  @runTest
   static void asStringList() {
+    setUp();
     expect(makeDatum(['foo', 'bar']).asStringList(), equals(['foo', 'bar']));
     expect(makeDatum([]).asStringList(), equals([]));
     expect(() => makeDatum(['foo', 1]).asStringList(), _throwsInvalidParameter);
     expect(() => makeDatum({}).asStringList(), _throwsInvalidParameter);
   }
 
+  @runTest
   static void asStringMap() {
+    setUp();
     expect(makeDatum({
       'key1': 'value1',
       'key2': 'value2'
@@ -384,10 +423,6 @@
       'key1': 1,
       'key2': 2
     }).asStringMap(), _throwsInvalidParameter);
-    expect(() => makeDatum({
-      1: 'value1',
-      2: 'value2'
-    }).asStringMap(), _throwsInvalidParameter);
     expect(() => makeDatum([]).asStringMap(), _throwsInvalidParameter);
   }
 }
@@ -457,7 +492,6 @@
     expect(response.getResult(resultName), same(resultValue));
     expect(response.toJson(), equals({
       Response.ID: '0',
-      Response.ERROR: null,
       Response.RESULT: {
         resultName: resultValue
       }
diff --git a/pkg/analysis_server/test/test_all.dart b/pkg/analysis_server/test/test_all.dart
index dc410d0..e230a51 100644
--- a/pkg/analysis_server/test/test_all.dart
+++ b/pkg/analysis_server/test/test_all.dart
@@ -10,7 +10,6 @@
 import 'domain_server_test.dart' as domain_server_test;
 import 'protocol_test.dart' as protocol_test;
 import 'socket_server_test.dart' as socket_server_test;
-import 'typed_mock_test.dart' as typed_mock_test;
 
 /// Utility for manually running all tests
 main() {
@@ -21,6 +20,5 @@
     domain_server_test.main();
     protocol_test.main();
     socket_server_test.main();
-    typed_mock_test.main();
   });
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 90db683..52c3f81 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -16,6 +16,7 @@
 import 'utilities_dart.dart';
 import 'utilities_collection.dart' show TokenMap;
 import 'element.dart';
+import 'constant.dart';
 
 /**
  * Instances of the class `AdjacentStrings` represents two or more string literals that are
@@ -790,6 +791,19 @@
    * @param rightHandSide the expression used to compute the right hand side
    */
   AssignmentExpression(Expression leftHandSide, this.operator, Expression rightHandSide) {
+    if (leftHandSide == null || rightHandSide == null) {
+      String message;
+      if (leftHandSide == null) {
+        if (rightHandSide == null) {
+          message = "Both the left-hand and right-hand sides are null";
+        } else {
+          message = "The left-hand size is null";
+        }
+      } else {
+        message = "The right-hand size is null";
+      }
+      AnalysisEngine.instance.logger.logError2(message, new JavaException(message));
+    }
     this._leftHandSide = becomeParentOf(leftHandSide);
     this._rightHandSide = becomeParentOf(rightHandSide);
   }
@@ -949,59 +963,68 @@
  * results or properties associated with the nodes.
  */
 class AstCloner implements AstVisitor<AstNode> {
-  @override
-  AdjacentStrings visitAdjacentStrings(AdjacentStrings node) => new AdjacentStrings(_cloneNodeList(node.strings));
+  List cloneNodeList(NodeList nodes) {
+    int count = nodes.length;
+    List clonedNodes = new List();
+    for (int i = 0; i < count; i++) {
+      clonedNodes.add((nodes[i]).accept(this) as AstNode);
+    }
+    return clonedNodes;
+  }
 
   @override
-  Annotation visitAnnotation(Annotation node) => new Annotation(node.atSign, _cloneNode(node.name), node.period, _cloneNode(node.constructorName), _cloneNode(node.arguments));
+  AdjacentStrings visitAdjacentStrings(AdjacentStrings node) => new AdjacentStrings(cloneNodeList(node.strings));
 
   @override
-  ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(node.leftParenthesis, _cloneNodeList(node.arguments), node.rightParenthesis);
+  Annotation visitAnnotation(Annotation node) => new Annotation(node.atSign, cloneNode(node.name), node.period, cloneNode(node.constructorName), cloneNode(node.arguments));
 
   @override
-  AsExpression visitAsExpression(AsExpression node) => new AsExpression(_cloneNode(node.expression), node.asOperator, _cloneNode(node.type));
+  ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(node.leftParenthesis, cloneNodeList(node.arguments), node.rightParenthesis);
 
   @override
-  AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(node.keyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, node.semicolon);
+  AsExpression visitAsExpression(AsExpression node) => new AsExpression(cloneNode(node.expression), node.asOperator, cloneNode(node.type));
 
   @override
-  AssignmentExpression visitAssignmentExpression(AssignmentExpression node) => new AssignmentExpression(_cloneNode(node.leftHandSide), node.operator, _cloneNode(node.rightHandSide));
+  AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(node.keyword, node.leftParenthesis, cloneNode(node.condition), node.rightParenthesis, node.semicolon);
 
   @override
-  BinaryExpression visitBinaryExpression(BinaryExpression node) => new BinaryExpression(_cloneNode(node.leftOperand), node.operator, _cloneNode(node.rightOperand));
+  AssignmentExpression visitAssignmentExpression(AssignmentExpression node) => new AssignmentExpression(cloneNode(node.leftHandSide), node.operator, cloneNode(node.rightHandSide));
 
   @override
-  Block visitBlock(Block node) => new Block(node.leftBracket, _cloneNodeList(node.statements), node.rightBracket);
+  BinaryExpression visitBinaryExpression(BinaryExpression node) => new BinaryExpression(cloneNode(node.leftOperand), node.operator, cloneNode(node.rightOperand));
 
   @override
-  BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) => new BlockFunctionBody(_cloneNode(node.block));
+  Block visitBlock(Block node) => new Block(node.leftBracket, cloneNodeList(node.statements), node.rightBracket);
+
+  @override
+  BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) => new BlockFunctionBody(cloneNode(node.block));
 
   @override
   BooleanLiteral visitBooleanLiteral(BooleanLiteral node) => new BooleanLiteral(node.literal, node.value);
 
   @override
-  BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement(node.keyword, _cloneNode(node.label), node.semicolon);
+  BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement(node.keyword, cloneNode(node.label), node.semicolon);
 
   @override
-  CascadeExpression visitCascadeExpression(CascadeExpression node) => new CascadeExpression(_cloneNode(node.target), _cloneNodeList(node.cascadeSections));
+  CascadeExpression visitCascadeExpression(CascadeExpression node) => new CascadeExpression(cloneNode(node.target), cloneNodeList(node.cascadeSections));
 
   @override
-  CatchClause visitCatchClause(CatchClause node) => new CatchClause(node.onKeyword, _cloneNode(node.exceptionType), node.catchKeyword, node.leftParenthesis, _cloneNode(node.exceptionParameter), node.comma, _cloneNode(node.stackTraceParameter), node.rightParenthesis, _cloneNode(node.body));
+  CatchClause visitCatchClause(CatchClause node) => new CatchClause(node.onKeyword, cloneNode(node.exceptionType), node.catchKeyword, node.leftParenthesis, cloneNode(node.exceptionParameter), node.comma, cloneNode(node.stackTraceParameter), node.rightParenthesis, cloneNode(node.body));
 
   @override
   ClassDeclaration visitClassDeclaration(ClassDeclaration node) {
-    ClassDeclaration copy = new ClassDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.abstractKeyword, node.classKeyword, _cloneNode(node.name), _cloneNode(node.typeParameters), _cloneNode(node.extendsClause), _cloneNode(node.withClause), _cloneNode(node.implementsClause), node.leftBracket, _cloneNodeList(node.members), node.rightBracket);
-    copy.nativeClause = _cloneNode(node.nativeClause);
+    ClassDeclaration copy = new ClassDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.abstractKeyword, node.classKeyword, cloneNode(node.name), cloneNode(node.typeParameters), cloneNode(node.extendsClause), cloneNode(node.withClause), cloneNode(node.implementsClause), node.leftBracket, cloneNodeList(node.members), node.rightBracket);
+    copy.nativeClause = cloneNode(node.nativeClause);
     return copy;
   }
 
   @override
-  ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.name), _cloneNode(node.typeParameters), node.equals, node.abstractKeyword, _cloneNode(node.superclass), _cloneNode(node.withClause), _cloneNode(node.implementsClause), node.semicolon);
+  ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.name), cloneNode(node.typeParameters), node.equals, node.abstractKeyword, cloneNode(node.superclass), cloneNode(node.withClause), cloneNode(node.implementsClause), node.semicolon);
 
   @override
   Comment visitComment(Comment node) {
     if (node.isDocumentation) {
-      return Comment.createDocumentationCommentWithReferences(node.tokens, _cloneNodeList(node.references));
+      return Comment.createDocumentationCommentWithReferences(node.tokens, cloneNodeList(node.references));
     } else if (node.isBlock) {
       return Comment.createBlockComment(node.tokens);
     }
@@ -1009,38 +1032,38 @@
   }
 
   @override
-  CommentReference visitCommentReference(CommentReference node) => new CommentReference(node.newKeyword, _cloneNode(node.identifier));
+  CommentReference visitCommentReference(CommentReference node) => new CommentReference(node.newKeyword, cloneNode(node.identifier));
 
   @override
   CompilationUnit visitCompilationUnit(CompilationUnit node) {
-    CompilationUnit clone = new CompilationUnit(node.beginToken, _cloneNode(node.scriptTag), _cloneNodeList(node.directives), _cloneNodeList(node.declarations), node.endToken);
+    CompilationUnit clone = new CompilationUnit(node.beginToken, cloneNode(node.scriptTag), cloneNodeList(node.directives), cloneNodeList(node.declarations), node.endToken);
     clone.lineInfo = node.lineInfo;
     return clone;
   }
 
   @override
-  ConditionalExpression visitConditionalExpression(ConditionalExpression node) => new ConditionalExpression(_cloneNode(node.condition), node.question, _cloneNode(node.thenExpression), node.colon, _cloneNode(node.elseExpression));
+  ConditionalExpression visitConditionalExpression(ConditionalExpression node) => new ConditionalExpression(cloneNode(node.condition), node.question, cloneNode(node.thenExpression), node.colon, cloneNode(node.elseExpression));
 
   @override
-  ConstructorDeclaration visitConstructorDeclaration(ConstructorDeclaration node) => new ConstructorDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.externalKeyword, node.constKeyword, node.factoryKeyword, _cloneNode(node.returnType), node.period, _cloneNode(node.name), _cloneNode(node.parameters), node.separator, _cloneNodeList(node.initializers), _cloneNode(node.redirectedConstructor), _cloneNode(node.body));
+  ConstructorDeclaration visitConstructorDeclaration(ConstructorDeclaration node) => new ConstructorDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.externalKeyword, node.constKeyword, node.factoryKeyword, cloneNode(node.returnType), node.period, cloneNode(node.name), cloneNode(node.parameters), node.separator, cloneNodeList(node.initializers), cloneNode(node.redirectedConstructor), cloneNode(node.body));
 
   @override
-  ConstructorFieldInitializer visitConstructorFieldInitializer(ConstructorFieldInitializer node) => new ConstructorFieldInitializer(node.keyword, node.period, _cloneNode(node.fieldName), node.equals, _cloneNode(node.expression));
+  ConstructorFieldInitializer visitConstructorFieldInitializer(ConstructorFieldInitializer node) => new ConstructorFieldInitializer(node.keyword, node.period, cloneNode(node.fieldName), node.equals, cloneNode(node.expression));
 
   @override
-  ConstructorName visitConstructorName(ConstructorName node) => new ConstructorName(_cloneNode(node.type), node.period, _cloneNode(node.name));
+  ConstructorName visitConstructorName(ConstructorName node) => new ConstructorName(cloneNode(node.type), node.period, cloneNode(node.name));
 
   @override
-  ContinueStatement visitContinueStatement(ContinueStatement node) => new ContinueStatement(node.keyword, _cloneNode(node.label), node.semicolon);
+  ContinueStatement visitContinueStatement(ContinueStatement node) => new ContinueStatement(node.keyword, cloneNode(node.label), node.semicolon);
 
   @override
-  DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) => new DeclaredIdentifier(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), _cloneNode(node.identifier));
+  DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) => new DeclaredIdentifier(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.type), cloneNode(node.identifier));
 
   @override
-  DefaultFormalParameter visitDefaultFormalParameter(DefaultFormalParameter node) => new DefaultFormalParameter(_cloneNode(node.parameter), node.kind, node.separator, _cloneNode(node.defaultValue));
+  DefaultFormalParameter visitDefaultFormalParameter(DefaultFormalParameter node) => new DefaultFormalParameter(cloneNode(node.parameter), node.kind, node.separator, cloneNode(node.defaultValue));
 
   @override
-  DoStatement visitDoStatement(DoStatement node) => new DoStatement(node.doKeyword, _cloneNode(node.body), node.whileKeyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, node.semicolon);
+  DoStatement visitDoStatement(DoStatement node) => new DoStatement(node.doKeyword, cloneNode(node.body), node.whileKeyword, node.leftParenthesis, cloneNode(node.condition), node.rightParenthesis, node.semicolon);
 
   @override
   DoubleLiteral visitDoubleLiteral(DoubleLiteral node) => new DoubleLiteral(node.literal, node.value);
@@ -1053,72 +1076,72 @@
 
   @override
   ExportDirective visitExportDirective(ExportDirective node) {
-    ExportDirective directive = new ExportDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.uri), _cloneNodeList(node.combinators), node.semicolon);
+    ExportDirective directive = new ExportDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.uri), cloneNodeList(node.combinators), node.semicolon);
     directive.source = node.source;
     directive.uriContent = node.uriContent;
     return directive;
   }
 
   @override
-  ExpressionFunctionBody visitExpressionFunctionBody(ExpressionFunctionBody node) => new ExpressionFunctionBody(node.functionDefinition, _cloneNode(node.expression), node.semicolon);
+  ExpressionFunctionBody visitExpressionFunctionBody(ExpressionFunctionBody node) => new ExpressionFunctionBody(node.functionDefinition, cloneNode(node.expression), node.semicolon);
 
   @override
-  ExpressionStatement visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement(_cloneNode(node.expression), node.semicolon);
+  ExpressionStatement visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement(cloneNode(node.expression), node.semicolon);
 
   @override
-  ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause(node.keyword, _cloneNode(node.superclass));
+  ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause(node.keyword, cloneNode(node.superclass));
 
   @override
-  FieldDeclaration visitFieldDeclaration(FieldDeclaration node) => new FieldDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.staticKeyword, _cloneNode(node.fields), node.semicolon);
+  FieldDeclaration visitFieldDeclaration(FieldDeclaration node) => new FieldDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.staticKeyword, cloneNode(node.fields), node.semicolon);
 
   @override
-  FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) => new FieldFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), node.thisToken, node.period, _cloneNode(node.identifier), _cloneNode(node.parameters));
+  FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) => new FieldFormalParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.type), node.thisToken, node.period, cloneNode(node.identifier), cloneNode(node.parameters));
 
   @override
   ForEachStatement visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     if (loopVariable == null) {
-      return new ForEachStatement.con2(node.forKeyword, node.leftParenthesis, _cloneNode(node.identifier), node.inKeyword, _cloneNode(node.iterator), node.rightParenthesis, _cloneNode(node.body));
+      return new ForEachStatement.con2(node.forKeyword, node.leftParenthesis, cloneNode(node.identifier), node.inKeyword, cloneNode(node.iterator), node.rightParenthesis, cloneNode(node.body));
     }
-    return new ForEachStatement.con1(node.forKeyword, node.leftParenthesis, _cloneNode(loopVariable), node.inKeyword, _cloneNode(node.iterator), node.rightParenthesis, _cloneNode(node.body));
+    return new ForEachStatement.con1(node.forKeyword, node.leftParenthesis, cloneNode(loopVariable), node.inKeyword, cloneNode(node.iterator), node.rightParenthesis, cloneNode(node.body));
   }
 
   @override
-  FormalParameterList visitFormalParameterList(FormalParameterList node) => new FormalParameterList(node.leftParenthesis, _cloneNodeList(node.parameters), node.leftDelimiter, node.rightDelimiter, node.rightParenthesis);
+  FormalParameterList visitFormalParameterList(FormalParameterList node) => new FormalParameterList(node.leftParenthesis, cloneNodeList(node.parameters), node.leftDelimiter, node.rightDelimiter, node.rightParenthesis);
 
   @override
-  ForStatement visitForStatement(ForStatement node) => new ForStatement(node.forKeyword, node.leftParenthesis, _cloneNode(node.variables), _cloneNode(node.initialization), node.leftSeparator, _cloneNode(node.condition), node.rightSeparator, _cloneNodeList(node.updaters), node.rightParenthesis, _cloneNode(node.body));
+  ForStatement visitForStatement(ForStatement node) => new ForStatement(node.forKeyword, node.leftParenthesis, cloneNode(node.variables), cloneNode(node.initialization), node.leftSeparator, cloneNode(node.condition), node.rightSeparator, cloneNodeList(node.updaters), node.rightParenthesis, cloneNode(node.body));
 
   @override
-  FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.externalKeyword, _cloneNode(node.returnType), node.propertyKeyword, _cloneNode(node.name), _cloneNode(node.functionExpression));
+  FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.externalKeyword, cloneNode(node.returnType), node.propertyKeyword, cloneNode(node.name), cloneNode(node.functionExpression));
 
   @override
-  FunctionDeclarationStatement visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => new FunctionDeclarationStatement(_cloneNode(node.functionDeclaration));
+  FunctionDeclarationStatement visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => new FunctionDeclarationStatement(cloneNode(node.functionDeclaration));
 
   @override
-  FunctionExpression visitFunctionExpression(FunctionExpression node) => new FunctionExpression(_cloneNode(node.parameters), _cloneNode(node.body));
+  FunctionExpression visitFunctionExpression(FunctionExpression node) => new FunctionExpression(cloneNode(node.parameters), cloneNode(node.body));
 
   @override
-  FunctionExpressionInvocation visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => new FunctionExpressionInvocation(_cloneNode(node.function), _cloneNode(node.argumentList));
+  FunctionExpressionInvocation visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => new FunctionExpressionInvocation(cloneNode(node.function), cloneNode(node.argumentList));
 
   @override
-  FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) => new FunctionTypeAlias(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.returnType), _cloneNode(node.name), _cloneNode(node.typeParameters), _cloneNode(node.parameters), node.semicolon);
+  FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) => new FunctionTypeAlias(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.returnType), cloneNode(node.name), cloneNode(node.typeParameters), cloneNode(node.parameters), node.semicolon);
 
   @override
-  FunctionTypedFormalParameter visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => new FunctionTypedFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.returnType), _cloneNode(node.identifier), _cloneNode(node.parameters));
+  FunctionTypedFormalParameter visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => new FunctionTypedFormalParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), cloneNode(node.returnType), cloneNode(node.identifier), cloneNode(node.parameters));
 
   @override
-  HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator(node.keyword, _cloneNodeList(node.hiddenNames));
+  HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator(node.keyword, cloneNodeList(node.hiddenNames));
 
   @override
-  IfStatement visitIfStatement(IfStatement node) => new IfStatement(node.ifKeyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, _cloneNode(node.thenStatement), node.elseKeyword, _cloneNode(node.elseStatement));
+  IfStatement visitIfStatement(IfStatement node) => new IfStatement(node.ifKeyword, node.leftParenthesis, cloneNode(node.condition), node.rightParenthesis, cloneNode(node.thenStatement), node.elseKeyword, cloneNode(node.elseStatement));
 
   @override
-  ImplementsClause visitImplementsClause(ImplementsClause node) => new ImplementsClause(node.keyword, _cloneNodeList(node.interfaces));
+  ImplementsClause visitImplementsClause(ImplementsClause node) => new ImplementsClause(node.keyword, cloneNodeList(node.interfaces));
 
   @override
   ImportDirective visitImportDirective(ImportDirective node) {
-    ImportDirective directive = new ImportDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.uri), node.deferredToken, node.asToken, _cloneNode(node.prefix), _cloneNodeList(node.combinators), node.semicolon);
+    ImportDirective directive = new ImportDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.uri), node.deferredToken, node.asToken, cloneNode(node.prefix), cloneNodeList(node.combinators), node.semicolon);
     directive.source = node.source;
     directive.uriContent = node.uriContent;
     return directive;
@@ -1128,109 +1151,109 @@
   IndexExpression visitIndexExpression(IndexExpression node) {
     Token period = node.period;
     if (period == null) {
-      return new IndexExpression.forTarget(_cloneNode(node.target), node.leftBracket, _cloneNode(node.index), node.rightBracket);
+      return new IndexExpression.forTarget(cloneNode(node.target), node.leftBracket, cloneNode(node.index), node.rightBracket);
     } else {
-      return new IndexExpression.forCascade(period, node.leftBracket, _cloneNode(node.index), node.rightBracket);
+      return new IndexExpression.forCascade(period, node.leftBracket, cloneNode(node.index), node.rightBracket);
     }
   }
 
   @override
-  InstanceCreationExpression visitInstanceCreationExpression(InstanceCreationExpression node) => new InstanceCreationExpression(node.keyword, _cloneNode(node.constructorName), _cloneNode(node.argumentList));
+  InstanceCreationExpression visitInstanceCreationExpression(InstanceCreationExpression node) => new InstanceCreationExpression(node.keyword, cloneNode(node.constructorName), cloneNode(node.argumentList));
 
   @override
   IntegerLiteral visitIntegerLiteral(IntegerLiteral node) => new IntegerLiteral(node.literal, node.value);
 
   @override
-  InterpolationExpression visitInterpolationExpression(InterpolationExpression node) => new InterpolationExpression(node.leftBracket, _cloneNode(node.expression), node.rightBracket);
+  InterpolationExpression visitInterpolationExpression(InterpolationExpression node) => new InterpolationExpression(node.leftBracket, cloneNode(node.expression), node.rightBracket);
 
   @override
   InterpolationString visitInterpolationString(InterpolationString node) => new InterpolationString(node.contents, node.value);
 
   @override
-  IsExpression visitIsExpression(IsExpression node) => new IsExpression(_cloneNode(node.expression), node.isOperator, node.notOperator, _cloneNode(node.type));
+  IsExpression visitIsExpression(IsExpression node) => new IsExpression(cloneNode(node.expression), node.isOperator, node.notOperator, cloneNode(node.type));
 
   @override
-  Label visitLabel(Label node) => new Label(_cloneNode(node.label), node.colon);
+  Label visitLabel(Label node) => new Label(cloneNode(node.label), node.colon);
 
   @override
-  LabeledStatement visitLabeledStatement(LabeledStatement node) => new LabeledStatement(_cloneNodeList(node.labels), _cloneNode(node.statement));
+  LabeledStatement visitLabeledStatement(LabeledStatement node) => new LabeledStatement(cloneNodeList(node.labels), cloneNode(node.statement));
 
   @override
-  LibraryDirective visitLibraryDirective(LibraryDirective node) => new LibraryDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.libraryToken, _cloneNode(node.name), node.semicolon);
+  LibraryDirective visitLibraryDirective(LibraryDirective node) => new LibraryDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.libraryToken, cloneNode(node.name), node.semicolon);
 
   @override
-  LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) => new LibraryIdentifier(_cloneNodeList(node.components));
+  LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) => new LibraryIdentifier(cloneNodeList(node.components));
 
   @override
-  ListLiteral visitListLiteral(ListLiteral node) => new ListLiteral(node.constKeyword, _cloneNode(node.typeArguments), node.leftBracket, _cloneNodeList(node.elements), node.rightBracket);
+  ListLiteral visitListLiteral(ListLiteral node) => new ListLiteral(node.constKeyword, cloneNode(node.typeArguments), node.leftBracket, cloneNodeList(node.elements), node.rightBracket);
 
   @override
-  MapLiteral visitMapLiteral(MapLiteral node) => new MapLiteral(node.constKeyword, _cloneNode(node.typeArguments), node.leftBracket, _cloneNodeList(node.entries), node.rightBracket);
+  MapLiteral visitMapLiteral(MapLiteral node) => new MapLiteral(node.constKeyword, cloneNode(node.typeArguments), node.leftBracket, cloneNodeList(node.entries), node.rightBracket);
 
   @override
-  MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) => new MapLiteralEntry(_cloneNode(node.key), node.separator, _cloneNode(node.value));
+  MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) => new MapLiteralEntry(cloneNode(node.key), node.separator, cloneNode(node.value));
 
   @override
-  MethodDeclaration visitMethodDeclaration(MethodDeclaration node) => new MethodDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.externalKeyword, node.modifierKeyword, _cloneNode(node.returnType), node.propertyKeyword, node.operatorKeyword, _cloneNode(node.name), _cloneNode(node.parameters), _cloneNode(node.body));
+  MethodDeclaration visitMethodDeclaration(MethodDeclaration node) => new MethodDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.externalKeyword, node.modifierKeyword, cloneNode(node.returnType), node.propertyKeyword, node.operatorKeyword, cloneNode(node.name), cloneNode(node.parameters), cloneNode(node.body));
 
   @override
-  MethodInvocation visitMethodInvocation(MethodInvocation node) => new MethodInvocation(_cloneNode(node.target), node.period, _cloneNode(node.methodName), _cloneNode(node.argumentList));
+  MethodInvocation visitMethodInvocation(MethodInvocation node) => new MethodInvocation(cloneNode(node.target), node.period, cloneNode(node.methodName), cloneNode(node.argumentList));
 
   @override
-  NamedExpression visitNamedExpression(NamedExpression node) => new NamedExpression(_cloneNode(node.name), _cloneNode(node.expression));
+  NamedExpression visitNamedExpression(NamedExpression node) => new NamedExpression(cloneNode(node.name), cloneNode(node.expression));
 
   @override
-  AstNode visitNativeClause(NativeClause node) => new NativeClause(node.keyword, _cloneNode(node.name));
+  AstNode visitNativeClause(NativeClause node) => new NativeClause(node.keyword, cloneNode(node.name));
 
   @override
-  NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) => new NativeFunctionBody(node.nativeToken, _cloneNode(node.stringLiteral), node.semicolon);
+  NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) => new NativeFunctionBody(node.nativeToken, cloneNode(node.stringLiteral), node.semicolon);
 
   @override
   NullLiteral visitNullLiteral(NullLiteral node) => new NullLiteral(node.literal);
 
   @override
-  ParenthesizedExpression visitParenthesizedExpression(ParenthesizedExpression node) => new ParenthesizedExpression(node.leftParenthesis, _cloneNode(node.expression), node.rightParenthesis);
+  ParenthesizedExpression visitParenthesizedExpression(ParenthesizedExpression node) => new ParenthesizedExpression(node.leftParenthesis, cloneNode(node.expression), node.rightParenthesis);
 
   @override
   PartDirective visitPartDirective(PartDirective node) {
-    PartDirective directive = new PartDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.partToken, _cloneNode(node.uri), node.semicolon);
+    PartDirective directive = new PartDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.partToken, cloneNode(node.uri), node.semicolon);
     directive.source = node.source;
     directive.uriContent = node.uriContent;
     return directive;
   }
 
   @override
-  PartOfDirective visitPartOfDirective(PartOfDirective node) => new PartOfDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.partToken, node.ofToken, _cloneNode(node.libraryName), node.semicolon);
+  PartOfDirective visitPartOfDirective(PartOfDirective node) => new PartOfDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.partToken, node.ofToken, cloneNode(node.libraryName), node.semicolon);
 
   @override
-  PostfixExpression visitPostfixExpression(PostfixExpression node) => new PostfixExpression(_cloneNode(node.operand), node.operator);
+  PostfixExpression visitPostfixExpression(PostfixExpression node) => new PostfixExpression(cloneNode(node.operand), node.operator);
 
   @override
-  PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) => new PrefixedIdentifier(_cloneNode(node.prefix), node.period, _cloneNode(node.identifier));
+  PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) => new PrefixedIdentifier(cloneNode(node.prefix), node.period, cloneNode(node.identifier));
 
   @override
-  PrefixExpression visitPrefixExpression(PrefixExpression node) => new PrefixExpression(node.operator, _cloneNode(node.operand));
+  PrefixExpression visitPrefixExpression(PrefixExpression node) => new PrefixExpression(node.operator, cloneNode(node.operand));
 
   @override
-  PropertyAccess visitPropertyAccess(PropertyAccess node) => new PropertyAccess(_cloneNode(node.target), node.operator, _cloneNode(node.propertyName));
+  PropertyAccess visitPropertyAccess(PropertyAccess node) => new PropertyAccess(cloneNode(node.target), node.operator, cloneNode(node.propertyName));
 
   @override
-  RedirectingConstructorInvocation visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => new RedirectingConstructorInvocation(node.keyword, node.period, _cloneNode(node.constructorName), _cloneNode(node.argumentList));
+  RedirectingConstructorInvocation visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => new RedirectingConstructorInvocation(node.keyword, node.period, cloneNode(node.constructorName), cloneNode(node.argumentList));
 
   @override
   RethrowExpression visitRethrowExpression(RethrowExpression node) => new RethrowExpression(node.keyword);
 
   @override
-  ReturnStatement visitReturnStatement(ReturnStatement node) => new ReturnStatement(node.keyword, _cloneNode(node.expression), node.semicolon);
+  ReturnStatement visitReturnStatement(ReturnStatement node) => new ReturnStatement(node.keyword, cloneNode(node.expression), node.semicolon);
 
   @override
   ScriptTag visitScriptTag(ScriptTag node) => new ScriptTag(node.scriptTag);
 
   @override
-  ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator(node.keyword, _cloneNodeList(node.shownNames));
+  ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator(node.keyword, cloneNodeList(node.shownNames));
 
   @override
-  SimpleFormalParameter visitSimpleFormalParameter(SimpleFormalParameter node) => new SimpleFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), _cloneNode(node.identifier));
+  SimpleFormalParameter visitSimpleFormalParameter(SimpleFormalParameter node) => new SimpleFormalParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.type), cloneNode(node.identifier));
 
   @override
   SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) => new SimpleIdentifier(node.token);
@@ -1239,22 +1262,22 @@
   SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node) => new SimpleStringLiteral(node.literal, node.value);
 
   @override
-  StringInterpolation visitStringInterpolation(StringInterpolation node) => new StringInterpolation(_cloneNodeList(node.elements));
+  StringInterpolation visitStringInterpolation(StringInterpolation node) => new StringInterpolation(cloneNodeList(node.elements));
 
   @override
-  SuperConstructorInvocation visitSuperConstructorInvocation(SuperConstructorInvocation node) => new SuperConstructorInvocation(node.keyword, node.period, _cloneNode(node.constructorName), _cloneNode(node.argumentList));
+  SuperConstructorInvocation visitSuperConstructorInvocation(SuperConstructorInvocation node) => new SuperConstructorInvocation(node.keyword, node.period, cloneNode(node.constructorName), cloneNode(node.argumentList));
 
   @override
   SuperExpression visitSuperExpression(SuperExpression node) => new SuperExpression(node.keyword);
 
   @override
-  SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase(_cloneNodeList(node.labels), node.keyword, _cloneNode(node.expression), node.colon, _cloneNodeList(node.statements));
+  SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase(cloneNodeList(node.labels), node.keyword, cloneNode(node.expression), node.colon, cloneNodeList(node.statements));
 
   @override
-  SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault(_cloneNodeList(node.labels), node.keyword, node.colon, _cloneNodeList(node.statements));
+  SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault(cloneNodeList(node.labels), node.keyword, node.colon, cloneNodeList(node.statements));
 
   @override
-  SwitchStatement visitSwitchStatement(SwitchStatement node) => new SwitchStatement(node.keyword, node.leftParenthesis, _cloneNode(node.expression), node.rightParenthesis, node.leftBracket, _cloneNodeList(node.members), node.rightBracket);
+  SwitchStatement visitSwitchStatement(SwitchStatement node) => new SwitchStatement(node.keyword, node.leftParenthesis, cloneNode(node.expression), node.rightParenthesis, node.leftBracket, cloneNodeList(node.members), node.rightBracket);
 
   @override
   SymbolLiteral visitSymbolLiteral(SymbolLiteral node) => new SymbolLiteral(node.poundSign, node.components);
@@ -1263,56 +1286,47 @@
   ThisExpression visitThisExpression(ThisExpression node) => new ThisExpression(node.keyword);
 
   @override
-  ThrowExpression visitThrowExpression(ThrowExpression node) => new ThrowExpression(node.keyword, _cloneNode(node.expression));
+  ThrowExpression visitThrowExpression(ThrowExpression node) => new ThrowExpression(node.keyword, cloneNode(node.expression));
 
   @override
-  TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.variables), node.semicolon);
+  TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), cloneNode(node.variables), node.semicolon);
 
   @override
-  TryStatement visitTryStatement(TryStatement node) => new TryStatement(node.tryKeyword, _cloneNode(node.body), _cloneNodeList(node.catchClauses), node.finallyKeyword, _cloneNode(node.finallyBlock));
+  TryStatement visitTryStatement(TryStatement node) => new TryStatement(node.tryKeyword, cloneNode(node.body), cloneNodeList(node.catchClauses), node.finallyKeyword, cloneNode(node.finallyBlock));
 
   @override
-  TypeArgumentList visitTypeArgumentList(TypeArgumentList node) => new TypeArgumentList(node.leftBracket, _cloneNodeList(node.arguments), node.rightBracket);
+  TypeArgumentList visitTypeArgumentList(TypeArgumentList node) => new TypeArgumentList(node.leftBracket, cloneNodeList(node.arguments), node.rightBracket);
 
   @override
-  TypeName visitTypeName(TypeName node) => new TypeName(_cloneNode(node.name), _cloneNode(node.typeArguments));
+  TypeName visitTypeName(TypeName node) => new TypeName(cloneNode(node.name), cloneNode(node.typeArguments));
 
   @override
-  TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.name), node.keyword, _cloneNode(node.bound));
+  TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), cloneNode(node.name), node.keyword, cloneNode(node.bound));
 
   @override
-  TypeParameterList visitTypeParameterList(TypeParameterList node) => new TypeParameterList(node.leftBracket, _cloneNodeList(node.typeParameters), node.rightBracket);
+  TypeParameterList visitTypeParameterList(TypeParameterList node) => new TypeParameterList(node.leftBracket, cloneNodeList(node.typeParameters), node.rightBracket);
 
   @override
-  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) => new VariableDeclaration(null, _cloneNodeList(node.metadata), _cloneNode(node.name), node.equals, _cloneNode(node.initializer));
+  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) => new VariableDeclaration(null, cloneNodeList(node.metadata), cloneNode(node.name), node.equals, cloneNode(node.initializer));
 
   @override
-  VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node) => new VariableDeclarationList(null, _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), _cloneNodeList(node.variables));
+  VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node) => new VariableDeclarationList(null, cloneNodeList(node.metadata), node.keyword, cloneNode(node.type), cloneNodeList(node.variables));
 
   @override
-  VariableDeclarationStatement visitVariableDeclarationStatement(VariableDeclarationStatement node) => new VariableDeclarationStatement(_cloneNode(node.variables), node.semicolon);
+  VariableDeclarationStatement visitVariableDeclarationStatement(VariableDeclarationStatement node) => new VariableDeclarationStatement(cloneNode(node.variables), node.semicolon);
 
   @override
-  WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement(node.keyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, _cloneNode(node.body));
+  WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement(node.keyword, node.leftParenthesis, cloneNode(node.condition), node.rightParenthesis, cloneNode(node.body));
 
   @override
-  WithClause visitWithClause(WithClause node) => new WithClause(node.withKeyword, _cloneNodeList(node.mixinTypes));
+  WithClause visitWithClause(WithClause node) => new WithClause(node.withKeyword, cloneNodeList(node.mixinTypes));
 
-  AstNode _cloneNode(AstNode node) {
+  AstNode cloneNode(AstNode node) {
     if (node == null) {
       return null;
     }
     return node.accept(this) as AstNode;
   }
-
-  List _cloneNodeList(NodeList nodes) {
-    int count = nodes.length;
-    List clonedNodes = new List();
-    for (int i = 0; i < count; i++) {
-      clonedNodes.add((nodes[i]).accept(this) as AstNode);
-    }
-    return clonedNodes;
-  }
 }
 
 /**
@@ -9673,6 +9687,11 @@
   ConstructorElement staticElement;
 
   /**
+   * The result of evaluating this expression, if it is constant.
+   */
+  EvaluationResultImpl _result;
+
+  /**
    * Initialize a newly created instance creation expression.
    *
    * @param keyword the keyword used to indicate how an object should be created
@@ -9700,6 +9719,15 @@
   @override
   Token get endToken => _argumentList.endToken;
 
+  /**
+   * Return the result of evaluating this constant as a compile-time constant expression, or
+   * `null` if this variable is not a 'const' expression or an error prevented the result from
+   * being computed.
+   *
+   * @return the result of evaluating this constant
+   */
+  EvaluationResultImpl get evaluationResult => _result;
+
   @override
   int get precedence => 15;
 
@@ -9719,6 +9747,16 @@
     this._argumentList = becomeParentOf(argumentList);
   }
 
+  /**
+   * Set the result of evaluating this expression as a compile-time constant expression to the given
+   * result.
+   *
+   * @param result the result of evaluating this expression
+   */
+  void set evaluationResult(EvaluationResultImpl result) {
+    this._result = result;
+  }
+
   @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(constructorName, visitor);
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index b2dd261..ef4fd68 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -112,6 +112,9 @@
   bool get isBoolNumStringOrNull => true;
 
   @override
+  bool get isUnknown => value == null;
+
+  @override
   BoolState logicalAnd(InstanceState rightOperand) {
     assertBool(rightOperand);
     if (value == null) {
@@ -204,7 +207,7 @@
   ConstantEvaluator(this._source, this._typeProvider);
 
   EvaluationResult evaluate(Expression expression) {
-    EvaluationResultImpl result = expression.accept(new ConstantVisitor(_typeProvider));
+    EvaluationResultImpl result = expression.accept(new ConstantVisitor.con1(_typeProvider));
     if (result is ValidResult) {
       return EvaluationResult.forValue(result.value);
     }
@@ -228,6 +231,37 @@
    */
   final Map<VariableElement, VariableDeclaration> variableMap = new Map<VariableElement, VariableDeclaration>();
 
+  /**
+   * A table mapping constant constructors to the declarations of those constructors.
+   */
+  final Map<ConstructorElement, ConstructorDeclaration> constructorMap = new Map<ConstructorElement, ConstructorDeclaration>();
+
+  /**
+   * A collection of constant constructor invocations.
+   */
+  final List<InstanceCreationExpression> constructorInvocations = new List<InstanceCreationExpression>();
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    super.visitConstructorDeclaration(node);
+    if (node.constKeyword != null) {
+      ConstructorElement element = node.element;
+      if (element != null) {
+        constructorMap[element] = node;
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    super.visitInstanceCreationExpression(node);
+    if (node.isConst) {
+      constructorInvocations.add(node);
+    }
+    return null;
+  }
+
   @override
   Object visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
@@ -243,124 +277,430 @@
 }
 
 /**
- * Instances of the class `ConstantValueComputer` compute the values of constant variables in
- * one or more compilation units. The expected usage pattern is for the compilation units to be
- * added to this computer using the method [add] and then for the method
- * [computeValues] to be invoked exactly once. Any use of an instance after invoking the
- * method [computeValues] will result in unpredictable behavior.
+ * Instances of the class `ConstantValueComputer` compute the values of constant variables and
+ * constant constructor invocations in one or more compilation units. The expected usage pattern is
+ * for the compilation units to be added to this computer using the method
+ * [add] and then for the method [computeValues] to be invoked
+ * exactly once. Any use of an instance after invoking the method [computeValues] will
+ * result in unpredictable behavior.
  */
 class ConstantValueComputer {
   /**
    * The type provider used to access the known types.
    */
-  final TypeProvider _typeProvider;
+  TypeProvider typeProvider;
 
   /**
-   * The object used to find constant variables in the compilation units that were added.
+   * The object used to find constant variables and constant constructor invocations in the
+   * compilation units that were added.
    */
   ConstantFinder _constantFinder = new ConstantFinder();
 
   /**
-   * A graph in which the nodes are the constant variables and the edges are from each variable to
-   * the other constant variables that are referenced in the head's initializer.
+   * A graph in which the nodes are the constants, and the edges are from each constant to the other
+   * constants that are referenced by it.
    */
-  DirectedGraph<VariableElement> _referenceGraph = new DirectedGraph<VariableElement>();
+  DirectedGraph<AstNode> referenceGraph = new DirectedGraph<AstNode>();
 
   /**
    * A table mapping constant variables to the declarations of those variables.
    */
-  Map<VariableElement, VariableDeclaration> _declarationMap;
+  Map<VariableElement, VariableDeclaration> _variableDeclarationMap;
+
+  /**
+   * A table mapping constant constructors to the declarations of those constructors.
+   */
+  Map<ConstructorElement, ConstructorDeclaration> constructorDeclarationMap;
+
+  /**
+   * A collection of constant constructor invocations.
+   */
+  List<InstanceCreationExpression> _constructorInvocations;
 
   /**
    * Initialize a newly created constant value computer.
    *
    * @param typeProvider the type provider used to access known types
    */
-  ConstantValueComputer(this._typeProvider);
+  ConstantValueComputer(TypeProvider typeProvider) {
+    this.typeProvider = typeProvider;
+  }
 
   /**
-   * Add the constant variables in the given compilation unit to the list of constant variables
-   * whose value needs to be computed.
+   * Add the constants in the given compilation unit to the list of constants whose value needs to
+   * be computed.
    *
-   * @param unit the compilation unit defining the constant variables to be added
+   * @param unit the compilation unit defining the constants to be added
    */
   void add(CompilationUnit unit) {
     unit.accept(_constantFinder);
   }
 
   /**
-   * Compute values for all of the constant variables in the compilation units that were added.
+   * Compute values for all of the constants in the compilation units that were added.
    */
   void computeValues() {
-    _declarationMap = _constantFinder.variableMap;
-    for (MapEntry<VariableElement, VariableDeclaration> entry in getMapEntrySet(_declarationMap)) {
-      VariableElement element = entry.getKey();
-      ReferenceFinder referenceFinder = new ReferenceFinder(element, _referenceGraph);
-      _referenceGraph.addNode(element);
-      entry.getValue().initializer.accept(referenceFinder);
+    _variableDeclarationMap = _constantFinder.variableMap;
+    constructorDeclarationMap = _constantFinder.constructorMap;
+    _constructorInvocations = _constantFinder.constructorInvocations;
+    for (MapEntry<VariableElement, VariableDeclaration> entry in getMapEntrySet(_variableDeclarationMap)) {
+      VariableDeclaration declaration = entry.getValue();
+      ReferenceFinder referenceFinder = new ReferenceFinder(declaration, referenceGraph, _variableDeclarationMap, constructorDeclarationMap);
+      referenceGraph.addNode(declaration);
+      declaration.initializer.accept(referenceFinder);
     }
-    while (!_referenceGraph.isEmpty) {
-      VariableElement element = _referenceGraph.removeSink();
-      while (element != null) {
-        _computeValueFor(element);
-        element = _referenceGraph.removeSink();
+    for (MapEntry<ConstructorElement, ConstructorDeclaration> entry in getMapEntrySet(constructorDeclarationMap)) {
+      ConstructorDeclaration declaration = entry.getValue();
+      ReferenceFinder referenceFinder = new ReferenceFinder(declaration, referenceGraph, _variableDeclarationMap, constructorDeclarationMap);
+      referenceGraph.addNode(declaration);
+      bool superInvocationFound = false;
+      NodeList<ConstructorInitializer> initializers = declaration.initializers;
+      for (ConstructorInitializer initializer in initializers) {
+        if (initializer is SuperConstructorInvocation) {
+          superInvocationFound = true;
+        }
+        initializer.accept(referenceFinder);
       }
-      if (!_referenceGraph.isEmpty) {
-        List<VariableElement> variablesInCycle = _referenceGraph.findCycle();
-        if (variablesInCycle == null) {
-          //
-          // This should not happen. Either the graph should be empty, or there should be at least
-          // one sink, or there should be a cycle. If this does happen we exit to prevent an
-          // infinite loop.
-          //
-          AnalysisEngine.instance.logger.logError("Exiting constant value computer with ${_referenceGraph.nodeCount} variables that are neither sinks nor in a cycle");
-          return;
+      if (!superInvocationFound) {
+        // No explicit superconstructor invocation found, so we need to manually insert
+        // a reference to the implicit superconstructor.
+        InterfaceType superclass = (entry.getKey().returnType as InterfaceType).superclass;
+        if (superclass != null && !superclass.isObject) {
+          ConstructorElement unnamedConstructor = superclass.element.unnamedConstructor;
+          ConstructorDeclaration superConstructorDeclaration = findConstructorDeclaration(unnamedConstructor);
+          if (superConstructorDeclaration != null) {
+            referenceGraph.addEdge(declaration, superConstructorDeclaration);
+          }
         }
-        for (VariableElement variable in variablesInCycle) {
-          _generateCycleError(variablesInCycle, variable);
+      }
+      for (FormalParameter parameter in declaration.parameters.parameters) {
+        referenceGraph.addNode(parameter);
+        referenceGraph.addEdge(declaration, parameter);
+        if (parameter is DefaultFormalParameter) {
+          Expression defaultValue = parameter.defaultValue;
+          if (defaultValue != null) {
+            ReferenceFinder parameterReferenceFinder = new ReferenceFinder(parameter, referenceGraph, _variableDeclarationMap, constructorDeclarationMap);
+            defaultValue.accept(parameterReferenceFinder);
+          }
         }
-        _referenceGraph.removeAllNodes(variablesInCycle);
+      }
+    }
+    for (InstanceCreationExpression expression in _constructorInvocations) {
+      referenceGraph.addNode(expression);
+      ConstructorElement constructor = expression.staticElement;
+      if (constructor == null) {
+        break;
+      }
+      constructor = _followConstantRedirectionChain(constructor);
+      ConstructorDeclaration declaration = findConstructorDeclaration(constructor);
+      // An instance creation expression depends both on the constructor and the arguments passed
+      // to it.
+      ReferenceFinder referenceFinder = new ReferenceFinder(expression, referenceGraph, _variableDeclarationMap, constructorDeclarationMap);
+      if (declaration != null) {
+        referenceGraph.addEdge(expression, declaration);
+      }
+      expression.argumentList.accept(referenceFinder);
+    }
+    List<List<AstNode>> topologicalSort = referenceGraph.computeTopologicalSort();
+    for (List<AstNode> constantsInCycle in topologicalSort) {
+      if (constantsInCycle.length == 1) {
+        _computeValueFor(constantsInCycle[0]);
+      } else {
+        for (AstNode constant in constantsInCycle) {
+          _generateCycleError(constantsInCycle, constant);
+        }
       }
     }
   }
 
   /**
-   * Compute a value for the given variable.
-   *
-   * @param variable the variable for which a value is to be computed
+   * This method is called just before computing the constant value associated with an AST node.
+   * Unit tests will override this method to introduce additional error checking.
    */
-  void _computeValueFor(VariableElement variable) {
-    VariableDeclaration declaration = _declarationMap[variable];
-    if (declaration == null) {
-      //
-      // The declaration will be null when the variable was added to the graph as a result of being
-      // referenced by another variable but is not defined in the compilation units that were added
-      // to this computer. In such cases, the variable should already have a value associated with
-      // it, but we don't bother to check because there's nothing we can do about it at this point.
-      //
+  void beforeComputeValue(AstNode constNode) {
+  }
+
+  /**
+   * This method is called just before getting the constant initializers associated with a
+   * constructor AST node. Unit tests will override this method to introduce additional error
+   * checking.
+   */
+  void beforeGetConstantInitializers(ConstructorElement constructor) {
+  }
+
+  /**
+   * This method is called just before getting a parameter's default value. Unit tests will override
+   * this method to introduce additional error checking.
+   */
+  void beforeGetParameterDefault(ParameterElement parameter) {
+  }
+
+  /**
+   * Create the ConstantVisitor used to evaluate constants. Unit tests will override this method to
+   * introduce additional error checking.
+   */
+  ConstantVisitor createConstantVisitor() => new ConstantVisitor.con1(typeProvider);
+
+  ConstructorDeclaration findConstructorDeclaration(ConstructorElement constructor) => constructorDeclarationMap[_getConstructorBase(constructor)];
+
+  /**
+   * Compute a value for the given constant.
+   *
+   * @param constNode the constant for which a value is to be computed
+   */
+  void _computeValueFor(AstNode constNode) {
+    beforeComputeValue(constNode);
+    if (constNode is VariableDeclaration) {
+      VariableDeclaration declaration = constNode;
+      Element element = declaration.element;
+      EvaluationResultImpl result = declaration.initializer.accept(createConstantVisitor());
+      (element as VariableElementImpl).evaluationResult = result;
+    } else if (constNode is InstanceCreationExpression) {
+      InstanceCreationExpression expression = constNode;
+      ConstructorElement constructor = expression.staticElement;
+      if (constructor == null) {
+        // Couldn't resolve the constructor so we can't compute a value.  No problem--the error
+        // has already been reported.
+        return;
+      }
+      ConstantVisitor constantVisitor = createConstantVisitor();
+      ValidResult result = _evaluateConstructorCall(expression.argumentList.arguments, constructor, constantVisitor);
+      expression.evaluationResult = result;
+    } else if (constNode is ConstructorDeclaration) {
+      ConstructorDeclaration declaration = constNode;
+      NodeList<ConstructorInitializer> initializers = declaration.initializers;
+      ConstructorElementImpl constructor = declaration.element as ConstructorElementImpl;
+      constructor.constantInitializers = new ConstantValueComputer_InitializerCloner().cloneNodeList(initializers);
+    } else if (constNode is FormalParameter) {
+      if (constNode is DefaultFormalParameter) {
+        DefaultFormalParameter parameter = constNode;
+        ParameterElement element = parameter.element;
+        Expression defaultValue = parameter.defaultValue;
+        if (defaultValue != null) {
+          EvaluationResultImpl result = defaultValue.accept(createConstantVisitor());
+          (element as ParameterElementImpl).evaluationResult = result;
+        }
+      }
+    } else {
+      // Should not happen.
+      AnalysisEngine.instance.logger.logError("Constant value computer trying to compute the value of a node which is not a VariableDeclaration, InstanceCreationExpression, FormalParameter, or ConstructorDeclaration");
       return;
     }
-    EvaluationResultImpl result = declaration.initializer.accept(new ConstantVisitor(_typeProvider));
-    (variable as VariableElementImpl).evaluationResult = result;
-    if (result is ErrorResult) {
-      List<AnalysisError> errors = new List<AnalysisError>();
-      for (ErrorResult_ErrorData data in result.errorData) {
-        AstNode node = data.node;
-        Source source = variable.getAncestor((element) => element is CompilationUnitElement).source;
-        errors.add(new AnalysisError.con2(source, node.offset, node.length, data.errorCode, []));
+  }
+
+  ValidResult _evaluateConstructorCall(NodeList<Expression> arguments, ConstructorElement constructor, ConstantVisitor constantVisitor) {
+    int argumentCount = arguments.length;
+    List<DartObjectImpl> argumentValues = new List<DartObjectImpl>(argumentCount);
+    Map<String, DartObjectImpl> namedArgumentValues = new Map<String, DartObjectImpl>();
+    for (int i = 0; i < argumentCount; i++) {
+      Expression argument = arguments[i];
+      if (argument is NamedExpression) {
+        NamedExpression namedExpression = argument;
+        String name = namedExpression.name.label.name;
+        namedArgumentValues[name] = constantVisitor._valueOf(namedExpression.expression);
+        argumentValues[i] = constantVisitor.null2;
+      } else {
+        argumentValues[i] = constantVisitor._valueOf(argument);
       }
     }
+    constructor = _followConstantRedirectionChain(constructor);
+    InterfaceType definingClass = constructor.returnType as InterfaceType;
+    if (constructor.isFactory) {
+      // We couldn't find a non-factory constructor.  See if it's because we reached an external
+      // const factory constructor that we can emulate.
+      // TODO(paulberry): if the constructor is one of {bool,int,String}.fromEnvironment(),
+      // we may be able to infer the value based on -D flags provided to the analyzer (see
+      // dartbug.com/17234).
+      if (identical(definingClass, typeProvider.symbolType) && argumentCount == 1) {
+        String argumentValue = argumentValues[0].stringValue;
+        if (argumentValue != null) {
+          return constantVisitor._valid(definingClass, new SymbolState(argumentValue));
+        }
+      }
+      // Either it's an external const factory constructor that we can't emulate, or an error
+      // occurred (a cycle, or a const constructor trying to delegate to a non-const constructor).
+      // In the former case, the best we can do is consider it an unknown value.  In the latter
+      // case, the error has already been reported, so considering it an unknown value will
+      // suppress further errors.
+      return constantVisitor._validWithUnknownValue(definingClass);
+    }
+    beforeGetConstantInitializers(constructor);
+    ConstructorElementImpl constructorBase = _getConstructorBase(constructor) as ConstructorElementImpl;
+    List<ConstructorInitializer> initializers = constructorBase.constantInitializers;
+    if (initializers == null) {
+      // This can happen in some cases where there are compile errors in the code being analyzed
+      // (for example if the code is trying to create a const instance using a non-const
+      // constructor, or the node we're visiting is involved in a cycle).  The error has already
+      // been reported, so consider it an unknown value to suppress further errors.
+      return constantVisitor._validWithUnknownValue(definingClass);
+    }
+    Map<String, DartObjectImpl> fieldMap = new Map<String, DartObjectImpl>();
+    Map<String, DartObjectImpl> parameterMap = new Map<String, DartObjectImpl>();
+    List<ParameterElement> parameters = constructorBase.parameters;
+    int parameterCount = parameters.length;
+    for (int i = 0; i < parameterCount; i++) {
+      ParameterElement parameter = parameters[i];
+      while (parameter is ParameterMember) {
+        parameter = (parameter as ParameterMember).baseElement;
+      }
+      DartObjectImpl argumentValue = null;
+      if (parameter.parameterKind == ParameterKind.NAMED) {
+        argumentValue = namedArgumentValues[parameter.name];
+      } else if (i < argumentCount) {
+        argumentValue = argumentValues[i];
+      }
+      if (argumentValue == null && parameter is ParameterElementImpl) {
+        // The parameter is an optional positional parameter for which no value was provided, so
+        // use the default value.
+        beforeGetParameterDefault(parameter);
+        EvaluationResultImpl evaluationResult = (parameter as ParameterElementImpl).evaluationResult;
+        if (evaluationResult is ValidResult) {
+          argumentValue = evaluationResult.value;
+        } else if (evaluationResult == null) {
+          // No default was provided, so the default value is null.
+          argumentValue = constantVisitor.null2;
+        }
+      }
+      if (argumentValue != null) {
+        if (parameter.isInitializingFormal) {
+          FieldElement field = (parameter as FieldFormalParameterElement).field;
+          if (field != null) {
+            String fieldName = field.name;
+            fieldMap[fieldName] = argumentValue;
+          }
+        } else {
+          String name = parameter.name;
+          parameterMap[name] = argumentValue;
+        }
+      }
+    }
+    ConstantVisitor initializerVisitor = new ConstantVisitor.con2(typeProvider, parameterMap);
+    String superName = null;
+    NodeList<Expression> superArguments = null;
+    for (ConstructorInitializer initializer in initializers) {
+      if (initializer is ConstructorFieldInitializer) {
+        ConstructorFieldInitializer constructorFieldInitializer = initializer;
+        Expression initializerExpression = constructorFieldInitializer.expression;
+        EvaluationResultImpl evaluationResult = initializerExpression.accept(initializerVisitor);
+        if (evaluationResult is ValidResult) {
+          DartObjectImpl value = evaluationResult.value;
+          String fieldName = constructorFieldInitializer.fieldName.name;
+          fieldMap[fieldName] = value;
+        }
+      } else if (initializer is SuperConstructorInvocation) {
+        SuperConstructorInvocation superConstructorInvocation = initializer;
+        SimpleIdentifier name = superConstructorInvocation.constructorName;
+        if (name != null) {
+          superName = name.name;
+        }
+        superArguments = superConstructorInvocation.argumentList.arguments;
+      }
+    }
+    // Evaluate explicit or implicit call to super().
+    InterfaceType superclass = definingClass.superclass;
+    if (superclass != null && !superclass.isObject) {
+      ConstructorElement superConstructor = superclass.lookUpConstructor(superName, constructor.library);
+      if (superConstructor != null) {
+        if (superArguments == null) {
+          superArguments = new NodeList<Expression>(null);
+        }
+        _evaluateSuperConstructorCall(fieldMap, superConstructor, superArguments, initializerVisitor);
+      }
+    }
+    return constantVisitor._valid(definingClass, new GenericState(fieldMap));
+  }
+
+  void _evaluateSuperConstructorCall(Map<String, DartObjectImpl> fieldMap, ConstructorElement superConstructor, NodeList<Expression> superArguments, ConstantVisitor initializerVisitor) {
+    if (superConstructor != null && superConstructor.isConst) {
+      ValidResult evaluationResult = _evaluateConstructorCall(superArguments, superConstructor, initializerVisitor);
+      fieldMap[GenericState.SUPERCLASS_FIELD] = evaluationResult.value;
+    }
   }
 
   /**
-   * Generate an error indicating that the given variable is not a valid compile-time constant
-   * because it references at least one of the variables in the given cycle, each of which directly
-   * or indirectly references the variable.
+   * Attempt to follow the chain of factory redirections until a constructor is reached which is not
+   * a const factory constructor.
    *
-   * @param variablesInCycle the variables in the cycle that includes the given variable
-   * @param variable the variable that is not a valid compile-time constant
+   * @return the constant constructor which terminates the chain of factory redirections, if the
+   *         chain terminates. If there is a problem (e.g. a redirection can't be found, or a cycle
+   *         is encountered), the chain will be followed as far as possible and then a const factory
+   *         constructor will be returned.
    */
-  void _generateCycleError(List<VariableElement> variablesInCycle, VariableElement variable) {
+  ConstructorElement _followConstantRedirectionChain(ConstructorElement constructor) {
+    Set<ConstructorElement> constructorsVisited = new Set<ConstructorElement>();
+    while (constructor.isFactory) {
+      if (identical(constructor.enclosingElement.type, typeProvider.symbolType)) {
+        // The dart:core.Symbol has a const factory constructor that redirects to
+        // dart:_internal.Symbol.  That in turn redirects to an external const constructor, which
+        // we won't be able to evaluate.  So stop following the chain of redirections at
+        // dart:core.Symbol, and let [evaluateInstanceCreationExpression] handle it specially.
+        break;
+      }
+      constructorsVisited.add(constructor);
+      ConstructorElement redirectedConstructor = constructor.redirectedConstructor;
+      if (redirectedConstructor == null) {
+        // This can happen if constructor is an external factory constructor.
+        break;
+      }
+      if (!redirectedConstructor.isConst) {
+        // Delegating to a non-const constructor--this is not allowed (and
+        // is checked elsewhere--see [ErrorVerifier.checkForRedirectToNonConstConstructor()]).
+        break;
+      }
+      if (constructorsVisited.contains(redirectedConstructor)) {
+        // Cycle in redirecting factory constructors--this is not allowed
+        // and is checked elsewhere--see [ErrorVerifier.checkForRecursiveFactoryRedirect()]).
+        break;
+      }
+      constructor = redirectedConstructor;
+    }
+    return constructor;
+  }
+
+  /**
+   * Generate an error indicating that the given constant is not a valid compile-time constant
+   * because it references at least one of the constants in the given cycle, each of which directly
+   * or indirectly references the constant.
+   *
+   * @param constantsInCycle the constants in the cycle that includes the given constant
+   * @param constant the constant that is not a valid compile-time constant
+   */
+  void _generateCycleError(List<AstNode> constantsInCycle, AstNode constant) {
+  }
+
+  ConstructorElement _getConstructorBase(ConstructorElement constructor) {
+    while (constructor is ConstructorMember) {
+      constructor = (constructor as ConstructorMember).baseElement;
+    }
+    return constructor;
+  }
+}
+
+/**
+ * [AstCloner] that copies the necessary information from the AST to allow const constructor
+ * initializers to be evaluated.
+ */
+class ConstantValueComputer_InitializerCloner extends AstCloner {
+  @override
+  InstanceCreationExpression visitInstanceCreationExpression(InstanceCreationExpression node) {
+    // All we need is the evaluation result, and the keyword so that we know whether it's const.
+    InstanceCreationExpression expression = new InstanceCreationExpression(node.keyword, null, null);
+    expression.evaluationResult = node.evaluationResult;
+    return expression;
+  }
+
+  @override
+  SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) {
+    SimpleIdentifier identifier = super.visitSimpleIdentifier(node);
+    identifier.staticElement = node.staticElement;
+    return identifier;
+  }
+
+  @override
+  SuperConstructorInvocation visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    SuperConstructorInvocation invocation = super.visitSuperConstructorInvocation(node);
+    invocation.staticElement = node.staticElement;
+    return invocation;
   }
 }
 
@@ -418,12 +758,29 @@
    */
   DartObjectImpl _nullObject;
 
+  Map<String, DartObjectImpl> _lexicalEnvironment;
+
   /**
    * Initialize a newly created constant visitor.
    *
    * @param typeProvider the type provider used to access known types
+   * @param lexicalEnvironment values which should override simpleIdentifiers, or null if no
+   *          overriding is necessary.
    */
-  ConstantVisitor(this._typeProvider);
+  ConstantVisitor.con1(this._typeProvider) {
+    this._lexicalEnvironment = null;
+  }
+
+  /**
+   * Initialize a newly created constant visitor.
+   *
+   * @param typeProvider the type provider used to access known types
+   * @param lexicalEnvironment values which should override simpleIdentifiers, or null if no
+   *          overriding is necessary.
+   */
+  ConstantVisitor.con2(this._typeProvider, Map<String, DartObjectImpl> lexicalEnvironment) {
+    this._lexicalEnvironment = lexicalEnvironment;
+  }
 
   @override
   EvaluationResultImpl visitAdjacentStrings(AdjacentStrings node) {
@@ -539,57 +896,10 @@
       // TODO(brianwilkerson) Figure out which error to report.
       return _error(node, null);
     }
-    ConstructorElement constructor = node.staticElement;
-    if (constructor != null && constructor.isConst) {
-      NodeList<Expression> arguments = node.argumentList.arguments;
-      int argumentCount = arguments.length;
-      List<DartObjectImpl> argumentValues = new List<DartObjectImpl>(argumentCount);
-      Map<String, DartObjectImpl> namedArgumentValues = new Map<String, DartObjectImpl>();
-      for (int i = 0; i < argumentCount; i++) {
-        Expression argument = arguments[i];
-        if (argument is NamedExpression) {
-          NamedExpression namedExpression = argument;
-          String name = namedExpression.name.label.name;
-          namedArgumentValues[name] = _valueOf(namedExpression.expression);
-          argumentValues[i] = null2;
-        } else {
-          argumentValues[i] = _valueOf(argument);
-        }
-      }
-      InterfaceType definingClass = constructor.returnType as InterfaceType;
-      if (definingClass.element.library.isDartCore) {
-        String className = definingClass.name;
-        if (className == "Symbol" && argumentCount == 1) {
-          String argumentValue = argumentValues[0].stringValue;
-          if (argumentValue != null) {
-            return _valid(definingClass, new SymbolState(argumentValue));
-          }
-        }
-      }
-      Map<String, DartObjectImpl> fieldMap = new Map<String, DartObjectImpl>();
-      List<ParameterElement> parameters = constructor.parameters;
-      int parameterCount = parameters.length;
-      for (int i = 0; i < parameterCount; i++) {
-        ParameterElement parameter = parameters[i];
-        if (parameter.isInitializingFormal) {
-          FieldElement field = (parameter as FieldFormalParameterElement).field;
-          if (field != null) {
-            String fieldName = field.name;
-            if (parameter.parameterKind == ParameterKind.NAMED) {
-              DartObjectImpl argumentValue = namedArgumentValues[parameter.name];
-              if (argumentValue != null) {
-                fieldMap[fieldName] = argumentValue;
-              }
-            } else if (i < argumentCount) {
-              fieldMap[fieldName] = argumentValues[i];
-            }
-          }
-        }
-      }
-      // TODO(brianwilkerson) This doesn't handle fields initialized in an initializer. We should be
-      // able to handle fields initialized by the superclass' constructor fairly easily, but other
-      // initializers will be harder.
-      return _valid(definingClass, new GenericState(fieldMap));
+    beforeGetEvaluationResult(node);
+    EvaluationResultImpl result = node.evaluationResult;
+    if (result != null) {
+      return result;
     }
     // TODO(brianwilkerson) Figure out which error to report.
     return _error(node, null);
@@ -728,7 +1038,12 @@
   EvaluationResultImpl visitPropertyAccess(PropertyAccess node) => _getConstantValue(node, node.propertyName.staticElement);
 
   @override
-  EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) => _getConstantValue(node, node.staticElement);
+  EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) {
+    if (_lexicalEnvironment != null && _lexicalEnvironment.containsKey(node.name)) {
+      return new ValidResult(_lexicalEnvironment[node.name]);
+    }
+    return _getConstantValue(node, node.staticElement);
+  }
 
   @override
   EvaluationResultImpl visitSimpleStringLiteral(SimpleStringLiteral node) => _valid(_typeProvider.stringType, new StringState(node.value));
@@ -760,41 +1075,10 @@
   }
 
   /**
-   * Return a result object representing an error associated with the given node.
-   *
-   * @param node the AST node associated with the error
-   * @param code the error code indicating the nature of the error
-   * @return a result object representing an error associated with the given node
+   * This method is called just before retrieving an evaluation result from an AST node. Unit tests
+   * will override it to introduce additional error checking.
    */
-  ErrorResult _error(AstNode node, ErrorCode code) => new ErrorResult.con1(node, code == null ? CompileTimeErrorCode.INVALID_CONSTANT : code);
-
-  /**
-   * Return the constant value of the static constant represented by the given element.
-   *
-   * @param node the node to be used if an error needs to be reported
-   * @param element the element whose value is to be returned
-   * @return the constant value of the static constant
-   */
-  EvaluationResultImpl _getConstantValue(AstNode node, Element element) {
-    if (element is PropertyAccessorElement) {
-      element = (element as PropertyAccessorElement).variable;
-    }
-    if (element is VariableElementImpl) {
-      VariableElementImpl variableElementImpl = element;
-      EvaluationResultImpl value = variableElementImpl.evaluationResult;
-      if (variableElementImpl.isConst && value != null) {
-        return value;
-      }
-    } else if (element is ExecutableElement) {
-      ExecutableElement function = element;
-      if (function.isStatic) {
-        return _valid(_typeProvider.functionType, new FunctionState(function));
-      }
-    } else if (element is ClassElement || element is FunctionTypeAliasElement) {
-      return _valid(_typeProvider.typeType, new TypeState(element));
-    }
-    // TODO(brianwilkerson) Figure out which error to report.
-    return _error(node, null);
+  void beforeGetEvaluationResult(AstNode node) {
   }
 
   /**
@@ -809,26 +1093,6 @@
     return _nullObject;
   }
 
-  /**
-   * Return the union of the errors encoded in the given results.
-   *
-   * @param leftResult the first set of errors, or `null` if there was no previous collection
-   *          of errors
-   * @param rightResult the errors to be added to the collection, or a valid result if there are no
-   *          errors to be added
-   * @return the union of the errors encoded in the given results
-   */
-  ErrorResult _union(ErrorResult leftResult, EvaluationResultImpl rightResult) {
-    if (rightResult is ErrorResult) {
-      if (leftResult != null) {
-        return new ErrorResult.con2(leftResult, rightResult);
-      } else {
-        return rightResult;
-      }
-    }
-    return leftResult;
-  }
-
   ValidResult _valid(InterfaceType type, InstanceState state) => new ValidResult(new DartObjectImpl(type, state));
 
   ValidResult _validWithUnknownValue(InterfaceType type) {
@@ -861,6 +1125,65 @@
     }
     return null2;
   }
+
+  /**
+   * Return a result object representing an error associated with the given node.
+   *
+   * @param node the AST node associated with the error
+   * @param code the error code indicating the nature of the error
+   * @return a result object representing an error associated with the given node
+   */
+  ErrorResult _error(AstNode node, ErrorCode code) => new ErrorResult.con1(node, code == null ? CompileTimeErrorCode.INVALID_CONSTANT : code);
+
+  /**
+   * Return the constant value of the static constant represented by the given element.
+   *
+   * @param node the node to be used if an error needs to be reported
+   * @param element the element whose value is to be returned
+   * @return the constant value of the static constant
+   */
+  EvaluationResultImpl _getConstantValue(AstNode node, Element element) {
+    if (element is PropertyAccessorElement) {
+      element = (element as PropertyAccessorElement).variable;
+    }
+    if (element is VariableElementImpl) {
+      VariableElementImpl variableElementImpl = element;
+      beforeGetEvaluationResult(node);
+      EvaluationResultImpl value = variableElementImpl.evaluationResult;
+      if (variableElementImpl.isConst && value != null) {
+        return value;
+      }
+    } else if (element is ExecutableElement) {
+      ExecutableElement function = element;
+      if (function.isStatic) {
+        return _valid(_typeProvider.functionType, new FunctionState(function));
+      }
+    } else if (element is ClassElement || element is FunctionTypeAliasElement) {
+      return _valid(_typeProvider.typeType, new TypeState(element));
+    }
+    // TODO(brianwilkerson) Figure out which error to report.
+    return _error(node, null);
+  }
+
+  /**
+   * Return the union of the errors encoded in the given results.
+   *
+   * @param leftResult the first set of errors, or `null` if there was no previous collection
+   *          of errors
+   * @param rightResult the errors to be added to the collection, or a valid result if there are no
+   *          errors to be added
+   * @return the union of the errors encoded in the given results
+   */
+  ErrorResult _union(ErrorResult leftResult, EvaluationResultImpl rightResult) {
+    if (rightResult is ErrorResult) {
+      if (leftResult != null) {
+        return new ErrorResult.con2(leftResult, rightResult);
+      } else {
+        return rightResult;
+      }
+    }
+    return leftResult;
+  }
 }
 
 /**
@@ -1116,6 +1439,8 @@
     return null;
   }
 
+  Map<String, DartObjectImpl> get fields => _state.fields;
+
   @override
   int get intValue {
     if (_state is IntState) {
@@ -1196,6 +1521,11 @@
   bool get isTrue => _state is BoolState && identical((_state as BoolState).value, true);
 
   /**
+   * Return true if this object represents an unknown value.
+   */
+  bool get isUnknown => _state.isUnknown;
+
+  /**
    * Return `true` if this object represents an instance of a user-defined class.
    *
    * @return `true` if this object represents an instance of a user-defined class
@@ -2422,6 +2752,11 @@
   final Map<String, DartObjectImpl> _fieldMap;
 
   /**
+   * Pseudo-field that we use to represent fields in the superclass.
+   */
+  static String SUPERCLASS_FIELD = "(super)";
+
+  /**
    * A state that can be used to represent an object whose state is not known.
    */
   static GenericState UNKNOWN_VALUE = new GenericState(new Map<String, DartObjectImpl>());
@@ -2437,6 +2772,15 @@
   StringState convertToString() => StringState.UNKNOWN_VALUE;
 
   @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    assertBoolNumStringOrNull(rightOperand);
+    if (rightOperand is DynamicState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    return BoolState.from(this == rightOperand);
+  }
+
+  @override
   bool operator ==(Object object) {
     if (object is! GenericState) {
       return false;
@@ -2458,13 +2802,7 @@
   }
 
   @override
-  BoolState equalEqual(InstanceState rightOperand) {
-    assertBoolNumStringOrNull(rightOperand);
-    if (rightOperand is DynamicState) {
-      return BoolState.UNKNOWN_VALUE;
-    }
-    return BoolState.from(this == rightOperand);
-  }
+  Map<String, DartObjectImpl> get fields => _fieldMap;
 
   @override
   String get typeName => "user defined type";
@@ -2477,6 +2815,9 @@
     }
     return hashCode;
   }
+
+  @override
+  bool get isUnknown => identical(this, UNKNOWN_VALUE);
 }
 
 /**
@@ -2598,6 +2939,12 @@
   BoolState equalEqual(InstanceState rightOperand);
 
   /**
+   * If this represents a generic dart object, return a map from its fieldnames to their values.
+   * Otherwise return null.
+   */
+  Map<String, DartObjectImpl> get fields => null;
+
+  /**
    * Return the name of the type of this value.
    *
    * @return the name of the type of this value
@@ -2675,6 +3022,11 @@
   bool get isBoolNumStringOrNull => false;
 
   /**
+   * Return true if this object represents an unknown value.
+   */
+  bool get isUnknown => false;
+
+  /**
    * Return the result of invoking the '&lt;' operator on this object with the given argument.
    *
    * @param rightOperand the right-hand operand of the operation
@@ -3575,15 +3927,15 @@
   }
 
   @override
-  bool operator ==(Object object) => object is NumState;
-
-  @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
     return BoolState.UNKNOWN_VALUE;
   }
 
   @override
+  bool operator ==(Object object) => object is NumState;
+
+  @override
   String get typeName => "num";
 
   @override
@@ -3621,6 +3973,9 @@
   bool get isBoolNumStringOrNull => true;
 
   @override
+  bool get isUnknown => identical(this, UNKNOWN_VALUE);
+
+  @override
   BoolState lessThan(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return BoolState.UNKNOWN_VALUE;
@@ -3663,15 +4018,25 @@
  */
 class ReferenceFinder extends RecursiveAstVisitor<Object> {
   /**
-   * The element representing the variable whose initializer will be visited.
+   * The element representing the construct that will be visited.
    */
-  final VariableElement _source;
+  final AstNode _source;
 
   /**
    * A graph in which the nodes are the constant variables and the edges are from each variable to
    * the other constant variables that are referenced in the head's initializer.
    */
-  final DirectedGraph<VariableElement> _referenceGraph;
+  final DirectedGraph<AstNode> _referenceGraph;
+
+  /**
+   * A table mapping constant variables to the declarations of those variables.
+   */
+  final Map<VariableElement, VariableDeclaration> _variableDeclarationMap;
+
+  /**
+   * A table mapping constant constructors to the declarations of those constructors.
+   */
+  final Map<ConstructorElement, ConstructorDeclaration> _constructorDeclarationMap;
 
   /**
    * Initialize a newly created reference finder to find references from the given variable to other
@@ -3680,8 +4045,20 @@
    * @param source the element representing the variable whose initializer will be visited
    * @param referenceGraph a graph recording which variables (heads) reference which other variables
    *          (tails) in their initializers
+   * @param variableDeclarationMap A table mapping constant variables to the declarations of those
+   *          variables.
+   * @param constructorDeclarationMap A table mapping constant constructors to the declarations of
+   *          those constructors.
    */
-  ReferenceFinder(this._source, this._referenceGraph);
+  ReferenceFinder(this._source, this._referenceGraph, this._variableDeclarationMap, this._constructorDeclarationMap);
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    if (node.isConst) {
+      _referenceGraph.addEdge(_source, node);
+    }
+    return null;
+  }
 
   @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
@@ -3692,7 +4069,31 @@
     if (element is VariableElement) {
       VariableElement variable = element as VariableElement;
       if (variable.isConst) {
-        _referenceGraph.addEdge(_source, variable);
+        VariableDeclaration variableDeclaration = _variableDeclarationMap[variable];
+        // The declaration will be null when the variable is not defined in the compilation units
+        // that were used to produce the variableDeclarationMap.  In such cases, the variable should
+        // already have a value associated with it, but we don't bother to check because there's
+        // nothing we can do about it at this point.
+        if (variableDeclaration != null) {
+          _referenceGraph.addEdge(_source, variableDeclaration);
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    super.visitSuperConstructorInvocation(node);
+    ConstructorElement constructor = node.staticElement;
+    if (constructor != null && constructor.isConst) {
+      ConstructorDeclaration constructorDeclaration = _constructorDeclarationMap[constructor];
+      // The declaration will be null when the constructor is not defined in the compilation
+      // units that were used to produce the constructorDeclarationMap.  In such cases, the
+      // constructor should already have its initializer AST's stored in it, but we don't bother
+      // to check because there's nothing we can do about it at this point.
+      if (constructorDeclaration != null) {
+        _referenceGraph.addEdge(_source, constructorDeclaration);
       }
     }
     return null;
@@ -3775,6 +4176,9 @@
   bool get isBoolNumStringOrNull => true;
 
   @override
+  bool get isUnknown => value == null;
+
+  @override
   String toString() => value == null ? "-unknown-" : "'${value}'";
 }
 
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 9be227d..9cfa683 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -1062,6 +1062,25 @@
   PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library);
 
   /**
+   * Return the element representing the method that results from looking up the given method in the
+   * superclass of this class with respect to the given library, or `null` if the look up
+   * fails. The behavior of this method is defined by the Dart Language Specification in section
+   * 12.15.1: <blockquote> The result of looking up method <i>m</i> in class <i>C</i> with respect
+   * to library <i>L</i> is:
+   * * If <i>C</i> declares an instance method named <i>m</i> that is accessible to <i>L</i>, then
+   * that method is the result of the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then
+   * the result of the lookup is the result of looking up method <i>m</i> in <i>S</i> with respect
+   * to <i>L</i>. Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   *
+   * @param methodName the name of the method being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given method in the superclass of this class with respect
+   *         to the given library
+   */
+  MethodElement lookUpInheritedMethod(String methodName, LibraryElement library);
+
+  /**
    * Return the element representing the method that results from looking up the given method in
    * this class with respect to the given library, or `null` if the look up fails. The
    * behavior of this method is defined by the Dart Language Specification in section 12.15.1:
@@ -1124,12 +1143,12 @@
    * An array containing all of the mixins that are applied to the class being extended in order to
    * derive the superclass of this class.
    */
-  List<InterfaceType> mixins = InterfaceTypeImpl.EMPTY_ARRAY;
+  List<InterfaceType> mixins = InterfaceType.EMPTY_ARRAY;
 
   /**
    * An array containing all of the interfaces that are implemented by this class.
    */
-  List<InterfaceType> interfaces = InterfaceTypeImpl.EMPTY_ARRAY;
+  List<InterfaceType> interfaces = InterfaceType.EMPTY_ARRAY;
 
   /**
    * An array containing all of the methods contained in this class.
@@ -1415,32 +1434,10 @@
   }
 
   @override
-  MethodElement lookUpMethod(String methodName, LibraryElement library) {
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
-    ClassElement currentElement = this;
-    while (currentElement != null && !visitedClasses.contains(currentElement)) {
-      visitedClasses.add(currentElement);
-      MethodElement element = currentElement.getMethod(methodName);
-      if (element != null && element.isAccessibleIn(library)) {
-        return element;
-      }
-      for (InterfaceType mixin in currentElement.mixins) {
-        ClassElement mixinElement = mixin.element;
-        if (mixinElement != null) {
-          element = mixinElement.getMethod(methodName);
-          if (element != null && element.isAccessibleIn(library)) {
-            return element;
-          }
-        }
-      }
-      InterfaceType supertype = currentElement.supertype;
-      if (supertype == null) {
-        return null;
-      }
-      currentElement = supertype.element;
-    }
-    return null;
-  }
+  MethodElement lookUpInheritedMethod(String methodName, LibraryElement library) => _internalLookUpMethod(methodName, library, false);
+
+  @override
+  MethodElement lookUpMethod(String methodName, LibraryElement library) => _internalLookUpMethod(methodName, library, true);
 
   @override
   PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library) {
@@ -1627,6 +1624,38 @@
     }
   }
 
+  MethodElement _internalLookUpMethod(String methodName, LibraryElement library, bool includeThisClass) {
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    ClassElement currentElement = this;
+    if (includeThisClass) {
+      MethodElement element = currentElement.getMethod(methodName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+    }
+    while (currentElement != null && visitedClasses.add(currentElement)) {
+      for (InterfaceType mixin in currentElement.mixins) {
+        ClassElement mixinElement = mixin.element;
+        if (mixinElement != null) {
+          MethodElement element = mixinElement.getMethod(methodName);
+          if (element != null && element.isAccessibleIn(library)) {
+            return element;
+          }
+        }
+      }
+      InterfaceType supertype = currentElement.supertype;
+      if (supertype == null) {
+        return null;
+      }
+      currentElement = supertype.element;
+      MethodElement element = currentElement.getMethod(methodName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+    }
+    return null;
+  }
+
   bool _safeIsOrInheritsProxy(ClassElement classElt, Set<ClassElement> visitedClassElts) {
     if (visitedClassElts.contains(classElt)) {
       return false;
@@ -2128,9 +2157,9 @@
   ConstructorDeclaration get node;
 
   /**
-   * Return the constructor to which this constructor is redirecting, or `null` if this constructor
-   * does not redirect to another constructor or if the library containing this constructor has
-   * not yet been resolved.
+   * Return the constructor to which this constructor is redirecting, or `null` if this
+   * constructor does not redirect to another constructor or if the library containing this
+   * constructor has not yet been resolved.
    *
    * @return the constructor to which this constructor is redirecting
    */
@@ -2174,6 +2203,12 @@
   ConstructorElement redirectedConstructor;
 
   /**
+   * The initializers for this constructor (used for evaluating constant instance creation
+   * expressions).
+   */
+  List<ConstructorInitializer> constantInitializers;
+
+  /**
    * Initialize a newly created constructor element to have the given name.
    *
    * @param name the name of this element
@@ -3605,9 +3640,7 @@
         index++;
       }
     }
-    if (builder.length > 0) {
-      components.add(builder.toString());
-    }
+    components.add(builder.toString());
     return new List.from(components);
   }
 
@@ -6051,6 +6084,11 @@
  */
 abstract class InterfaceType implements ParameterizedType {
   /**
+   * An empty array of types.
+   */
+  static final List<InterfaceType> EMPTY_ARRAY = new List<InterfaceType>(0);
+
+  /**
    * Return an array containing all of the accessors (getters and setters) declared in this type.
    *
    * @return the accessors declared in this type
@@ -6343,11 +6381,6 @@
  */
 class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
   /**
-   * An empty array of types.
-   */
-  static List<InterfaceType> EMPTY_ARRAY = new List<InterfaceType>(0);
-
-  /**
    * This method computes the longest inheritance path from some passed [Type] to Object.
    *
    * @param type the [Type] to compute the longest inheritance path of from the passed
@@ -7733,8 +7766,8 @@
       }
       InterfaceType futureType = futureElement.type;
       return futureType.substitute4(<DartType> [DynamicTypeImpl.instance]);
-    } on AnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logError2("Could not build the element model for dart:async", exception);
+    } on AnalysisException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logError2("Could not build the element model for dart:async", new CaughtException(exception, stackTrace));
       return VoidTypeImpl.instance;
     }
   }
@@ -7810,16 +7843,6 @@
  */
 class LocalVariableElementImpl extends VariableElementImpl implements LocalVariableElement {
   /**
-   * Is `true` if this variable is potentially mutated somewhere in its scope.
-   */
-  bool _potentiallyMutatedInScope = false;
-
-  /**
-   * Is `true` if this variable is potentially mutated somewhere in closure.
-   */
-  bool _potentiallyMutatedInClosure = false;
-
-  /**
    * The offset to the beginning of the visible range for this element.
    */
   int _visibleRangeOffset = 0;
@@ -7866,23 +7889,23 @@
   }
 
   @override
-  bool get isPotentiallyMutatedInClosure => _potentiallyMutatedInClosure;
+  bool get isPotentiallyMutatedInClosure => hasModifier(Modifier.POTENTIALLY_MUTATED_IN_CONTEXT);
 
   @override
-  bool get isPotentiallyMutatedInScope => _potentiallyMutatedInScope;
+  bool get isPotentiallyMutatedInScope => hasModifier(Modifier.POTENTIALLY_MUTATED_IN_SCOPE);
 
   /**
    * Specifies that this variable is potentially mutated somewhere in closure.
    */
   void markPotentiallyMutatedInClosure() {
-    _potentiallyMutatedInClosure = true;
+    setModifier(Modifier.POTENTIALLY_MUTATED_IN_CONTEXT, true);
   }
 
   /**
    * Specifies that this variable is potentially mutated somewhere in its scope.
    */
   void markPotentiallyMutatedInScope() {
-    _potentiallyMutatedInScope = true;
+    setModifier(Modifier.POTENTIALLY_MUTATED_IN_SCOPE, true);
   }
 
   /**
@@ -8328,26 +8351,36 @@
 
   static const Modifier MIXIN = const Modifier('MIXIN', 7);
 
-  static const Modifier REFERENCES_SUPER = const Modifier('REFERENCES_SUPER', 8);
+  /**
+   * Indicates that the value of a parameter or local variable might be mutated within the context.
+   */
+  static const Modifier POTENTIALLY_MUTATED_IN_CONTEXT = const Modifier('POTENTIALLY_MUTATED_IN_CONTEXT', 8);
+
+  /**
+   * Indicates that the value of a parameter or local variable might be mutated within the scope.
+   */
+  static const Modifier POTENTIALLY_MUTATED_IN_SCOPE = const Modifier('POTENTIALLY_MUTATED_IN_SCOPE', 9);
+
+  static const Modifier REFERENCES_SUPER = const Modifier('REFERENCES_SUPER', 10);
 
   /**
    * Indicates that the pseudo-modifier 'set' was applied to the element.
    */
-  static const Modifier SETTER = const Modifier('SETTER', 9);
+  static const Modifier SETTER = const Modifier('SETTER', 11);
 
   /**
    * Indicates that the modifier 'static' was applied to the element.
    */
-  static const Modifier STATIC = const Modifier('STATIC', 10);
+  static const Modifier STATIC = const Modifier('STATIC', 12);
 
   /**
    * Indicates that the element does not appear in the source code but was implicitly created. For
    * example, if a class does not define any constructors, an implicit zero-argument constructor
    * will be created and it will be marked as being synthetic.
    */
-  static const Modifier SYNTHETIC = const Modifier('SYNTHETIC', 11);
+  static const Modifier SYNTHETIC = const Modifier('SYNTHETIC', 13);
 
-  static const Modifier TYPEDEF = const Modifier('TYPEDEF', 12);
+  static const Modifier TYPEDEF = const Modifier('TYPEDEF', 14);
 
   static const List<Modifier> values = const [
       ABSTRACT,
@@ -8358,6 +8391,8 @@
       GETTER,
       HAS_EXT_URI,
       MIXIN,
+      POTENTIALLY_MUTATED_IN_CONTEXT,
+      POTENTIALLY_MUTATED_IN_SCOPE,
       REFERENCES_SUPER,
       SETTER,
       STATIC,
@@ -8684,16 +8719,6 @@
  */
 class ParameterElementImpl extends VariableElementImpl implements ParameterElement {
   /**
-   * Is `true` if this variable is potentially mutated somewhere in its scope.
-   */
-  bool _potentiallyMutatedInScope = false;
-
-  /**
-   * Is `true` if this variable is potentially mutated somewhere in closure.
-   */
-  bool _potentiallyMutatedInClosure = false;
-
-  /**
    * An array containing all of the parameters defined by this parameter element. There will only be
    * parameters if this parameter is a function typed parameter.
    */
@@ -8776,23 +8801,23 @@
   bool get isInitializingFormal => false;
 
   @override
-  bool get isPotentiallyMutatedInClosure => _potentiallyMutatedInClosure;
+  bool get isPotentiallyMutatedInClosure => hasModifier(Modifier.POTENTIALLY_MUTATED_IN_CONTEXT);
 
   @override
-  bool get isPotentiallyMutatedInScope => _potentiallyMutatedInScope;
+  bool get isPotentiallyMutatedInScope => hasModifier(Modifier.POTENTIALLY_MUTATED_IN_SCOPE);
 
   /**
    * Specifies that this variable is potentially mutated somewhere in closure.
    */
   void markPotentiallyMutatedInClosure() {
-    _potentiallyMutatedInClosure = true;
+    setModifier(Modifier.POTENTIALLY_MUTATED_IN_CONTEXT, true);
   }
 
   /**
    * Specifies that this variable is potentially mutated somewhere in its scope.
    */
   void markPotentiallyMutatedInScope() {
-    _potentiallyMutatedInScope = true;
+    setModifier(Modifier.POTENTIALLY_MUTATED_IN_SCOPE, true);
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 9289e9a..e06709a 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -986,7 +986,6 @@
         SourceEntry entry = _getReadableSourceEntry(source);
         if (entry is DartEntry) {
           DartEntry dartEntry = entry;
-          _removeFromParts(source, dartEntry);
           DartEntryImpl dartCopy = dartEntry.writableCopy;
           dartCopy.invalidateAllResolutionInformation();
           _cache.put(source, dartCopy);
@@ -1141,13 +1140,13 @@
   ResolvableCompilationUnit computeResolvableCompilationUnit(Source source) {
     DartEntry dartEntry = _getReadableDartEntry(source);
     if (dartEntry == null) {
-      throw new AnalysisException.con1("computeResolvableCompilationUnit for non-Dart: ${source.fullName}");
+      throw new AnalysisException("computeResolvableCompilationUnit for non-Dart: ${source.fullName}");
     }
     dartEntry = _cacheDartParseData(source, dartEntry, DartEntry.PARSED_UNIT);
     DartEntryImpl dartCopy = dartEntry.writableCopy;
     CompilationUnit unit = dartCopy.resolvableCompilationUnit;
     if (unit == null) {
-      throw new AnalysisException.con2("Internal error: computeResolvableCompilationUnit could not parse ${source.fullName}", dartEntry.exception);
+      throw new AnalysisException("Internal error: computeResolvableCompilationUnit could not parse ${source.fullName}", new CaughtException(dartEntry.exception, null));
     }
     _cache.put(source, dartCopy);
     return new ResolvableCompilationUnit.con1(dartCopy.modificationTime, unit);
@@ -1440,7 +1439,7 @@
       namespace = builder.createPublicNamespaceForLibrary(library);
       dartEntry = _getReadableDartEntry(source);
       if (dartEntry == null) {
-        AnalysisEngine.instance.logger.logError2("Could not compute the public namespace for ${library.source.fullName}", new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}"));
+        AnalysisEngine.instance.logger.logError2("Could not compute the public namespace for ${library.source.fullName}", new CaughtException(new AnalysisException("A Dart file became a non-Dart file: ${source.fullName}"), null));
         return null;
       }
       if (identical(dartEntry.getValue(DartEntry.ELEMENT), library)) {
@@ -1576,11 +1575,11 @@
   TypeProvider get typeProvider {
     Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE);
     if (coreSource == null) {
-      throw new AnalysisException.con1("Could not create a source for dart:core");
+      throw new AnalysisException("Could not create a source for dart:core");
     }
     LibraryElement coreElement = computeLibraryElement(coreSource);
     if (coreElement == null) {
-      throw new AnalysisException.con1("Could not create an element for dart:core");
+      throw new AnalysisException("Could not create an element for dart:core");
     }
     return new TypeProviderImpl(coreElement);
   }
@@ -1721,7 +1720,7 @@
 
   @override
   void set analysisOptions(AnalysisOptions options) {
-    bool needsRecompute = this._options.analyzeFunctionBodies != options.analyzeFunctionBodies || this._options.generateSdkErrors != options.generateSdkErrors || this._options.dart2jsHint != options.dart2jsHint || (this._options.hint && !options.hint) || this._options.preserveComments != options.preserveComments;
+    bool needsRecompute = this._options.analyzeFunctionBodies != options.analyzeFunctionBodies || this._options.generateSdkErrors != options.generateSdkErrors || this._options.enableDeferredLoading != options.enableDeferredLoading || this._options.dart2jsHint != options.dart2jsHint || (this._options.hint && !options.hint) || this._options.preserveComments != options.preserveComments;
     int cacheSize = options.cacheSize;
     if (this._options.cacheSize != cacheSize) {
       this._options.cacheSize = cacheSize;
@@ -1741,6 +1740,7 @@
     }
     this._options.analyzeFunctionBodies = options.analyzeFunctionBodies;
     this._options.generateSdkErrors = options.generateSdkErrors;
+    this._options.enableDeferredLoading = options.enableDeferredLoading;
     this._options.dart2jsHint = options.dart2jsHint;
     this._options.hint = options.hint;
     this._options.incremental = options.incremental;
@@ -1866,7 +1866,7 @@
    */
   DartEntry recordResolveDartLibraryCycleTaskResults(ResolveDartLibraryCycleTask task) {
     LibraryResolver2 resolver = task.libraryResolver;
-    AnalysisException thrownException = task.exception;
+    CaughtException thrownException = task.exception;
     DartEntry unitEntry = null;
     Source unitSource = task.unitSource;
     if (resolver != null) {
@@ -1881,11 +1881,11 @@
         //
         unitEntry = _getReadableDartEntry(unitSource);
         if (unitEntry == null) {
-          throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
+          throw new AnalysisException("A Dart file became a non-Dart file: ${unitSource.fullName}");
         }
         DartEntryImpl dartCopy = unitEntry.writableCopy;
         if (thrownException == null) {
-          dartCopy.recordResolutionError(new AnalysisException.con1("In recordResolveDartLibraryCycleTaskResults, resolvedLibraries was null and there was no thrown exception"));
+          dartCopy.recordResolutionError(new CaughtException(new AnalysisException("In recordResolveDartLibraryCycleTaskResults, resolvedLibraries was null and there was no thrown exception"), null));
         } else {
           dartCopy.recordResolutionError(thrownException);
         }
@@ -1973,7 +1973,7 @@
     if (unitEntry == null) {
       unitEntry = _getReadableDartEntry(unitSource);
       if (unitEntry == null) {
-        throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
+        throw new AnalysisException("A Dart file became a non-Dart file: ${unitSource.fullName}");
       }
     }
     return unitEntry;
@@ -1981,7 +1981,7 @@
 
   DartEntry recordResolveDartLibraryTaskResults(ResolveDartLibraryTask task) {
     LibraryResolver resolver = task.libraryResolver;
-    AnalysisException thrownException = task.exception;
+    CaughtException thrownException = task.exception;
     DartEntry unitEntry = null;
     Source unitSource = task.unitSource;
     if (resolver != null) {
@@ -1996,11 +1996,11 @@
         //
         unitEntry = _getReadableDartEntry(unitSource);
         if (unitEntry == null) {
-          throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
+          throw new AnalysisException("A Dart file became a non-Dart file: ${unitSource.fullName}");
         }
         DartEntryImpl dartCopy = unitEntry.writableCopy;
         if (thrownException == null) {
-          dartCopy.recordResolutionError(new AnalysisException.con1("In recordResolveDartLibraryTaskResults, resolvedLibraries was null and there was no thrown exception"));
+          dartCopy.recordResolutionError(new CaughtException(new AnalysisException("In recordResolveDartLibraryTaskResults, resolvedLibraries was null and there was no thrown exception"), null));
         } else {
           dartCopy.recordResolutionError(thrownException);
         }
@@ -2027,7 +2027,7 @@
               _sourceChanged(source);
               dartEntry = _getReadableDartEntry(source);
               if (dartEntry == null) {
-                throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
+                throw new AnalysisException("A Dart file became a non-Dart file: ${source.fullName}");
               }
             }
             DartEntryImpl dartCopy = dartEntry.writableCopy;
@@ -2099,7 +2099,7 @@
     if (unitEntry == null) {
       unitEntry = _getReadableDartEntry(unitSource);
       if (unitEntry == null) {
-        throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
+        throw new AnalysisException("A Dart file became a non-Dart file: ${unitSource.fullName}");
       }
     }
     return unitEntry;
@@ -2150,7 +2150,7 @@
         if (dartEntry == null) {
           // This shouldn't be possible because we should never have performed the task if the
           // source didn't represent a Dart file, but check to be safe.
-          throw new AnalysisException.con1("Internal error: attempting to resolve non-Dart file as a Dart file: ${source.fullName}");
+          throw new AnalysisException("Internal error: attempting to resolve non-Dart file as a Dart file: ${source.fullName}");
         }
         int sourceTime = getModificationStamp(source);
         int resultTime = library.getModificationTime(source);
@@ -2181,7 +2181,7 @@
         if (dartEntry == null) {
           // This shouldn't be possible because we should never have performed the task if the
           // source didn't represent a Dart file, but check to be safe.
-          throw new AnalysisException.con1("Internal error: attempting to resolve non-Dart file as a Dart file: ${source.fullName}");
+          throw new AnalysisException("Internal error: attempting to resolve non-Dart file as a Dart file: ${source.fullName}");
         }
         int sourceTime = getModificationStamp(source);
         int resultTime = library.getModificationTime(source);
@@ -2343,8 +2343,8 @@
         dartEntry = new ScanDartTask(this, source, dartEntry.modificationTime, dartEntry.getValue(SourceEntry.CONTENT)).perform(_resultRecorder) as DartEntry;
       } on AnalysisException catch (exception) {
         throw exception;
-      } on JavaException catch (exception) {
-        throw new AnalysisException.con3(exception);
+      } on JavaException catch (exception, stackTrace) {
+        throw new AnalysisException("Exception", new CaughtException(exception, stackTrace));
       }
       state = dartEntry.getState(descriptor);
     }
@@ -2379,7 +2379,7 @@
       LibraryElement library = computeLibraryElement(librarySource);
       CompilationUnit unit = resolveCompilationUnit(unitSource, library);
       if (unit == null) {
-        throw new AnalysisException.con1("Could not resolve compilation unit ${unitSource.fullName} in ${librarySource.fullName}");
+        throw new AnalysisException("Could not resolve compilation unit ${unitSource.fullName} in ${librarySource.fullName}");
       }
       dartEntry = new GenerateDartErrorsTask(this, unitSource, dartEntry.modificationTime, unit, library).perform(_resultRecorder) as DartEntry;
       state = dartEntry.getStateInLibrary(descriptor, librarySource);
@@ -2425,8 +2425,8 @@
         htmlEntry = new ParseHtmlTask(this, source, htmlEntry.modificationTime, htmlEntry.getValue(SourceEntry.CONTENT)).perform(_resultRecorder) as HtmlEntry;
       } on AnalysisException catch (exception) {
         throw exception;
-      } on JavaException catch (exception) {
-        throw new AnalysisException.con3(exception);
+      } on JavaException catch (exception, stackTrace) {
+        throw new AnalysisException("Exception", new CaughtException(exception, stackTrace));
       }
       state = htmlEntry.getState(descriptor);
     }
@@ -2540,11 +2540,11 @@
       dartCopy.setStateInLibrary(DartEntry.BUILT_UNIT, source, CacheState.IN_PROCESS);
       _cache.put(source, dartCopy);
       return new AnalysisContextImpl_TaskData(new BuildDartElementModelTask(this, source, builder.librariesInCycle), false);
-    } on AnalysisException catch (exception) {
+    } on AnalysisException catch (exception, stackTrace) {
       DartEntryImpl dartCopy = dartEntry.writableCopy;
-      dartCopy.recordBuildElementErrorInLibrary(source, exception);
+      dartCopy.recordBuildElementErrorInLibrary(source, new CaughtException(exception, stackTrace));
       _cache.put(source, dartCopy);
-      AnalysisEngine.instance.logger.logError2("Internal error trying to compute the next analysis task", exception);
+      AnalysisEngine.instance.logger.logError2("Internal error trying to compute the next analysis task", new CaughtException(exception, stackTrace));
     }
     return new AnalysisContextImpl_TaskData(null, false);
   }
@@ -2566,7 +2566,7 @@
     }
     CompilationUnit unit = unitEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
     if (unit == null) {
-      AnalysisException exception = new AnalysisException.con1("Entry has VALID state for RESOLVED_UNIT but null value for ${unitSource.fullName} in ${librarySource.fullName}");
+      CaughtException exception = new CaughtException(new AnalysisException("Entry has VALID state for RESOLVED_UNIT but null value for ${unitSource.fullName} in ${librarySource.fullName}"), null);
       AnalysisEngine.instance.logger.logInformation2(exception.toString(), exception);
       DartEntryImpl dartCopy = unitEntry.writableCopy;
       dartCopy.recordResolutionError(exception);
@@ -2762,11 +2762,11 @@
         return taskData;
       }
       return new AnalysisContextImpl_TaskData(new ResolveDartLibraryCycleTask(this, source, source, builder.librariesInCycle), false);
-    } on AnalysisException catch (exception) {
+    } on AnalysisException catch (exception, stackTrace) {
       DartEntryImpl dartCopy = dartEntry.writableCopy;
-      dartCopy.recordResolutionError(exception);
+      dartCopy.recordResolutionError(new CaughtException(exception, stackTrace));
       _cache.put(source, dartCopy);
-      AnalysisEngine.instance.logger.logError2("Internal error trying to create a ResolveDartLibraryTask", exception);
+      AnalysisEngine.instance.logger.logError2("Internal error trying to create a ResolveDartLibraryTask", new CaughtException(exception, stackTrace));
     }
     return new AnalysisContextImpl_TaskData(null, false);
   }
@@ -3833,7 +3833,7 @@
   DartEntry _recordBuildDartElementModelTask(BuildDartElementModelTask task) {
     Source targetLibrary = task.targetLibrary;
     List<ResolvableLibrary> builtLibraries = task.librariesInCycle;
-    AnalysisException thrownException = task.exception;
+    CaughtException thrownException = task.exception;
     DartEntry targetEntry = null;
     if (_allModificationTimesMatch(builtLibraries)) {
       Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
@@ -3913,7 +3913,7 @@
     if (targetEntry == null) {
       targetEntry = _getReadableDartEntry(targetLibrary);
       if (targetEntry == null) {
-        throw new AnalysisException.con1("A Dart file became a non-Dart file: ${targetLibrary.fullName}");
+        throw new AnalysisException("A Dart file became a non-Dart file: ${targetLibrary.fullName}");
       }
     }
     return targetEntry;
@@ -3945,7 +3945,7 @@
   DartEntry _recordGenerateDartErrorsTask(GenerateDartErrorsTask task) {
     Source source = task.source;
     Source librarySource = task.libraryElement.source;
-    AnalysisException thrownException = task.exception;
+    CaughtException thrownException = task.exception;
     DartEntry dartEntry = null;
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
@@ -3953,7 +3953,7 @@
     } else if (sourceEntry is! DartEntry) {
       // This shouldn't be possible because we should never have performed the task if the source
       // didn't represent a Dart file, but check to be safe.
-      throw new AnalysisException.con1("Internal error: attempting to verify non-Dart file as a Dart file: ${source.fullName}");
+      throw new AnalysisException("Internal error: attempting to verify non-Dart file as a Dart file: ${source.fullName}");
     }
     dartEntry = sourceEntry as DartEntry;
     int sourceTime = getModificationStamp(source);
@@ -3964,7 +3964,7 @@
         _sourceChanged(source);
         dartEntry = _getReadableDartEntry(source);
         if (dartEntry == null) {
-          throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
+          throw new AnalysisException("A Dart file became a non-Dart file: ${source.fullName}");
         }
       }
       DartEntryImpl dartCopy = dartEntry.writableCopy;
@@ -4018,7 +4018,7 @@
    */
   DartEntry _recordGenerateDartHintsTask(GenerateDartHintsTask task) {
     Source librarySource = task.libraryElement.source;
-    AnalysisException thrownException = task.exception;
+    CaughtException thrownException = task.exception;
     DartEntry libraryEntry = null;
     Map<Source, TimestampedData<List<AnalysisError>>> hintMap = task.hintMap;
     if (hintMap == null) {
@@ -4030,10 +4030,10 @@
       } else if (sourceEntry is! DartEntry) {
         // This shouldn't be possible because we should never have performed the task if the source
         // didn't represent a Dart file, but check to be safe.
-        throw new AnalysisException.con1("Internal error: attempting to generate hints for non-Dart file as a Dart file: ${librarySource.fullName}");
+        throw new AnalysisException("Internal error: attempting to generate hints for non-Dart file as a Dart file: ${librarySource.fullName}");
       }
       if (thrownException == null) {
-        thrownException = new AnalysisException.con1("GenerateDartHintsTask returned a null hint map without throwing an exception: ${librarySource.fullName}");
+        thrownException = new CaughtException(new AnalysisException("GenerateDartHintsTask returned a null hint map without throwing an exception: ${librarySource.fullName}"), null);
       }
       DartEntryImpl dartCopy = (sourceEntry as DartEntry).writableCopy;
       dartCopy.recordHintErrorInLibrary(librarySource, thrownException);
@@ -4047,7 +4047,7 @@
       if (sourceEntry is! DartEntry) {
         // This shouldn't be possible because we should never have performed the task if the source
         // didn't represent a Dart file, but check to be safe.
-        throw new AnalysisException.con1("Internal error: attempting to parse non-Dart file as a Dart file: ${unitSource.fullName}");
+        throw new AnalysisException("Internal error: attempting to parse non-Dart file as a Dart file: ${unitSource.fullName}");
       }
       DartEntry dartEntry = sourceEntry as DartEntry;
       if (unitSource == librarySource) {
@@ -4061,7 +4061,7 @@
           _sourceChanged(unitSource);
           dartEntry = _getReadableDartEntry(unitSource);
           if (dartEntry == null) {
-            throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
+            throw new AnalysisException("A Dart file became a non-Dart file: ${unitSource.fullName}");
           }
         }
         DartEntryImpl dartCopy = dartEntry.writableCopy;
@@ -4120,7 +4120,7 @@
       return null;
     }
     Source source = task.source;
-    AnalysisException thrownException = task.exception;
+    CaughtException thrownException = task.exception;
     SourceEntry sourceEntry = null;
     sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
@@ -4169,7 +4169,7 @@
    */
   DartEntry _recordParseDartTaskResults(ParseDartTask task) {
     Source source = task.source;
-    AnalysisException thrownException = task.exception;
+    CaughtException thrownException = task.exception;
     DartEntry dartEntry = null;
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
@@ -4177,7 +4177,7 @@
     } else if (sourceEntry is! DartEntry) {
       // This shouldn't be possible because we should never have performed the task if the source
       // didn't represent a Dart file, but check to be safe.
-      throw new AnalysisException.con1("Internal error: attempting to parse non-Dart file as a Dart file: ${source.fullName}");
+      throw new AnalysisException("Internal error: attempting to parse non-Dart file as a Dart file: ${source.fullName}");
     }
     dartEntry = sourceEntry as DartEntry;
     int sourceTime = getModificationStamp(source);
@@ -4188,7 +4188,7 @@
         _sourceChanged(source);
         dartEntry = _getReadableDartEntry(source);
         if (dartEntry == null) {
-          throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
+          throw new AnalysisException("A Dart file became a non-Dart file: ${source.fullName}");
         }
       }
       _removeFromParts(source, dartEntry);
@@ -4286,7 +4286,7 @@
    */
   HtmlEntry _recordParseHtmlTaskResults(ParseHtmlTask task) {
     Source source = task.source;
-    AnalysisException thrownException = task.exception;
+    CaughtException thrownException = task.exception;
     HtmlEntry htmlEntry = null;
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
@@ -4294,7 +4294,7 @@
     } else if (sourceEntry is! HtmlEntry) {
       // This shouldn't be possible because we should never have performed the task if the source
       // didn't represent an HTML file, but check to be safe.
-      throw new AnalysisException.con1("Internal error: attempting to parse non-HTML file as a HTML file: ${source.fullName}");
+      throw new AnalysisException("Internal error: attempting to parse non-HTML file as a HTML file: ${source.fullName}");
     }
     htmlEntry = sourceEntry as HtmlEntry;
     int sourceTime = getModificationStamp(source);
@@ -4305,7 +4305,7 @@
         _sourceChanged(source);
         htmlEntry = _getReadableHtmlEntry(source);
         if (htmlEntry == null) {
-          throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}");
+          throw new AnalysisException("An HTML file became a non-HTML file: ${source.fullName}");
         }
       }
       HtmlEntryImpl htmlCopy = (sourceEntry as HtmlEntry).writableCopy;
@@ -4371,7 +4371,7 @@
    */
   HtmlEntry _recordPolymerBuildHtmlTaskResults(PolymerBuildHtmlTask task) {
     Source source = task.source;
-    AnalysisException thrownException = task.exception;
+    CaughtException thrownException = task.exception;
     HtmlEntry htmlEntry = null;
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
@@ -4379,7 +4379,7 @@
     } else if (sourceEntry is! HtmlEntry) {
       // This shouldn't be possible because we should never have performed the task if the source
       // didn't represent an HTML file, but check to be safe.
-      throw new AnalysisException.con1("Internal error: attempting to resolve non-HTML file as an HTML file: ${source.fullName}");
+      throw new AnalysisException("Internal error: attempting to resolve non-HTML file as an HTML file: ${source.fullName}");
     }
     htmlEntry = sourceEntry as HtmlEntry;
     int sourceTime = getModificationStamp(source);
@@ -4390,7 +4390,7 @@
         _sourceChanged(source);
         htmlEntry = _getReadableHtmlEntry(source);
         if (htmlEntry == null) {
-          throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}");
+          throw new AnalysisException("An HTML file became a non-HTML file: ${source.fullName}");
         }
       }
       HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
@@ -4440,7 +4440,7 @@
    */
   HtmlEntry _recordPolymerResolveHtmlTaskResults(PolymerResolveHtmlTask task) {
     Source source = task.source;
-    AnalysisException thrownException = task.exception;
+    CaughtException thrownException = task.exception;
     HtmlEntry htmlEntry = null;
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
@@ -4448,7 +4448,7 @@
     } else if (sourceEntry is! HtmlEntry) {
       // This shouldn't be possible because we should never have performed the task if the source
       // didn't represent an HTML file, but check to be safe.
-      throw new AnalysisException.con1("Internal error: attempting to resolve non-HTML file as an HTML file: ${source.fullName}");
+      throw new AnalysisException("Internal error: attempting to resolve non-HTML file as an HTML file: ${source.fullName}");
     }
     htmlEntry = sourceEntry as HtmlEntry;
     int sourceTime = getModificationStamp(source);
@@ -4459,7 +4459,7 @@
         _sourceChanged(source);
         htmlEntry = _getReadableHtmlEntry(source);
         if (htmlEntry == null) {
-          throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}");
+          throw new AnalysisException("An HTML file became a non-HTML file: ${source.fullName}");
         }
       }
       HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
@@ -4509,7 +4509,7 @@
    */
   HtmlEntry _recordResolveAngularComponentTemplateTaskResults(ResolveAngularComponentTemplateTask task) {
     Source source = task.source;
-    AnalysisException thrownException = task.exception;
+    CaughtException thrownException = task.exception;
     HtmlEntry htmlEntry = null;
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
@@ -4517,7 +4517,7 @@
     } else if (sourceEntry is! HtmlEntry) {
       // This shouldn't be possible because we should never have performed the task if the source
       // didn't represent an HTML file, but check to be safe.
-      throw new AnalysisException.con1("Internal error: attempting to resolve non-HTML file as an HTML file: ${source.fullName}");
+      throw new AnalysisException("Internal error: attempting to resolve non-HTML file as an HTML file: ${source.fullName}");
     }
     htmlEntry = sourceEntry as HtmlEntry;
     int sourceTime = getModificationStamp(source);
@@ -4528,7 +4528,7 @@
         _sourceChanged(source);
         htmlEntry = _getReadableHtmlEntry(source);
         if (htmlEntry == null) {
-          throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}");
+          throw new AnalysisException("An HTML file became a non-HTML file: ${source.fullName}");
         }
       }
       HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
@@ -4588,7 +4588,7 @@
    */
   HtmlEntry _recordResolveAngularEntryHtmlTaskResults(ResolveAngularEntryHtmlTask task) {
     Source source = task.source;
-    AnalysisException thrownException = task.exception;
+    CaughtException thrownException = task.exception;
     HtmlEntry htmlEntry = null;
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
@@ -4596,7 +4596,7 @@
     } else if (sourceEntry is! HtmlEntry) {
       // This shouldn't be possible because we should never have performed the task if the source
       // didn't represent an HTML file, but check to be safe.
-      throw new AnalysisException.con1("Internal error: attempting to resolve non-HTML file as an HTML file: ${source.fullName}");
+      throw new AnalysisException("Internal error: attempting to resolve non-HTML file as an HTML file: ${source.fullName}");
     }
     htmlEntry = sourceEntry as HtmlEntry;
     int sourceTime = getModificationStamp(source);
@@ -4607,7 +4607,7 @@
         _sourceChanged(source);
         htmlEntry = _getReadableHtmlEntry(source);
         if (htmlEntry == null) {
-          throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}");
+          throw new AnalysisException("An HTML file became a non-HTML file: ${source.fullName}");
         }
       }
       HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
@@ -4670,7 +4670,7 @@
   DartEntry _recordResolveDartUnitTaskResults(ResolveDartUnitTask task) {
     Source unitSource = task.source;
     Source librarySource = task.librarySource;
-    AnalysisException thrownException = task.exception;
+    CaughtException thrownException = task.exception;
     DartEntry dartEntry = null;
     SourceEntry sourceEntry = _cache.get(unitSource);
     if (sourceEntry == null) {
@@ -4678,7 +4678,7 @@
     } else if (sourceEntry is! DartEntry) {
       // This shouldn't be possible because we should never have performed the task if the source
       // didn't represent a Dart file, but check to be safe.
-      throw new AnalysisException.con1("Internal error: attempting to resolve non-Dart file as a Dart file: ${unitSource.fullName}");
+      throw new AnalysisException("Internal error: attempting to resolve non-Dart file as a Dart file: ${unitSource.fullName}");
     }
     dartEntry = sourceEntry as DartEntry;
     int sourceTime = getModificationStamp(unitSource);
@@ -4689,7 +4689,7 @@
         _sourceChanged(unitSource);
         dartEntry = _getReadableDartEntry(unitSource);
         if (dartEntry == null) {
-          throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
+          throw new AnalysisException("A Dart file became a non-Dart file: ${unitSource.fullName}");
         }
       }
       DartEntryImpl dartCopy = dartEntry.writableCopy;
@@ -4745,7 +4745,7 @@
    */
   HtmlEntry _recordResolveHtmlTaskResults(ResolveHtmlTask task) {
     Source source = task.source;
-    AnalysisException thrownException = task.exception;
+    CaughtException thrownException = task.exception;
     HtmlEntry htmlEntry = null;
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
@@ -4753,7 +4753,7 @@
     } else if (sourceEntry is! HtmlEntry) {
       // This shouldn't be possible because we should never have performed the task if the source
       // didn't represent an HTML file, but check to be safe.
-      throw new AnalysisException.con1("Internal error: attempting to resolve non-HTML file as an HTML file: ${source.fullName}");
+      throw new AnalysisException("Internal error: attempting to resolve non-HTML file as an HTML file: ${source.fullName}");
     }
     htmlEntry = sourceEntry as HtmlEntry;
     int sourceTime = getModificationStamp(source);
@@ -4764,7 +4764,7 @@
         _sourceChanged(source);
         htmlEntry = _getReadableHtmlEntry(source);
         if (htmlEntry == null) {
-          throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}");
+          throw new AnalysisException("An HTML file became a non-HTML file: ${source.fullName}");
         }
       }
       HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
@@ -4827,7 +4827,7 @@
    */
   DartEntry _recordScanDartTaskResults(ScanDartTask task) {
     Source source = task.source;
-    AnalysisException thrownException = task.exception;
+    CaughtException thrownException = task.exception;
     DartEntry dartEntry = null;
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
@@ -4835,7 +4835,7 @@
     } else if (sourceEntry is! DartEntry) {
       // This shouldn't be possible because we should never have performed the task if the source
       // didn't represent a Dart file, but check to be safe.
-      throw new AnalysisException.con1("Internal error: attempting to parse non-Dart file as a Dart file: ${source.fullName}");
+      throw new AnalysisException("Internal error: attempting to parse non-Dart file as a Dart file: ${source.fullName}");
     }
     dartEntry = sourceEntry as DartEntry;
     int sourceTime = getModificationStamp(source);
@@ -4846,7 +4846,7 @@
         _sourceChanged(source);
         dartEntry = _getReadableDartEntry(source);
         if (dartEntry == null) {
-          throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
+          throw new AnalysisException("A Dart file became a non-Dart file: ${source.fullName}");
         }
       }
       DartEntryImpl dartCopy = dartEntry.writableCopy;
@@ -5050,7 +5050,7 @@
     if (sourceEntry is HtmlEntry) {
       HtmlEntryImpl htmlCopy = sourceEntry.writableCopy;
       _invalidateAngularResolution(htmlCopy);
-      htmlCopy.recordContentError(new AnalysisException.con1("This source was marked as being deleted"));
+      htmlCopy.recordContentError(new CaughtException(new AnalysisException("This source was marked as being deleted"), null));
       _cache.put(source, htmlCopy);
     } else if (sourceEntry is DartEntry) {
       Set<Source> libraries = new Set<Source>();
@@ -5064,7 +5064,7 @@
         _invalidateLibraryResolution(librarySource);
       }
       DartEntryImpl dartCopy = sourceEntry.writableCopy;
-      dartCopy.recordContentError(new AnalysisException.con1("This source was marked as being deleted"));
+      dartCopy.recordContentError(new CaughtException(new AnalysisException("This source was marked as being deleted"), null));
       _cache.put(source, dartCopy);
     }
     _workManager.remove(source);
@@ -5754,7 +5754,7 @@
   /**
    * Return the exceptions that caused some entries to have a state of [CacheState#ERROR].
    */
-  List<AnalysisException> get exceptions;
+  List<CaughtException> get exceptions;
 
   /**
    * Return information about each of the partitions in the cache.
@@ -5775,7 +5775,7 @@
 
   List<Source> _sources = new List<Source>();
 
-  Set<AnalysisException> _exceptions = new Set<AnalysisException>();
+  Set<CaughtException> _exceptions = new Set<CaughtException>();
 
   List<AnalysisContextStatistics_PartitionData> _partitionData;
 
@@ -5790,7 +5790,7 @@
   }
 
   @override
-  List<AnalysisException> get exceptions => new List.from(_exceptions);
+  List<CaughtException> get exceptions => new List.from(_exceptions);
 
   @override
   List<AnalysisContextStatistics_PartitionData> get partitionData => _partitionData;
@@ -5822,7 +5822,7 @@
     }
     row._incState(state);
     if (state == CacheState.ERROR) {
-      AnalysisException exception = dartEntry.exception;
+      CaughtException exception = dartEntry.exception;
       if (exception != null) {
         _exceptions.add(exception);
       }
@@ -6175,39 +6175,6 @@
 }
 
 /**
- * Instances of the class `AnalysisException` represent an exception that occurred during the
- * analysis of one or more sources.
- */
-class AnalysisException extends JavaException {
-  /**
-   * Initialize a newly created exception.
-   */
-  AnalysisException() : super();
-
-  /**
-   * Initialize a newly created exception to have the given message.
-   *
-   * @param message the message associated with the exception
-   */
-  AnalysisException.con1(String message) : super(message);
-
-  /**
-   * Initialize a newly created exception to have the given message and cause.
-   *
-   * @param message the message associated with the exception
-   * @param cause the underlying exception that caused this exception
-   */
-  AnalysisException.con2(String message, Exception cause) : super(message, cause);
-
-  /**
-   * Initialize a newly created exception to have the given cause.
-   *
-   * @param cause the underlying exception that caused this exception
-   */
-  AnalysisException.con3(Exception cause) : super.withCause(cause);
-}
-
-/**
  * The enumeration `AnalysisLevel` encodes the different levels at which a source can be
  * analyzed.
  */
@@ -6278,6 +6245,13 @@
   bool get dart2jsHint;
 
   /**
+   * Return `true` if analysis is to include the new "deferred loading" support.
+   *
+   * @return `true` if analysis is to include the new "deferred loading" support
+   */
+  bool get enableDeferredLoading;
+
+  /**
    * Return `true` if errors, warnings and hints should be generated for sources in the SDK.
    * The default value is `false`.
    *
@@ -6319,9 +6293,14 @@
   static int DEFAULT_CACHE_SIZE = 64;
 
   /**
-   * The maximum number of sources for which AST structures should be kept in the cache.
+   * The default value for enabling deferred loading.
    */
-  int cacheSize = DEFAULT_CACHE_SIZE;
+  static bool DEFAULT_ENABLE_DEFERRED_LOADING = true;
+
+  /**
+   * A flag indicating whether analysis is to analyze Angular.
+   */
+  bool analyzeAngular = true;
 
   /**
    * A flag indicating whether analysis is to parse and analyze function bodies.
@@ -6329,11 +6308,26 @@
   bool analyzeFunctionBodies = true;
 
   /**
+   * A flag indicating whether analysis is to analyze Polymer.
+   */
+  bool analyzePolymer = true;
+
+  /**
+   * The maximum number of sources for which AST structures should be kept in the cache.
+   */
+  int cacheSize = DEFAULT_CACHE_SIZE;
+
+  /**
    * A flag indicating whether analysis is to generate dart2js related hint results.
    */
   bool dart2jsHint = true;
 
   /**
+   * A flag indicating whether analysis is to enable deferred loading.
+   */
+  bool enableDeferredLoading = DEFAULT_ENABLE_DEFERRED_LOADING;
+
+  /**
    * A flag indicating whether errors, warnings and hints should be generated for sources in the
    * SDK.
    */
@@ -6356,16 +6350,6 @@
   bool preserveComments = true;
 
   /**
-   * A flag indicating whether analysis is to analyze Angular.
-   */
-  bool analyzeAngular = true;
-
-  /**
-   * A flag indicating whether analysis is to analyze Polymer.
-   */
-  bool analyzePolymer = true;
-
-  /**
    * Initialize a newly created set of analysis options to have their default values.
    */
   AnalysisOptionsImpl();
@@ -6377,10 +6361,16 @@
    * @param options the analysis options whose values are being copied
    */
   AnalysisOptionsImpl.con1(AnalysisOptions options) {
+    analyzeAngular = options.analyzeAngular;
+    analyzeFunctionBodies = options.analyzeFunctionBodies;
+    analyzePolymer = options.analyzePolymer;
     cacheSize = options.cacheSize;
     dart2jsHint = options.dart2jsHint;
+    enableDeferredLoading = options.enableDeferredLoading;
+    _generateSdkErrors = options.generateSdkErrors;
     hint = options.hint;
     incremental = options.incremental;
+    preserveComments = options.preserveComments;
   }
 
   @override
@@ -6463,7 +6453,7 @@
    * The exception that was thrown while performing this task, or `null` if the task completed
    * successfully.
    */
-  AnalysisException _thrownException;
+  CaughtException _thrownException;
 
   /**
    * Initialize a newly created task to perform analysis within the given context.
@@ -6487,7 +6477,7 @@
    *
    * @return the exception that was thrown while performing this task
    */
-  AnalysisException get exception => _thrownException;
+  CaughtException get exception => _thrownException;
 
   /**
    * Perform this analysis task and use the given visitor to visit this task after it has completed.
@@ -6499,9 +6489,9 @@
   Object perform(AnalysisTaskVisitor visitor) {
     try {
       _safelyPerform();
-    } on AnalysisException catch (exception) {
-      _thrownException = exception;
-      AnalysisEngine.instance.logger.logInformation2("Task failed: ${taskDescription}", exception);
+    } on AnalysisException catch (exception, stackTrace) {
+      _thrownException = new CaughtException(exception, stackTrace);
+      AnalysisEngine.instance.logger.logInformation2("Task failed: ${taskDescription}", new CaughtException(exception, stackTrace));
     }
     return accept(visitor);
   }
@@ -6534,8 +6524,8 @@
       internalPerform();
     } on AnalysisException catch (exception) {
       throw exception;
-    } on JavaException catch (exception) {
-      throw new AnalysisException.con3(exception);
+    } on JavaException catch (exception, stackTrace) {
+      throw new AnalysisException("Exception", new CaughtException(exception, stackTrace));
     }
   }
 }
@@ -7686,7 +7676,7 @@
       _coreLibrary = _libraryMap[_coreLibrarySource];
       LibraryElement coreElement = _coreLibrary.libraryElement;
       if (coreElement == null) {
-        throw new AnalysisException.con1("Could not resolve dart:core");
+        throw new AnalysisException("Could not resolve dart:core");
       }
       instrumentation.metric3("buildLibraryMap", "complete");
       //
@@ -8153,7 +8143,9 @@
       }
     }
     if (sourceToRemove < 0) {
-      AnalysisEngine.instance.logger.logError2("Internal error: Could not flush data from the cache", new JavaException());
+      // This happens if the retention policy returns a priority of HIGH for all of the sources that
+      // have been recently used. This is the case, for example, when the list of priority sources
+      // is bigger than the current cache size.
       return null;
     }
     return _recentlyUsed.removeAt(sourceToRemove);
@@ -9387,7 +9379,7 @@
    * @param librarySource the source of the library in which the element model was being built
    * @param exception the exception that shows where the error occurred
    */
-  void recordBuildElementErrorInLibrary(Source librarySource, AnalysisException exception) {
+  void recordBuildElementErrorInLibrary(Source librarySource, CaughtException exception) {
     this.exception = exception;
     _element = null;
     _elementState = CacheState.ERROR;
@@ -9415,7 +9407,7 @@
   }
 
   @override
-  void recordContentError(AnalysisException exception) {
+  void recordContentError(CaughtException exception) {
     super.recordContentError(exception);
     recordScanError(exception);
   }
@@ -9427,7 +9419,7 @@
    * @param librarySource the source of the library in which hints were being generated
    * @param exception the exception that shows where the error occurred
    */
-  void recordHintErrorInLibrary(Source librarySource, AnalysisException exception) {
+  void recordHintErrorInLibrary(Source librarySource, CaughtException exception) {
     this.exception = exception;
     DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
     state.recordHintError();
@@ -9440,7 +9432,7 @@
    *
    * @param exception the exception that shows where the error occurred
    */
-  void recordParseError(AnalysisException exception) {
+  void recordParseError(CaughtException exception) {
     _sourceKind = SourceKind.UNKNOWN;
     _sourceKindState = CacheState.ERROR;
     _parseErrors = AnalysisError.NO_ERRORS;
@@ -9517,7 +9509,7 @@
    *
    * @param exception the exception that shows where the error occurred
    */
-  void recordResolutionError(AnalysisException exception) {
+  void recordResolutionError(CaughtException exception) {
     this.exception = exception;
     _element = null;
     _elementState = CacheState.ERROR;
@@ -9537,7 +9529,7 @@
    * @param librarySource the source of the library in which resolution was being performed
    * @param exception the exception that shows where the error occurred
    */
-  void recordResolutionErrorInLibrary(Source librarySource, AnalysisException exception) {
+  void recordResolutionErrorInLibrary(Source librarySource, CaughtException exception) {
     this.exception = exception;
     _element = null;
     _elementState = CacheState.ERROR;
@@ -9580,7 +9572,7 @@
    * @param exception the exception that shows where the error occurred
    */
   @override
-  void recordScanError(AnalysisException exception) {
+  void recordScanError(CaughtException exception) {
     super.recordScanError(exception);
     _scanErrors = AnalysisError.NO_ERRORS;
     _scanErrorsState = CacheState.ERROR;
@@ -9629,7 +9621,7 @@
    * @param librarySource the source of the library in which verification was being performed
    * @param exception the exception that shows where the error occurred
    */
-  void recordVerificationErrorInLibrary(Source librarySource, AnalysisException exception) {
+  void recordVerificationErrorInLibrary(Source librarySource, CaughtException exception) {
     this.exception = exception;
     DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
     state.recordVerificationError();
@@ -10440,7 +10432,7 @@
       // Use the ConstantVerifier to verify the use of constants. This needs to happen before using
       // the ErrorVerifier because some error codes need the computed constant values.
       //
-      ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, typeProvider);
+      ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, libraryElement, typeProvider);
       _unit.accept(constantVerifier);
       //
       // Use the ErrorVerifier to compute the rest of the errors.
@@ -10613,8 +10605,8 @@
       TimestampedData<String> data = context.getContents(source);
       _content = data.data;
       _modificationTime = data.modificationTime;
-    } on JavaException catch (exception) {
-      throw new AnalysisException.con2("Could not get contents of ${source}", exception);
+    } on JavaException catch (exception, stackTrace) {
+      throw new AnalysisException("Could not get contents of ${source}", new CaughtException(exception, stackTrace));
     }
   }
 }
@@ -11033,7 +11025,7 @@
   }
 
   @override
-  void recordContentError(AnalysisException exception) {
+  void recordContentError(CaughtException exception) {
     super.recordContentError(exception);
     recordParseError(exception);
   }
@@ -11044,7 +11036,7 @@
    *
    * @param exception the exception that shows where the error occurred
    */
-  void recordParseError(AnalysisException exception) {
+  void recordParseError(CaughtException exception) {
     // If the scanning and parsing of HTML are separated, the following line can be removed.
     recordScanError(exception);
     _parseErrors = AnalysisError.NO_ERRORS;
@@ -11062,7 +11054,7 @@
    *
    * @param exception the exception that shows where the error occurred
    */
-  void recordResolutionError(AnalysisException exception) {
+  void recordResolutionError(CaughtException exception) {
     this.exception = exception;
     _angularErrors = AnalysisError.NO_ERRORS;
     _angularErrorsState = CacheState.ERROR;
@@ -11523,7 +11515,7 @@
    * @param instrumentation the instrumentation builder being used to record the exception
    * @param exception the exception being reported
    */
-  static void _recordAnalysisException(InstrumentationBuilder instrumentation, AnalysisException exception) {
+  static void _recordAnalysisException(InstrumentationBuilder instrumentation, CaughtException exception) {
     instrumentation.record(exception);
   }
 
@@ -11618,8 +11610,8 @@
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.computeHtmlElement(source);
-    } on AnalysisException catch (e) {
-      _recordAnalysisException(instrumentation, e);
+    } on AnalysisException catch (e, stackTrace) {
+      _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace));
       throw e;
     } finally {
       instrumentation.log();
@@ -11648,8 +11640,8 @@
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.computeLibraryElement(source);
-    } on AnalysisException catch (e) {
-      _recordAnalysisException(instrumentation, e);
+    } on AnalysisException catch (e, stackTrace) {
+      _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace));
       throw e;
     } finally {
       instrumentation.log();
@@ -11663,8 +11655,8 @@
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.computeLineInfo(source);
-    } on AnalysisException catch (e) {
-      _recordAnalysisException(instrumentation, e);
+    } on AnalysisException catch (e, stackTrace) {
+      _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace));
       throw e;
     } finally {
       instrumentation.log();
@@ -12097,8 +12089,8 @@
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.parseCompilationUnit(source);
-    } on AnalysisException catch (e) {
-      _recordAnalysisException(instrumentation, e);
+    } on AnalysisException catch (e, stackTrace) {
+      _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace));
       throw e;
     } finally {
       instrumentation.log();
@@ -12112,8 +12104,8 @@
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.parseHtmlUnit(source);
-    } on AnalysisException catch (e) {
-      _recordAnalysisException(instrumentation, e);
+    } on AnalysisException catch (e, stackTrace) {
+      _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace));
       throw e;
     } finally {
       instrumentation.log();
@@ -12148,8 +12140,8 @@
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.resolveCompilationUnit(unitSource, library);
-    } on AnalysisException catch (e) {
-      _recordAnalysisException(instrumentation, e);
+    } on AnalysisException catch (e, stackTrace) {
+      _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace));
       throw e;
     } finally {
       instrumentation.log();
@@ -12163,8 +12155,8 @@
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.resolveCompilationUnit2(unitSource, librarySource);
-    } on AnalysisException catch (e) {
-      _recordAnalysisException(instrumentation, e);
+    } on AnalysisException catch (e, stackTrace) {
+      _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace));
       throw e;
     } finally {
       instrumentation.log();
@@ -12178,8 +12170,8 @@
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.resolveHtmlUnit(htmlSource);
-    } on AnalysisException catch (e) {
-      _recordAnalysisException(instrumentation, e);
+    } on AnalysisException catch (e, stackTrace) {
+      _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace));
       throw e;
     } finally {
       instrumentation.log();
@@ -12662,7 +12654,7 @@
    *
    * @param source the source that was removed while it was being analyzed
    */
-  ObsoleteSourceAnalysisException(Source source) : super.con1("The source '${source.fullName}' was removed while it was being analyzed") {
+  ObsoleteSourceAnalysisException(Source source) : super("The source '${source.fullName}' was removed while it was being analyzed") {
     this._source = source;
   }
 
@@ -12858,7 +12850,9 @@
     try {
       RecordingErrorListener errorListener = new RecordingErrorListener();
       Parser parser = new Parser(source, errorListener);
-      parser.parseFunctionBodies = context.analysisOptions.analyzeFunctionBodies;
+      AnalysisOptions options = context.analysisOptions;
+      parser.parseFunctionBodies = options.analyzeFunctionBodies;
+      parser.parseDeferredLibraries = options.enableDeferredLoading;
       _unit = parser.parseCompilationUnit(_tokenStream);
       _unit.lineInfo = lineInfo;
       AnalysisContext analysisContext = context;
@@ -12879,7 +12873,7 @@
                   _includedSources.add(referencedSource);
                 }
               } else {
-                throw new AnalysisException.con1("${runtimeType.toString()} failed to handle a ${directive.runtimeType.toString()}");
+                throw new AnalysisException("${runtimeType.toString()} failed to handle a ${directive.runtimeType.toString()}");
               }
             }
           }
@@ -13018,8 +13012,8 @@
       _unit.accept(new RecursiveXmlVisitor_ParseHtmlTask_internalPerform(this, errorListener));
       _errors = errorListener.getErrorsForSource(source);
       _referencedLibraries = librarySources;
-    } on JavaException catch (exception) {
-      throw new AnalysisException.con3(exception);
+    } on JavaException catch (exception, stackTrace) {
+      throw new AnalysisException("Exception", new CaughtException(exception, stackTrace));
     }
   }
 
@@ -14358,7 +14352,7 @@
     _modificationTime = resolvableUnit.modificationTime;
     CompilationUnit unit = resolvableUnit.compilationUnit;
     if (unit == null) {
-      throw new AnalysisException.con1("Internal error: computeResolvableCompilationUnit returned a value without a parsed Dart unit");
+      throw new AnalysisException("Internal error: computeResolvableCompilationUnit returned a value without a parsed Dart unit");
     }
     //
     // Resolve names in declarations.
@@ -14384,7 +14378,7 @@
       ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
       ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, _libraryElement, typeProvider, inheritanceManager);
       unit.accept(errorVerifier);
-      ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, typeProvider);
+      ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, _libraryElement, typeProvider);
       unit.accept(constantVerifier);
     } finally {
       counterHandleErrors.stop();
@@ -14625,8 +14619,8 @@
       _tokenStream = scanner.tokenize();
       _lineInfo = new LineInfo(scanner.lineStarts);
       _errors = errorListener.getErrorsForSource(source);
-    } on JavaException catch (exception) {
-      throw new AnalysisException.con3(exception);
+    } on JavaException catch (exception, stackTrace) {
+      throw new AnalysisException("Exception", new CaughtException(exception, stackTrace));
     } finally {
       timeCounterScan.stop();
     }
@@ -14692,7 +14686,7 @@
    *
    * @return the exception that caused one or more values to be uncomputable
    */
-  AnalysisException get exception;
+  CaughtException get exception;
 
   /**
    * Return `true` if the source was explicitly added to the context or `false` if the
@@ -14762,7 +14756,7 @@
   /**
    * The exception that caused one or more values to have a state of [CacheState#ERROR].
    */
-  AnalysisException _exception;
+  CaughtException _exception;
 
   /**
    * The state of the cached content.
@@ -14801,7 +14795,7 @@
         // This code should never be reached, but is a fail-safe in case an exception is not
         // recorded when it should be.
         //
-        _exception = new AnalysisException.con1("State set to ERROR without setting an exception");
+        _exception = new CaughtException(new AnalysisException("State set to ERROR without setting an exception"), null);
       }
     } else {
       _exception = null;
@@ -14815,7 +14809,7 @@
    * @return the exception that caused one or more values to be uncomputable
    */
   @override
-  AnalysisException get exception => _exception;
+  CaughtException get exception => _exception;
 
   /**
    * Return `true` if the source was explicitly added to the context or `false` if the
@@ -14868,7 +14862,7 @@
    *
    * @param exception the exception that shows where the error occurred
    */
-  void recordContentError(AnalysisException exception) {
+  void recordContentError(CaughtException exception) {
     _content = null;
     _contentState = CacheState.ERROR;
     recordScanError(exception);
@@ -14881,7 +14875,7 @@
    *
    * @param exception the exception that shows where the error occurred
    */
-  void recordScanError(AnalysisException exception) {
+  void recordScanError(CaughtException exception) {
     this.exception = exception;
     _lineInfo = null;
     _lineInfoState = CacheState.ERROR;
@@ -14996,7 +14990,7 @@
    *
    * @param exception the exception that caused one or more values to be uncomputable
    */
-  void set exception(AnalysisException exception) {
+  void set exception(CaughtException exception) {
     if (exception == null) {
       throw new IllegalArgumentException("exception cannot be null");
     }
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 5257ff0..1ad5ee8 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -492,8 +492,18 @@
    * 7.6.3 Constant Constructors: The superinitializer that appears, explicitly or implicitly, in
    * the initializer list of a constant constructor must specify a constant constructor of the
    * superclass of the immediately enclosing class or a compile-time error occurs.
+   *
+   * 9 Mixins: For each generative constructor named ... an implicitly declared constructor named
+   * ... is declared.
    */
-  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER', 15, "Constant constructor cannot call non-constant super constructor");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_MIXIN = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_MIXIN', 15, "Constant constructor cannot be declared for a class with a mixin");
+
+  /**
+   * 7.6.3 Constant Constructors: The superinitializer that appears, explicitly or implicitly, in
+   * the initializer list of a constant constructor must specify a constant constructor of the
+   * superclass of the immediately enclosing class or a compile-time error occurs.
+   */
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER', 16, "Constant constructor cannot call non-constant super constructor of '%s'");
 
   /**
    * 7.6.3 Constant Constructors: It is a compile-time error if a constant constructor is declared
@@ -501,12 +511,12 @@
    *
    * The above refers to both locally declared and inherited instance variables.
    */
-  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 16, "Cannot define the 'const' constructor for a class with non-final fields");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 17, "Cannot define the 'const' constructor for a class with non-final fields");
 
   /**
    * 12.12.2 Const: It is a compile-time error if <i>T</i> is a deferred type.
    */
-  static const CompileTimeErrorCode CONST_DEFERRED_CLASS = const CompileTimeErrorCode.con1('CONST_DEFERRED_CLASS', 17, "Deferred classes cannot be created with 'const'");
+  static const CompileTimeErrorCode CONST_DEFERRED_CLASS = const CompileTimeErrorCode.con1('CONST_DEFERRED_CLASS', 18, "Deferred classes cannot be created with 'const'");
 
   /**
    * 7.6.1 Generative Constructors: In checked mode, it is a dynamic type error if o is not
@@ -519,19 +529,19 @@
    * @param initializerType the name of the type of the initializer expression
    * @param fieldType the name of the type of the field
    */
-  static const CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE', 18, "The initializer type '%s' cannot be assigned to the field type '%s'");
+  static const CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE', 19, "The initializer type '%s' cannot be assigned to the field type '%s'");
 
   /**
    * 6.2 Formal Parameters: It is a compile-time error if a formal parameter is declared as a
    * constant variable.
    */
-  static const CompileTimeErrorCode CONST_FORMAL_PARAMETER = const CompileTimeErrorCode.con1('CONST_FORMAL_PARAMETER', 19, "Parameters cannot be 'const'");
+  static const CompileTimeErrorCode CONST_FORMAL_PARAMETER = const CompileTimeErrorCode.con1('CONST_FORMAL_PARAMETER', 20, "Parameters cannot be 'const'");
 
   /**
    * 5 Variables: A constant variable must be initialized to a compile-time constant or a
    * compile-time error occurs.
    */
-  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 20, "'const' variables must be constant value");
+  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 21, "'const' variables must be constant value");
 
   /**
    * 5 Variables: A constant variable must be initialized to a compile-time constant or a
@@ -540,20 +550,20 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY', 21, "Constant values from a deferred library cannot be used to initialized a 'const' variable");
+  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY', 22, "Constant values from a deferred library cannot be used to initialized a 'const' variable");
 
   /**
    * 7.5 Instance Variables: It is a compile-time error if an instance variable is declared to be
    * constant.
    */
-  static const CompileTimeErrorCode CONST_INSTANCE_FIELD = const CompileTimeErrorCode.con1('CONST_INSTANCE_FIELD', 22, "Only static fields can be declared as 'const'");
+  static const CompileTimeErrorCode CONST_INSTANCE_FIELD = const CompileTimeErrorCode.con1('CONST_INSTANCE_FIELD', 23, "Only static fields can be declared as 'const'");
 
   /**
    * 12.8 Maps: It is a compile-time error if the key of an entry in a constant map literal is an
    * instance of a class that implements the operator <i>==</i> unless the key is a string or
    * integer.
    */
-  static const CompileTimeErrorCode CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 23, "The constant map entry key expression type '%s' cannot override the == operator");
+  static const CompileTimeErrorCode CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 24, "The constant map entry key expression type '%s' cannot override the == operator");
 
   /**
    * 5 Variables: A constant variable must be initialized to a compile-time constant (12.1) or a
@@ -561,45 +571,45 @@
    *
    * @param name the name of the uninitialized final variable
    */
-  static const CompileTimeErrorCode CONST_NOT_INITIALIZED = const CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 24, "The const variable '%s' must be initialized");
+  static const CompileTimeErrorCode CONST_NOT_INITIALIZED = const CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 25, "The const variable '%s' must be initialized");
 
   /**
    * 12.11.2 Const: An expression of one of the forms !e, e1 && e2 or e1 || e2, where e, e1 and e2
    * are constant expressions that evaluate to a boolean value.
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL', 25, "An expression of type 'bool' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL', 26, "An expression of type 'bool' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms e1 == e2 or e1 != e2 where e1 and e2 are
    * constant expressions that evaluate to a numeric, string or boolean value or to null.
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL_NUM_STRING', 26, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL_NUM_STRING', 27, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms ~e, e1 ^ e2, e1 & e2, e1 | e2, e1 >> e2 or e1
    * << e2, where e, e1 and e2 are constant expressions that evaluate to an integer value or to
    * null.
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_INT = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_INT', 27, "An expression of type 'int' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_INT = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_INT', 28, "An expression of type 'int' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms e, e1 + e2, e1 - e2, e1 * e2, e1 / e2, e1 ~/
    * e2, e1 > e2, e1 < e2, e1 >= e2, e1 <= e2 or e1 % e2, where e, e1 and e2 are constant
    * expressions that evaluate to a numeric value or to null..
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_NUM = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_NUM', 28, "An expression of type 'num' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_NUM = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_NUM', 29, "An expression of type 'num' was expected");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static const CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_EXCEPTION', 29, "Evaluation of this constant expression causes exception");
+  static const CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_EXCEPTION', 30, "Evaluation of this constant expression causes exception");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static const CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_IDBZE', 30, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
+  static const CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_IDBZE', 31, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
 
   /**
    * 12.11.2 Const: If <i>T</i> is a parameterized type <i>S&lt;U<sub>1</sub>, &hellip;,
@@ -612,7 +622,7 @@
    * @see CompileTimeErrorCode#NEW_WITH_INVALID_TYPE_PARAMETERS
    * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
    */
-  static const CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_INVALID_TYPE_PARAMETERS', 31, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static const CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_INVALID_TYPE_PARAMETERS', 32, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
   /**
    * 12.11.2 Const: If <i>e</i> is of the form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
@@ -620,13 +630,13 @@
    * compile-time error if the type <i>T</i> does not declare a constant constructor with the same
    * name as the declaration of <i>T</i>.
    */
-  static const CompileTimeErrorCode CONST_WITH_NON_CONST = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONST', 32, "The constructor being called is not a 'const' constructor");
+  static const CompileTimeErrorCode CONST_WITH_NON_CONST = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONST', 33, "The constructor being called is not a 'const' constructor");
 
   /**
    * 12.11.2 Const: In all of the above cases, it is a compile-time error if <i>a<sub>i</sub>, 1
    * &lt;= i &lt;= n + k</i>, is not a compile-time constant expression.
    */
-  static const CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONSTANT_ARGUMENT', 33, "Arguments of a constant creation must be constant expressions");
+  static const CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONSTANT_ARGUMENT', 34, "Arguments of a constant creation must be constant expressions");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
@@ -639,12 +649,12 @@
    *
    * @param name the name of the non-type element
    */
-  static const CompileTimeErrorCode CONST_WITH_NON_TYPE = const CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 34, "The name '%s' is not a class");
+  static const CompileTimeErrorCode CONST_WITH_NON_TYPE = const CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 35, "The name '%s' is not a class");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> includes any type parameters.
    */
-  static const CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_TYPE_PARAMETERS', 35, "The constant creation cannot use a type parameter");
+  static const CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_TYPE_PARAMETERS', 36, "The constant creation cannot use a type parameter");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
@@ -653,7 +663,7 @@
    * @param typeName the name of the type
    * @param constructorName the name of the requested constant constructor
    */
-  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 36, "The class '%s' does not have a constant constructor '%s'");
+  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 37, "The class '%s' does not have a constant constructor '%s'");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
@@ -661,32 +671,32 @@
    *
    * @param typeName the name of the type
    */
-  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 37, "The class '%s' does not have a default constant constructor");
+  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 38, "The class '%s' does not have a default constant constructor");
 
   /**
    * 15.3.1 Typedef: It is a compile-time error if any default values are specified in the signature
    * of a function type alias.
    */
-  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 38, "Default values aren't allowed in typedefs");
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 39, "Default values aren't allowed in typedefs");
 
   /**
    * 6.2.1 Required Formals: By means of a function signature that names the parameter and describes
    * its type as a function type. It is a compile-time error if any default values are specified in
    * the signature of such a function type.
    */
-  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER', 39, "Default values aren't allowed in function type parameters");
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER', 40, "Default values aren't allowed in function type parameters");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> explicitly specifies a default value
    * for an optional parameter.
    */
-  static const CompileTimeErrorCode DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR', 40, "Default values aren't allowed in factory constructors that redirect to another constructor");
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR', 41, "Default values aren't allowed in factory constructors that redirect to another constructor");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
    * declared in the same scope.
    */
-  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_DEFAULT', 41, "The default constructor is already defined");
+  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_DEFAULT', 42, "The default constructor is already defined");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
@@ -694,7 +704,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 42, "The constructor with name '%s' is already defined");
+  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 43, "The constructor with name '%s' is already defined");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
@@ -707,7 +717,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static const CompileTimeErrorCode DUPLICATE_DEFINITION = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 43, "The name '%s' is already defined");
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 44, "The name '%s' is already defined");
 
   /**
    * 7. Classes: It is a compile-time error if a class has an instance member and a static member
@@ -719,21 +729,21 @@
    * @param name the name of the conflicting members
    * @see #DUPLICATE_DEFINITION
    */
-  static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 44, "The name '%s' is already defined in '%s'");
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 45, "The name '%s' is already defined in '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a compile-time error if <i>q<sub>i</sub> =
    * q<sub>j</sub></i> for any <i>i != j</i> [where <i>q<sub>i</sub></i> is the label for a named
    * argument].
    */
-  static const CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = const CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 45, "The argument for the named parameter '%s' was already specified");
+  static const CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = const CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 46, "The argument for the named parameter '%s' was already specified");
 
   /**
    * SDK implementation libraries can be exported only by other SDK libraries.
    *
    * @param uri the uri pointing to a library
    */
-  static const CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 46, "The library '%s' is internal and cannot be exported");
+  static const CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 47, "The library '%s' is internal and cannot be exported");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -741,7 +751,7 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static const CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_OF_NON_LIBRARY', 47, "The exported library '%s' must not have a part-of directive");
+  static const CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_OF_NON_LIBRARY', 48, "The exported library '%s' must not have a part-of directive");
 
   /**
    * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
@@ -749,7 +759,7 @@
    *
    * @param typeName the name of the superclass that was not found
    */
-  static const CompileTimeErrorCode EXTENDS_NON_CLASS = const CompileTimeErrorCode.con1('EXTENDS_NON_CLASS', 48, "Classes can only extend other classes");
+  static const CompileTimeErrorCode EXTENDS_NON_CLASS = const CompileTimeErrorCode.con1('EXTENDS_NON_CLASS', 49, "Classes can only extend other classes");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -768,7 +778,7 @@
    * @param typeName the name of the type that cannot be extended
    * @see #IMPLEMENTS_DISALLOWED_CLASS
    */
-  static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 49, "Classes cannot extend '%s'");
+  static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 50, "Classes cannot extend '%s'");
 
   /**
    * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
@@ -778,7 +788,7 @@
    * @see #IMPLEMENTS_DEFERRED_CLASS
    * @see #MIXIN_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode EXTENDS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DEFERRED_CLASS', 50, "This class cannot extend the deferred class '%s'");
+  static const CompileTimeErrorCode EXTENDS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DEFERRED_CLASS', 51, "This class cannot extend the deferred class '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -790,21 +800,21 @@
    * @param requiredCount the maximum number of positional arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static const CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = const CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 51, "%d positional arguments expected, but %d found");
+  static const CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = const CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 52, "%d positional arguments expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if more than one initializer corresponding to a given instance variable appears in
    * <i>k</i>'s list.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 52, "The field '%s' cannot be initialized twice in the same constructor");
+  static const CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 53, "The field '%s' cannot be initialized twice in the same constructor");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if <i>k</i>'s initializer list contains an initializer for a variable that is initialized
    * by means of an initializing formal of <i>k</i>.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 53, "Fields cannot be initialized in both the parameter list and the initializers");
+  static const CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 54, "Fields cannot be initialized in both the parameter list and the initializers");
 
   /**
    * 5 Variables: It is a compile-time error if a final instance variable that has is initialized by
@@ -813,19 +823,19 @@
    *
    * @param name the name of the field in question
    */
-  static const CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = const CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 54, "'%s' is a final field and so can only be set once");
+  static const CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = const CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 55, "'%s' is a final field and so can only be set once");
 
   /**
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 55, "Initializing formal fields cannot be used in factory constructors");
+  static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 56, "Initializing formal fields cannot be used in factory constructors");
 
   /**
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 56, "Initializing formal fields can only be used in constructors");
+  static const CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 57, "Initializing formal fields can only be used in constructors");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -834,7 +844,7 @@
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 57, "The redirecting constructor cannot have a field initializer");
+  static const CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 58, "The redirecting constructor cannot have a field initializer");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -842,7 +852,7 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static const CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = const CompileTimeErrorCode.con1('GETTER_AND_METHOD_WITH_SAME_NAME', 58, "'%s' cannot be used to name a getter, there is already a method with the same name");
+  static const CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = const CompileTimeErrorCode.con1('GETTER_AND_METHOD_WITH_SAME_NAME', 59, "'%s' cannot be used to name a getter, there is already a method with the same name");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
@@ -852,7 +862,7 @@
    * @see #EXTENDS_DEFERRED_CLASS
    * @see #MIXIN_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode IMPLEMENTS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DEFERRED_CLASS', 59, "This class cannot implement the deferred class '%s'");
+  static const CompileTimeErrorCode IMPLEMENTS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DEFERRED_CLASS', 60, "This class cannot implement the deferred class '%s'");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -871,13 +881,13 @@
    * @param typeName the name of the type that cannot be implemented
    * @see #EXTENDS_DISALLOWED_CLASS
    */
-  static const CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 60, "Classes cannot implement '%s'");
+  static const CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 61, "Classes cannot implement '%s'");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class includes
    * type dynamic.
    */
-  static const CompileTimeErrorCode IMPLEMENTS_DYNAMIC = const CompileTimeErrorCode.con1('IMPLEMENTS_DYNAMIC', 61, "Classes cannot implement 'dynamic'");
+  static const CompileTimeErrorCode IMPLEMENTS_DYNAMIC = const CompileTimeErrorCode.con1('IMPLEMENTS_DYNAMIC', 62, "Classes cannot implement 'dynamic'");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
@@ -886,7 +896,7 @@
    *
    * @param typeName the name of the interface that was not found
    */
-  static const CompileTimeErrorCode IMPLEMENTS_NON_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_NON_CLASS', 62, "Classes can only implement other classes");
+  static const CompileTimeErrorCode IMPLEMENTS_NON_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_NON_CLASS', 63, "Classes can only implement other classes");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if a type <i>T</i> appears more than once in
@@ -894,7 +904,7 @@
    *
    * @param className the name of the class that is implemented more than once
    */
-  static const CompileTimeErrorCode IMPLEMENTS_REPEATED = const CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 63, "'%s' can only be implemented once");
+  static const CompileTimeErrorCode IMPLEMENTS_REPEATED = const CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 64, "'%s' can only be implemented once");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the superclass of a class <i>C</i> appears
@@ -902,7 +912,7 @@
    *
    * @param className the name of the class that appears in both "extends" and "implements" clauses
    */
-  static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 64, "'%s' cannot be used in both 'extends' and 'implements' clauses");
+  static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 65, "'%s' cannot be used in both 'extends' and 'implements' clauses");
 
   /**
    * 7.6.1 Generative Constructors: Note that <b>this</b> is not in scope on the right hand side of
@@ -914,14 +924,14 @@
    *
    * @param name the name of the type in question
    */
-  static const CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = const CompileTimeErrorCode.con1('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 65, "Only static members can be accessed in initializers");
+  static const CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = const CompileTimeErrorCode.con1('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 66, "Only static members can be accessed in initializers");
 
   /**
    * SDK implementation libraries can be imported only by other SDK libraries.
    *
    * @param uri the uri pointing to a library
    */
-  static const CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_INTERNAL_LIBRARY', 66, "The library '%s' is internal and cannot be imported");
+  static const CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_INTERNAL_LIBRARY', 67, "The library '%s' is internal and cannot be imported");
 
   /**
    * 14.1 Imports: It is a compile-time error if the specified URI of an immediate import does not
@@ -930,7 +940,7 @@
    * @param uri the uri pointing to a non-library declaration
    * @see StaticWarningCode#IMPORT_OF_NON_LIBRARY
    */
-  static const CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_OF_NON_LIBRARY', 67, "The imported library '%s' must not have a part-of directive");
+  static const CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_OF_NON_LIBRARY', 68, "The imported library '%s' must not have a part-of directive");
 
   /**
    * 13.9 Switch: It is a compile-time error if values of the expressions <i>e<sub>k</sub></i> are
@@ -939,7 +949,7 @@
    * @param expressionSource the expression source code that is the unexpected type
    * @param expectedType the name of the expected type
    */
-  static const CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = const CompileTimeErrorCode.con1('INCONSISTENT_CASE_EXPRESSION_TYPES', 68, "Case expressions must have the same types, '%s' is not a '%s'");
+  static const CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = const CompileTimeErrorCode.con1('INCONSISTENT_CASE_EXPRESSION_TYPES', 69, "Case expressions must have the same types, '%s' is not a '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
@@ -950,7 +960,7 @@
    *          immediately enclosing class
    * @see #INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD
    */
-  static const CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_NON_EXISTANT_FIELD', 69, "'%s' is not a variable in the enclosing class");
+  static const CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_NON_EXISTANT_FIELD', 70, "'%s' is not a variable in the enclosing class");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
@@ -961,7 +971,7 @@
    *          enclosing class
    * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
    */
-  static const CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_STATIC_FIELD', 70, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+  static const CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_STATIC_FIELD', 71, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -973,7 +983,7 @@
    * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
    * @see #INITIALIZER_FOR_NON_EXISTANT_FIELD
    */
-  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 71, "'%s' is not a variable in the enclosing class");
+  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 72, "'%s' is not a variable in the enclosing class");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -984,20 +994,20 @@
    *          enclosing class
    * @see #INITIALIZER_FOR_STATIC_FIELD
    */
-  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 72, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 73, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
 
   /**
    * 12.30 Identifier Reference: Otherwise, e is equivalent to the property extraction
    * <b>this</b>.<i>id</i>.
    */
-  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 73, "Instance member cannot be accessed from static method");
+  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 74, "Instance member cannot be accessed from static method");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 74, "Annotation can be only constant variable or constant constructor invocation");
+  static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 75, "Annotation can be only constant variable or constant constructor invocation");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
@@ -1007,7 +1017,7 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY', 75, "Constant values from a deferred library cannot be used as annotations");
+  static const CompileTimeErrorCode INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY', 76, "Constant values from a deferred library cannot be used as annotations");
 
   /**
    * TODO(brianwilkerson) Remove this when we have decided on how to report errors in compile-time
@@ -1015,26 +1025,26 @@
    *
    * See TODOs in ConstantVisitor
    */
-  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 76, "Invalid constant value");
+  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 77, "Invalid constant value");
 
   /**
    * 7.6 Constructors: It is a compile-time error if the name of a constructor is not a constructor
    * name.
    */
-  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 77, "Invalid constructor name");
+  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 78, "Invalid constructor name");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>M</i> is not the name of the immediately
    * enclosing class.
    */
-  static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 78, "The name of the immediately enclosing class expected");
+  static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 79, "The name of the immediately enclosing class expected");
 
   /**
    * 12.10 This: It is a compile-time error if this appears in a top-level function or variable
    * initializer, in a factory constructor, or in a static method or variable initializer, or in the
    * initializer of an instance variable.
    */
-  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 79, "Invalid reference to 'this' expression");
+  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 80, "Invalid reference to 'this' expression");
 
   /**
    * 12.6 Lists: It is a compile time error if the type argument of a constant list literal includes
@@ -1042,7 +1052,7 @@
    *
    * @name the name of the type parameter
    */
-  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 80, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 81, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 12.7 Maps: It is a compile time error if the type arguments of a constant map literal include a
@@ -1050,7 +1060,7 @@
    *
    * @name the name of the type parameter
    */
-  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 81, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 82, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1065,7 +1075,7 @@
    * @param uri the URI that is invalid
    * @see #URI_DOES_NOT_EXIST
    */
-  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 82, "Invalid URI syntax: '%s'");
+  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 83, "Invalid URI syntax: '%s'");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1076,7 +1086,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 83, "Cannot reference label '%s' declared in an outer method");
+  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 84, "Cannot reference label '%s' declared in an outer method");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1087,7 +1097,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 84, "Cannot reference undefined label '%s'");
+  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 85, "Cannot reference undefined label '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -1101,7 +1111,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 85, "The element type '%s' cannot be assigned to the list type '%s'");
+  static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 86, "The element type '%s' cannot be assigned to the list type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1115,7 +1125,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 86, "The element type '%s' cannot be assigned to the map key type '%s'");
+  static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 87, "The element type '%s' cannot be assigned to the map key type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1129,13 +1139,13 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 87, "The element type '%s' cannot be assigned to the map value type '%s'");
+  static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 88, "The element type '%s' cannot be assigned to the map value type '%s'");
 
   /**
    * 7 Classes: It is a compile time error if a class <i>C</i> declares a member with the same name
    * as <i>C</i>.
    */
-  static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 88, "Class members cannot have the same name as the enclosing class");
+  static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 89, "Class members cannot have the same name as the enclosing class");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -1143,17 +1153,17 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 89, "'%s' cannot be used to name a method, there is already a getter with the same name");
+  static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 90, "'%s' cannot be used to name a method, there is already a getter with the same name");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant list literal.
    */
-  static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 90, "List literals must be prefixed with 'const' when used as a constant expression");
+  static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 91, "List literals must be prefixed with 'const' when used as a constant expression");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant map literal.
    */
-  static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 91, "Map literals must be prefixed with 'const' when used as a constant expression");
+  static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 92, "Map literals must be prefixed with 'const' when used as a constant expression");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin explicitly declares a
@@ -1161,7 +1171,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 92, "The class '%s' cannot be used as a mixin because it declares a constructor");
+  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 93, "The class '%s' cannot be used as a mixin because it declares a constructor");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if the with clause of a mixin application
@@ -1171,7 +1181,7 @@
    * @see #EXTENDS_DEFERRED_CLASS
    * @see #IMPLEMENTS_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 93, "This class cannot mixin the deferred class '%s'");
+  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 94, "This class cannot mixin the deferred class '%s'");
 
   /**
    * 9 Mixins: It is a compile-time error if a mixin is derived from a class whose superclass is not
@@ -1179,7 +1189,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 94, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
+  static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 95, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -1198,43 +1208,43 @@
    * @param typeName the name of the type that cannot be extended
    * @see #IMPLEMENTS_DISALLOWED_CLASS
    */
-  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 95, "Classes cannot mixin '%s'");
+  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 96, "Classes cannot mixin '%s'");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>M</i> does not denote a class or mixin
    * available in the immediately enclosing scope.
    */
-  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 96, "Classes can only mixin other classes");
+  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 97, "Classes can only mixin other classes");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin refers to super.
    */
-  static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 97, "The class '%s' cannot be used as a mixin because it references 'super'");
+  static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 98, "The class '%s' cannot be used as a mixin because it references 'super'");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>S</i> does not denote a class available
    * in the immediately enclosing scope.
    */
-  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 98, "Mixin can only be applied to class");
+  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 99, "Mixin can only be applied to class");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 99, "Constructor may have at most one 'this' redirection");
+  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 100, "Constructor may have at most one 'this' redirection");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. Then <i>k</i> may
    * include at most one superinitializer in its initializer list or a compile time error occurs.
    */
-  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 100, "Constructor may have at most one 'super' initializer");
+  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 101, "Constructor may have at most one 'super' initializer");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 101, "Annotation creation must have arguments");
+  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 102, "Annotation creation must have arguments");
 
   /**
    * 7.6.1 Generative Constructors: If no superinitializer is provided, an implicit superinitializer
@@ -1244,7 +1254,7 @@
    * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
    * generative constructor named <i>S</i> (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 102, "The class '%s' does not have a default constructor");
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 103, "The class '%s' does not have a default constructor");
 
   /**
    * 7.6 Constructors: Iff no constructor is specified for a class <i>C</i>, it implicitly has a
@@ -1253,13 +1263,24 @@
    * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
    * generative constructor named <i>S</i> (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 103, "The class '%s' does not have a default constructor");
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 104, "The class '%s' does not have a default constructor");
 
   /**
    * 13.2 Expression Statements: It is a compile-time error if a non-constant map literal that has
    * no explicit type arguments appears in a place where a statement is expected.
    */
-  static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 104, "A non-constant map literal without type arguments cannot be used as an expression statement");
+  static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 105, "A non-constant map literal without type arguments cannot be used as an expression statement");
+
+  /**
+   * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
+   * label<sub>1j1</sub> case e<sub>1</sub>: s<sub>1</sub> &hellip; label<sub>n1</sub> &hellip;
+   * label<sub>njn</sub> case e<sub>n</sub>: s<sub>n</sub> default: s<sub>n+1</sub>}</i> or the form
+   * <i>switch (e) { label<sub>11</sub> &hellip; label<sub>1j1</sub> case e<sub>1</sub>:
+   * s<sub>1</sub> &hellip; label<sub>n1</sub> &hellip; label<sub>njn</sub> case e<sub>n</sub>:
+   * s<sub>n</sub>}</i>, it is a compile-time error if the expressions <i>e<sub>k</sub></i> are not
+   * compile-time constants, for all <i>1 &lt;= k &lt;= n</i>.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 106, "Case expressions must be constant");
 
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
@@ -1270,17 +1291,16 @@
    * s<sub>n</sub>}</i>, it is a compile-time error if the expressions <i>e<sub>k</sub></i> are not
    * compile-time constants, for all <i>1 &lt;= k &lt;= n</i>.
    *
-   * TODO (jwren) For this and all other NON_CONSTANT_* error codes we need a corresponding
-   * NON_CONSTANT_*_FROM_DEFERRED_LIBRARY, see NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY or
-   * CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY.
+   * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
+   * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 105, "Case expressions must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY', 107, "Constant values from a deferred library cannot be used as a case expression");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
    * parameter is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 106, "Default values of an optional parameter must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 108, "Default values of an optional parameter must be constant");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
@@ -1289,38 +1309,77 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY', 107, "Constant values from a deferred library cannot be used as a default parameter value");
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY', 109, "Constant values from a deferred library cannot be used as a default parameter value");
 
   /**
    * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
    * compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 108, "'const' lists must have all constant values");
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 110, "'const' lists must have all constant values");
+
+  /**
+   * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
+   * compile-time constant.
+   *
+   * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
+   * deferred prefix.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY', 111, "Constant values from a deferred library cannot be used as values in a 'const' list");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 109, "The keys in a map must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 112, "The keys in a map must be constant");
+
+  /**
+   * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
+   * literal is not a compile-time constant.
+   *
+   * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
+   * deferred prefix.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY', 113, "Constant values from a deferred library cannot be used as keys in a map");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 110, "The values in a 'const' map must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 114, "The values in a 'const' map must be constant");
+
+  /**
+   * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
+   * literal is not a compile-time constant.
+   *
+   * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
+   * deferred prefix.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY', 115, "Constant values from a deferred library cannot be used as values in a 'const' map");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
+   *
+   * "From deferred library" case is covered by
+   * [CompileTimeErrorCode#INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY].
    */
-  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 111, "Annotation creation can use only 'const' constructor");
+  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 116, "Annotation creation can use only 'const' constructor");
 
   /**
    * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
    * constant constructor must be a potentially constant expression, or a compile-time error occurs.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 112, "Initializer expressions in constant constructors must be constants");
+  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 117, "Initializer expressions in constant constructors must be constants");
+
+  /**
+   * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
+   * constant constructor must be a potentially constant expression, or a compile-time error occurs.
+   *
+   * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
+   * deferred prefix.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY', 118, "Constant values from a deferred library cannot be used as constant initializers");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
@@ -1331,7 +1390,7 @@
    * @param requiredCount the expected number of required arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 113, "%d required argument(s) expected, but %d found");
+  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 119, "%d required argument(s) expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1339,17 +1398,17 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 114, "The generative constructor '%s' expected, but factory found");
+  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 120, "The generative constructor '%s' expected, but factory found");
 
   /**
    * 7.9 Superclasses: It is a compile-time error to specify an extends clause for class Object.
    */
-  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 115, "");
+  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 121, "");
 
   /**
    * 7.1.1 Operators: It is a compile-time error to declare an optional parameter in an operator.
    */
-  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 116, "Optional parameters are not allowed when defining an operator");
+  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 122, "Optional parameters are not allowed when defining an operator");
 
   /**
    * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
@@ -1357,25 +1416,25 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 117, "The included part '%s' must have a part-of directive");
+  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 123, "The included part '%s' must have a part-of directive");
 
   /**
    * 14.1 Imports: It is a compile-time error if the current library declares a top-level member
    * named <i>p</i>.
    */
-  static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 118, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
+  static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 124, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the name of a named optional parameter
    * begins with an '_' character.
    */
-  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 119, "Named optional parameters cannot start with an underscore");
+  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 125, "Named optional parameters cannot start with an underscore");
 
   /**
    * 12.1 Constants: It is a compile-time error if the value of a compile-time constant expression
    * depends on itself.
    */
-  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 120, "");
+  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 126, "");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -1386,13 +1445,13 @@
    *
    * https://code.google.com/p/dart/issues/detail?id=954
    */
-  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 121, "Cycle in redirecting generative constructors");
+  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 127, "Cycle in redirecting generative constructors");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if a redirecting factory constructor redirects to
    * itself, either directly or indirectly via a sequence of redirections.
    */
-  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 122, "Cycle in redirecting factory constructors");
+  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 128, "Cycle in redirecting factory constructors");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1405,7 +1464,7 @@
    * @param className the name of the class that implements itself recursively
    * @param strImplementsPath a string representation of the implements loop
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 123, "'%s' cannot be a superinterface of itself: %s");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 129, "'%s' cannot be a superinterface of itself: %s");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1417,7 +1476,7 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 124, "'%s' cannot extend itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 130, "'%s' cannot extend itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1429,49 +1488,61 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 125, "'%s' cannot implement itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 131, "'%s' cannot implement itself");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 126, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 132, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 127, "The name '%s' is not a type and cannot be used in a redirected constructor");
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 133, "The name '%s' is not a type and cannot be used in a redirected constructor");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 128, "Constant factory constructor cannot delegate to a non-constant constructor");
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 134, "Constant factory constructor cannot delegate to a non-constant constructor");
+
+  /**
+   * 7.6.1 Generative constructors: A generative constructor may be <i>redirecting</i>, in which
+   * case its only action is to invoke another generative constructor.
+   */
+  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR', 135, "The constructor '%s' could not be found in '%s'");
+
+  /**
+   * 7.6.1 Generative constructors: A generative constructor may be <i>redirecting</i>, in which
+   * case its only action is to invoke another generative constructor.
+   */
+  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR', 136, "Generative constructor cannot redirect to a factory constructor");
 
   /**
    * 5 Variables: A local variable may only be referenced at a source code location that is after
    * its initializer, if any, is complete, or a compile-time error occurs.
    */
-  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 129, "Local variables cannot be referenced before they are declared");
+  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 137, "Local variables cannot be referenced before they are declared");
 
   /**
    * 12.8.1 Rethrow: It is a compile-time error if an expression of the form <i>rethrow;</i> is not
    * enclosed within a on-catch clause.
    */
-  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 130, "rethrow must be inside of a catch clause");
+  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 138, "rethrow must be inside of a catch clause");
 
   /**
    * 13.12 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
    * appears in a generative constructor.
    */
-  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 131, "Constructors cannot return a value");
+  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 139, "Constructors cannot return a value");
 
   /**
    * 14.1 Imports: It is a compile-time error if a prefix used in a deferred import is used in
    * another import clause.
    */
-  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 132, "The prefix of a deferred import cannot be used in other import directives");
+  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 140, "The prefix of a deferred import cannot be used in other import directives");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -1481,19 +1552,19 @@
    * initializer list, in class Object, in a factory constructor, or in a static method or variable
    * initializer.
    */
-  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 133, "Invalid context for 'super' invocation");
+  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 141, "Invalid context for 'super' invocation");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 134, "The redirecting constructor cannot have a 'super' initializer");
+  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 142, "The redirecting constructor cannot have a 'super' initializer");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
    * error if a generative constructor of class Object includes a superinitializer.
    */
-  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 135, "");
+  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 143, "");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -1512,19 +1583,19 @@
    * @param boundingTypeName the name of the bounding type
    * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
-  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 136, "'%s' does not extend '%s'");
+  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 144, "'%s' does not extend '%s'");
 
   /**
    * 15.3.1 Typedef: Any self reference, either directly, or recursively via another typedef, is a
    * compile time error.
    */
-  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 137, "Type alias cannot reference itself directly or recursively via another typedef");
+  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 145, "Type alias cannot reference itself directly or recursively via another typedef");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
    * scope, optionally followed by type arguments.
    */
-  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 138, "Undefined class '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 146, "Undefined class '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1532,7 +1603,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 139, "The class '%s' does not have a generative constructor '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 147, "The class '%s' does not have a generative constructor '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1540,7 +1611,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 140, "The class '%s' does not have a default generative constructor");
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 148, "The class '%s' does not have a default generative constructor");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -1552,7 +1623,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 141, "The named parameter '%s' is not defined");
+  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 149, "The named parameter '%s' is not defined");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1567,7 +1638,7 @@
    * @param uri the URI pointing to a non-existent file
    * @see #INVALID_URI
    */
-  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 142, "Target of URI does not exist: '%s'");
+  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 150, "Target of URI does not exist: '%s'");
 
   /**
    * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
@@ -1579,7 +1650,7 @@
    * 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that describes a URI is
    * not a compile-time constant, or if <i>x</i> involves string interpolation.
    */
-  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 143, "URIs cannot use string interpolation");
+  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 151, "URIs cannot use string interpolation");
 
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
@@ -1592,7 +1663,7 @@
    * @param expectedNumberOfParameters the number of parameters expected
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 144, "Operator '%s' should declare exactly %d parameter(s), but %d found");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 152, "Operator '%s' should declare exactly %d parameter(s), but %d found");
 
   /**
    * 7.1.1 Operators: It is a compile time error if the arity of the user-declared operator - is not
@@ -1600,13 +1671,13 @@
    *
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 145, "Operator '-' should declare 0 or 1 parameter, but %d found");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 153, "Operator '-' should declare 0 or 1 parameter, but %d found");
 
   /**
    * 7.3 Setters: It is a compile-time error if a setter's formal parameter list does not include
    * exactly one required formal parameter <i>p</i>.
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 146, "Setters should declare exactly one required parameter");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 154, "Setters should declare exactly one required parameter");
 
   static const List<CompileTimeErrorCode> values = const [
       AMBIGUOUS_EXPORT,
@@ -1624,6 +1695,7 @@
       CONFLICTING_TYPE_VARIABLE_AND_CLASS,
       CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
       CONST_CONSTRUCTOR_THROWS_EXCEPTION,
+      CONST_CONSTRUCTOR_WITH_MIXIN,
       CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
       CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
       CONST_DEFERRED_CLASS,
@@ -1715,13 +1787,18 @@
       NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
       NON_CONST_MAP_AS_EXPRESSION_STATEMENT,
       NON_CONSTANT_CASE_EXPRESSION,
+      NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY,
       NON_CONSTANT_DEFAULT_VALUE,
       NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY,
       NON_CONSTANT_LIST_ELEMENT,
+      NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY,
       NON_CONSTANT_MAP_KEY,
+      NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY,
       NON_CONSTANT_MAP_VALUE,
+      NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY,
       NON_CONSTANT_ANNOTATION_CONSTRUCTOR,
       NON_CONSTANT_VALUE_IN_INITIALIZER,
+      NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY,
       NOT_ENOUGH_REQUIRED_ARGUMENTS,
       NON_GENERATIVE_CONSTRUCTOR,
       OBJECT_CANNOT_EXTEND_ANOTHER_CLASS,
@@ -1738,6 +1815,8 @@
       REDIRECT_TO_MISSING_CONSTRUCTOR,
       REDIRECT_TO_NON_CLASS,
       REDIRECT_TO_NON_CONST_CONSTRUCTOR,
+      REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR,
+      REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR,
       REFERENCED_BEFORE_DECLARATION,
       RETHROW_OUTSIDE_CATCH,
       RETURN_IN_GENERATIVE_CONSTRUCTOR,
@@ -2675,10 +2754,18 @@
   static const StaticTypeWarningCode NON_BOOL_NEGATION_EXPRESSION = const StaticTypeWarningCode.con1('NON_BOOL_NEGATION_EXPRESSION', 10, "Negation argument must have a static type of 'bool'");
 
   /**
+   * 12.21 Logical Boolean Expressions: It is a static type warning if the static types of both of
+   * <i>e<sub>1</sub></i> and <i>e<sub>2</sub></i> may not be assigned to bool.
+   *
+   * @param operator the lexeme of the logical operator
+   */
+  static const StaticTypeWarningCode NON_BOOL_OPERAND = const StaticTypeWarningCode.con1('NON_BOOL_OPERAND', 11, "The operands of the '%s' operator must be assignable to 'bool'");
+
+  /**
    * 15.8 Parameterized Types: It is a static type warning if <i>A<sub>i</sub>, 1 &lt;= i &lt;=
    * n</i> does not denote a type in the enclosing lexical scope.
    */
-  static const StaticTypeWarningCode NON_TYPE_AS_TYPE_ARGUMENT = const StaticTypeWarningCode.con1('NON_TYPE_AS_TYPE_ARGUMENT', 11, "The name '%s' is not a type and cannot be used as a parameterized type");
+  static const StaticTypeWarningCode NON_TYPE_AS_TYPE_ARGUMENT = const StaticTypeWarningCode.con1('NON_TYPE_AS_TYPE_ARGUMENT', 12, "The name '%s' is not a type and cannot be used as a parameterized type");
 
   /**
    * 13.11 Return: It is a static type warning if the type of <i>e</i> may not be assigned to the
@@ -2688,7 +2775,7 @@
    * @param expectedReturnType the expected return type as defined by the method
    * @param methodName the name of the method
    */
-  static const StaticTypeWarningCode RETURN_OF_INVALID_TYPE = const StaticTypeWarningCode.con1('RETURN_OF_INVALID_TYPE', 12, "The return type '%s' is not a '%s', as defined by the method '%s'");
+  static const StaticTypeWarningCode RETURN_OF_INVALID_TYPE = const StaticTypeWarningCode.con1('RETURN_OF_INVALID_TYPE', 13, "The return type '%s' is not a '%s', as defined by the method '%s'");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -2713,7 +2800,7 @@
    * @param boundingTypeName the name of the bounding type
    * @see #TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND
    */
-  static const StaticTypeWarningCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const StaticTypeWarningCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 13, "'%s' does not extend '%s'");
+  static const StaticTypeWarningCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const StaticTypeWarningCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 14, "'%s' does not extend '%s'");
 
   /**
    * 10 Generics: It is a static type warning if a type parameter is a supertype of its upper bound.
@@ -2721,7 +2808,7 @@
    * @param typeParameterName the name of the type parameter
    * @see #TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
-  static const StaticTypeWarningCode TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND = const StaticTypeWarningCode.con1('TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND', 14, "'%s' cannot be a supertype of its upper bound");
+  static const StaticTypeWarningCode TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND = const StaticTypeWarningCode.con1('TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND', 15, "'%s' cannot be a supertype of its upper bound");
 
   /**
    * 12.15.3 Unqualified Invocation: If there exists a lexically visible declaration named
@@ -2732,7 +2819,7 @@
    *
    * @param methodName the name of the method that is undefined
    */
-  static const StaticTypeWarningCode UNDEFINED_FUNCTION = const StaticTypeWarningCode.con1('UNDEFINED_FUNCTION', 15, "The function '%s' is not defined");
+  static const StaticTypeWarningCode UNDEFINED_FUNCTION = const StaticTypeWarningCode.con1('UNDEFINED_FUNCTION', 16, "The function '%s' is not defined");
 
   /**
    * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is a static type
@@ -2741,7 +2828,7 @@
    * @param getterName the name of the getter
    * @param enclosingType the name of the enclosing type where the getter is being looked for
    */
-  static const StaticTypeWarningCode UNDEFINED_GETTER = const StaticTypeWarningCode.con1('UNDEFINED_GETTER', 16, "There is no such getter '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_GETTER = const StaticTypeWarningCode.con1('UNDEFINED_GETTER', 17, "There is no such getter '%s' in '%s'");
 
   /**
    * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>. It is a static type
@@ -2750,7 +2837,7 @@
    * @param methodName the name of the method that is undefined
    * @param typeName the resolved type name that the method lookup is happening on
    */
-  static const StaticTypeWarningCode UNDEFINED_METHOD = const StaticTypeWarningCode.con1('UNDEFINED_METHOD', 17, "The method '%s' is not defined for the class '%s'");
+  static const StaticTypeWarningCode UNDEFINED_METHOD = const StaticTypeWarningCode.con1('UNDEFINED_METHOD', 18, "The method '%s' is not defined for the class '%s'");
 
   /**
    * 12.18 Assignment: Evaluation of an assignment of the form
@@ -2768,7 +2855,7 @@
    * @param operator the name of the operator
    * @param enclosingType the name of the enclosing type where the operator is being looked for
    */
-  static const StaticTypeWarningCode UNDEFINED_OPERATOR = const StaticTypeWarningCode.con1('UNDEFINED_OPERATOR', 18, "There is no such operator '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_OPERATOR = const StaticTypeWarningCode.con1('UNDEFINED_OPERATOR', 19, "There is no such operator '%s' in '%s'");
 
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
@@ -2778,7 +2865,7 @@
    * @param enclosingType the name of the enclosing type where the setter is being looked for
    * @see #INACCESSIBLE_SETTER
    */
-  static const StaticTypeWarningCode UNDEFINED_SETTER = const StaticTypeWarningCode.con1('UNDEFINED_SETTER', 19, "There is no such setter '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_SETTER = const StaticTypeWarningCode.con1('UNDEFINED_SETTER', 20, "There is no such setter '%s' in '%s'");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -2789,7 +2876,7 @@
    * @param methodName the name of the method that is undefined
    * @param typeName the resolved type name that the method lookup is happening on
    */
-  static const StaticTypeWarningCode UNDEFINED_SUPER_METHOD = const StaticTypeWarningCode.con1('UNDEFINED_SUPER_METHOD', 20, "There is no such method '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_SUPER_METHOD = const StaticTypeWarningCode.con1('UNDEFINED_SUPER_METHOD', 21, "There is no such method '%s' in '%s'");
 
   /**
    * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does not have an
@@ -2799,7 +2886,7 @@
    * able to find the name defined in a supertype. It exists to provide a more informative error
    * message.
    */
-  static const StaticTypeWarningCode UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER = const StaticTypeWarningCode.con1('UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER', 21, "Static members from supertypes must be qualified by the name of the defining type");
+  static const StaticTypeWarningCode UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER = const StaticTypeWarningCode.con1('UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER', 22, "Static members from supertypes must be qualified by the name of the defining type");
 
   /**
    * 15.8 Parameterized Types: It is a static type warning if <i>G</i> is not a generic type with
@@ -2811,7 +2898,7 @@
    * @see CompileTimeErrorCode#CONST_WITH_INVALID_TYPE_PARAMETERS
    * @see CompileTimeErrorCode#NEW_WITH_INVALID_TYPE_PARAMETERS
    */
-  static const StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = const StaticTypeWarningCode.con1('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 22, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static const StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = const StaticTypeWarningCode.con1('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 23, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
   static const List<StaticTypeWarningCode> values = const [
       EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
@@ -2825,6 +2912,7 @@
       NON_BOOL_CONDITION,
       NON_BOOL_EXPRESSION,
       NON_BOOL_NEGATION_EXPRESSION,
+      NON_BOOL_OPERAND,
       NON_TYPE_AS_TYPE_ARGUMENT,
       RETURN_OF_INVALID_TYPE,
       TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
@@ -2937,28 +3025,43 @@
   static const StaticWarningCode ASSIGNMENT_TO_FINAL = const StaticWarningCode.con1('ASSIGNMENT_TO_FINAL', 3, "'%s' cannot be used as a setter, it is final");
 
   /**
-   * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
-   * warning if <i>T</i> does not have an accessible instance setter named <i>v =</i>.
+   * 5 Variables: Attempting to assign to a final variable elsewhere will cause a NoSuchMethodError
+   * to be thrown, because no setter is defined for it. The assignment will also give rise to a
+   * static warning for the same reason.
    */
-  static const StaticWarningCode ASSIGNMENT_TO_METHOD = const StaticWarningCode.con1('ASSIGNMENT_TO_METHOD', 4, "Methods cannot be assigned a value");
+  static const StaticWarningCode ASSIGNMENT_TO_FINAL_NO_SETTER = const StaticWarningCode.con1('ASSIGNMENT_TO_FINAL_NO_SETTER', 4, "No setter named '%s' in class '%s'");
+
+  /**
+   * 12.18 Assignment: It is as static warning if an assignment of the form <i>v = e</i> occurs
+   * inside a top level or static function (be it function, method, getter, or setter) or variable
+   * initializer and there is neither a local variable declaration with name <i>v</i> nor setter
+   * declaration with name <i>v=</i> in the lexical scope enclosing the assignment.
+   */
+  static const StaticWarningCode ASSIGNMENT_TO_FUNCTION = const StaticWarningCode.con1('ASSIGNMENT_TO_FUNCTION', 5, "Functions cannot be assigned a value");
+
+  /**
+   * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
+   * warning if <i>T</i> does not have an accessible instance setter named <i>v=</i>.
+   */
+  static const StaticWarningCode ASSIGNMENT_TO_METHOD = const StaticWarningCode.con1('ASSIGNMENT_TO_METHOD', 6, "Methods cannot be assigned a value");
 
   /**
    * 13.9 Switch: It is a static warning if the last statement of the statement sequence
    * <i>s<sub>k</sub></i> is not a break, continue, return or throw statement.
    */
-  static const StaticWarningCode CASE_BLOCK_NOT_TERMINATED = const StaticWarningCode.con1('CASE_BLOCK_NOT_TERMINATED', 5, "The last statement of the 'case' should be 'break', 'continue', 'return' or 'throw'");
+  static const StaticWarningCode CASE_BLOCK_NOT_TERMINATED = const StaticWarningCode.con1('CASE_BLOCK_NOT_TERMINATED', 7, "The last statement of the 'case' should be 'break', 'continue', 'return' or 'throw'");
 
   /**
    * 12.32 Type Cast: It is a static warning if <i>T</i> does not denote a type available in the
    * current lexical scope.
    */
-  static const StaticWarningCode CAST_TO_NON_TYPE = const StaticWarningCode.con1('CAST_TO_NON_TYPE', 6, "The name '%s' is not a type and cannot be used in an 'as' expression");
+  static const StaticWarningCode CAST_TO_NON_TYPE = const StaticWarningCode.con1('CAST_TO_NON_TYPE', 8, "The name '%s' is not a type and cannot be used in an 'as' expression");
 
   /**
    * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
    * inherited in a concrete class.
    */
-  static const StaticWarningCode CONCRETE_CLASS_WITH_ABSTRACT_MEMBER = const StaticWarningCode.con1('CONCRETE_CLASS_WITH_ABSTRACT_MEMBER', 7, "'%s' must have a method body because '%s' is not abstract");
+  static const StaticWarningCode CONCRETE_CLASS_WITH_ABSTRACT_MEMBER = const StaticWarningCode.con1('CONCRETE_CLASS_WITH_ABSTRACT_MEMBER', 9, "'%s' must have a method body because '%s' is not abstract");
 
   /**
    * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and <i>N</i> would be
@@ -2971,7 +3074,7 @@
    * @param sdkLibraryName the name of the dart: library that the element is found
    * @param otherLibraryName the name of the non-dart: library that the element is found
    */
-  static const StaticWarningCode CONFLICTING_DART_IMPORT = const StaticWarningCode.con1('CONFLICTING_DART_IMPORT', 8, "Element '%s' from SDK library '%s' is implicitly hidden by '%s'");
+  static const StaticWarningCode CONFLICTING_DART_IMPORT = const StaticWarningCode.con1('CONFLICTING_DART_IMPORT', 10, "Element '%s' from SDK library '%s' is implicitly hidden by '%s'");
 
   /**
    * 7.2 Getters: It is a static warning if a class <i>C</i> declares an instance getter named
@@ -2980,19 +3083,19 @@
    *
    * @param superName the name of the super class declaring a static member
    */
-  static const StaticWarningCode CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER = const StaticWarningCode.con1('CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER', 9, "Superclass '%s' declares static member with the same name");
+  static const StaticWarningCode CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER = const StaticWarningCode.con1('CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER', 11, "Superclass '%s' declares static member with the same name");
 
   /**
    * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
    * named <i>n</i> and has a setter named <i>n=</i>.
    */
-  static const StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER = const StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER', 10, "Class '%s' declares instance method '%s', but also has a setter with the same name from '%s'");
+  static const StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER = const StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER', 12, "Class '%s' declares instance method '%s', but also has a setter with the same name from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
    * named <i>n</i> and has a setter named <i>n=</i>.
    */
-  static const StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER2 = const StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER2', 11, "Class '%s' declares the setter '%s', but also has an instance method in the same class");
+  static const StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER2 = const StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER2', 13, "Class '%s' declares the setter '%s', but also has an instance method in the same class");
 
   /**
    * 7.3 Setters: It is a static warning if a class <i>C</i> declares an instance setter named
@@ -3001,31 +3104,31 @@
    *
    * @param superName the name of the super class declaring a static member
    */
-  static const StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = const StaticWarningCode.con1('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 12, "Superclass '%s' declares static member with the same name");
+  static const StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = const StaticWarningCode.con1('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 14, "Superclass '%s' declares static member with the same name");
 
   /**
    * 7.2 Getters: It is a static warning if a class declares a static getter named <i>v</i> and also
    * has a non-static setter named <i>v=</i>.
    */
-  static const StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = const StaticWarningCode.con1('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 13, "Class '%s' declares non-static setter with the same name");
+  static const StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = const StaticWarningCode.con1('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 15, "Class '%s' declares non-static setter with the same name");
 
   /**
    * 7.3 Setters: It is a static warning if a class declares a static setter named <i>v=</i> and
    * also has a non-static member named <i>v</i>.
    */
-  static const StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER = const StaticWarningCode.con1('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER', 14, "Class '%s' declares non-static member with the same name");
+  static const StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER = const StaticWarningCode.con1('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER', 16, "Class '%s' declares non-static member with the same name");
 
   /**
    * 12.11.2 Const: Given an instance creation expression of the form <i>const q(a<sub>1</sub>,
    * &hellip; a<sub>n</sub>)</i> it is a static warning if <i>q</i> is the constructor of an
    * abstract class but <i>q</i> is not a factory constructor.
    */
-  static const StaticWarningCode CONST_WITH_ABSTRACT_CLASS = const StaticWarningCode.con1('CONST_WITH_ABSTRACT_CLASS', 15, "Abstract classes cannot be created with a 'const' expression");
+  static const StaticWarningCode CONST_WITH_ABSTRACT_CLASS = const StaticWarningCode.con1('CONST_WITH_ABSTRACT_CLASS', 17, "Abstract classes cannot be created with a 'const' expression");
 
   /**
    * 12.7 Maps: It is a static warning if the values of any two keys in a map literal are equal.
    */
-  static const StaticWarningCode EQUAL_KEYS_IN_MAP = const StaticWarningCode.con1('EQUAL_KEYS_IN_MAP', 16, "Keys in a map cannot be equal");
+  static const StaticWarningCode EQUAL_KEYS_IN_MAP = const StaticWarningCode.con1('EQUAL_KEYS_IN_MAP', 18, "Keys in a map cannot be equal");
 
   /**
    * 14.2 Exports: It is a static warning to export two different libraries with the same name.
@@ -3034,7 +3137,7 @@
    * @param uri2 the uri pointing to a second library
    * @param name the shared name of the exported libraries
    */
-  static const StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAME = const StaticWarningCode.con1('EXPORT_DUPLICATED_LIBRARY_NAME', 17, "The exported libraries '%s' and '%s' should not have the same name '%s'");
+  static const StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAME = const StaticWarningCode.con1('EXPORT_DUPLICATED_LIBRARY_NAME', 19, "The exported libraries '%s' and '%s' should not have the same name '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -3044,13 +3147,13 @@
    * @param argumentCount the actual number of positional arguments given
    * @see #NOT_ENOUGH_REQUIRED_ARGUMENTS
    */
-  static const StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = const StaticWarningCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 18, "%d positional arguments expected, but %d found");
+  static const StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = const StaticWarningCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 20, "%d positional arguments expected, but %d found");
 
   /**
    * 5. Variables: It is a static warning if a final instance variable that has been initialized at
    * its point of declaration is also initialized in a constructor.
    */
-  static const StaticWarningCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = const StaticWarningCode.con1('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 19, "Values cannot be set in the constructor if they are final, and have already been set");
+  static const StaticWarningCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = const StaticWarningCode.con1('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 21, "Values cannot be set in the constructor if they are final, and have already been set");
 
   /**
    * 5. Variables: It is a static warning if a final instance variable that has been initialized at
@@ -3058,7 +3161,7 @@
    *
    * @param name the name of the field in question
    */
-  static const StaticWarningCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = const StaticWarningCode.con1('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 20, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
+  static const StaticWarningCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = const StaticWarningCode.con1('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 22, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
 
   /**
    * 7.6.1 Generative Constructors: Execution of an initializer of the form <b>this</b>.<i>v</i> =
@@ -3075,7 +3178,7 @@
    * @param initializerType the name of the type of the initializer expression
    * @param fieldType the name of the type of the field
    */
-  static const StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE = const StaticWarningCode.con1('FIELD_INITIALIZER_NOT_ASSIGNABLE', 21, "The initializer type '%s' cannot be assigned to the field type '%s'");
+  static const StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE = const StaticWarningCode.con1('FIELD_INITIALIZER_NOT_ASSIGNABLE', 23, "The initializer type '%s' cannot be assigned to the field type '%s'");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -3084,7 +3187,7 @@
    * @param parameterType the name of the type of the field formal parameter
    * @param fieldType the name of the type of the field
    */
-  static const StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = const StaticWarningCode.con1('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 22, "The parameter type '%s' is incompatable with the field type '%s'");
+  static const StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = const StaticWarningCode.con1('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 24, "The parameter type '%s' is incompatable with the field type '%s'");
 
   /**
    * 5 Variables: It is a static warning if a library, static or local variable <i>v</i> is final
@@ -3099,13 +3202,13 @@
    *
    * @param name the name of the uninitialized final variable
    */
-  static const StaticWarningCode FINAL_NOT_INITIALIZED = const StaticWarningCode.con1('FINAL_NOT_INITIALIZED', 23, "The final variable '%s' must be initialized");
+  static const StaticWarningCode FINAL_NOT_INITIALIZED = const StaticWarningCode.con1('FINAL_NOT_INITIALIZED', 25, "The final variable '%s' must be initialized");
 
   /**
    * 15.5 Function Types: It is a static warning if a concrete class implements Function and does
    * not have a concrete method named call().
    */
-  static const StaticWarningCode FUNCTION_WITHOUT_CALL = const StaticWarningCode.con1('FUNCTION_WITHOUT_CALL', 24, "Concrete classes that implement Function must implement the method call()");
+  static const StaticWarningCode FUNCTION_WITHOUT_CALL = const StaticWarningCode.con1('FUNCTION_WITHOUT_CALL', 26, "Concrete classes that implement Function must implement the method call()");
 
   /**
    * 14.1 Imports: It is a static warning to import two different libraries with the same name.
@@ -3114,7 +3217,7 @@
    * @param uri2 the uri pointing to a second library
    * @param name the shared name of the imported libraries
    */
-  static const StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAME = const StaticWarningCode.con1('IMPORT_DUPLICATED_LIBRARY_NAME', 25, "The imported libraries '%s' and '%s' should not have the same name '%s'");
+  static const StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAME = const StaticWarningCode.con1('IMPORT_DUPLICATED_LIBRARY_NAME', 27, "The imported libraries '%s' and '%s' should not have the same name '%s'");
 
   /**
    * 14.1 Imports: It is a static warning if the specified URI of a deferred import does not refer
@@ -3123,7 +3226,7 @@
    * @param uri the uri pointing to a non-library declaration
    * @see CompileTimeErrorCode#IMPORT_OF_NON_LIBRARY
    */
-  static const StaticWarningCode IMPORT_OF_NON_LIBRARY = const StaticWarningCode.con1('IMPORT_OF_NON_LIBRARY', 26, "The imported library '%s' must not have a part-of directive");
+  static const StaticWarningCode IMPORT_OF_NON_LIBRARY = const StaticWarningCode.con1('IMPORT_OF_NON_LIBRARY', 28, "The imported library '%s' must not have a part-of directive");
 
   /**
    * 8.1.1 Inheritance and Overriding: However, if the above rules would cause multiple members
@@ -3134,7 +3237,7 @@
    * If some but not all of the <i>m<sub>i</sub>, 1 &lt;= i &lt;= k</i> are getters none of the
    * <i>m<sub>i</sub></i> are inherited, and a static warning is issued.
    */
-  static const StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD = const StaticWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD', 27, "'%s' is inherited as a getter and also a method");
+  static const StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD = const StaticWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD', 29, "'%s' is inherited as a getter and also a method");
 
   /**
    * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
@@ -3144,7 +3247,7 @@
    * @param memberName the name of the member with the name conflict
    * @param superclassName the name of the enclosing class that has the static member
    */
-  static const StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = const StaticWarningCode.con1('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 28, "'%s' collides with a static member in the superclass '%s'");
+  static const StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = const StaticWarningCode.con1('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 30, "'%s' collides with a static member in the superclass '%s'");
 
   /**
    * 7.2 Getters: It is a static warning if a getter <i>m1</i> overrides a getter <i>m2</i> and the
@@ -3156,7 +3259,7 @@
    * @param className the name of the class where the overridden getter is declared
    * @see #INVALID_METHOD_OVERRIDE_RETURN_TYPE
    */
-  static const StaticWarningCode INVALID_GETTER_OVERRIDE_RETURN_TYPE = const StaticWarningCode.con1('INVALID_GETTER_OVERRIDE_RETURN_TYPE', 29, "The return type '%s' is not assignable to '%s' as required by the getter it is overriding from '%s'");
+  static const StaticWarningCode INVALID_GETTER_OVERRIDE_RETURN_TYPE = const StaticWarningCode.con1('INVALID_GETTER_OVERRIDE_RETURN_TYPE', 31, "The return type '%s' is not assignable to '%s' as required by the getter it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3167,7 +3270,7 @@
    *          actualParamTypeName
    * @param className the name of the class where the overridden method is declared
    */
-  static const StaticWarningCode INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE', 30, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE', 32, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3179,7 +3282,7 @@
    * @param className the name of the class where the overridden method is declared
    * @see #INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
    */
-  static const StaticWarningCode INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE', 31, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE', 33, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3190,7 +3293,7 @@
    *          actualParamTypeName
    * @param className the name of the class where the overridden method is declared
    */
-  static const StaticWarningCode INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE', 32, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE', 34, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3202,7 +3305,7 @@
    * @param className the name of the class where the overridden method is declared
    * @see #INVALID_GETTER_OVERRIDE_RETURN_TYPE
    */
-  static const StaticWarningCode INVALID_METHOD_OVERRIDE_RETURN_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_RETURN_TYPE', 33, "The return type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_RETURN_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_RETURN_TYPE', 35, "The return type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3210,7 +3313,7 @@
    * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
    * for <i>p</i>.
    */
-  static const StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = const StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED', 34, "Parameters cannot override default values, this method overrides '%s.%s' where '%s' has a different value");
+  static const StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = const StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED', 36, "Parameters cannot override default values, this method overrides '%s.%s' where '%s' has a different value");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3218,7 +3321,7 @@
    * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
    * for <i>p</i>.
    */
-  static const StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL = const StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL', 35, "Parameters cannot override default values, this method overrides '%s.%s' where this positional parameter has a different value");
+  static const StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL = const StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL', 37, "Parameters cannot override default values, this method overrides '%s.%s' where this positional parameter has a different value");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3228,7 +3331,7 @@
    * @param paramCount the number of named parameters in the overridden member
    * @param className the name of the class from the overridden method
    */
-  static const StaticWarningCode INVALID_OVERRIDE_NAMED = const StaticWarningCode.con1('INVALID_OVERRIDE_NAMED', 36, "Missing the named parameter '%s' to match the overridden method from '%s'");
+  static const StaticWarningCode INVALID_OVERRIDE_NAMED = const StaticWarningCode.con1('INVALID_OVERRIDE_NAMED', 38, "Missing the named parameter '%s' to match the overridden method from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3237,7 +3340,7 @@
    * @param paramCount the number of positional parameters in the overridden member
    * @param className the name of the class from the overridden method
    */
-  static const StaticWarningCode INVALID_OVERRIDE_POSITIONAL = const StaticWarningCode.con1('INVALID_OVERRIDE_POSITIONAL', 37, "Must have at least %d parameters to match the overridden method from '%s'");
+  static const StaticWarningCode INVALID_OVERRIDE_POSITIONAL = const StaticWarningCode.con1('INVALID_OVERRIDE_POSITIONAL', 39, "Must have at least %d parameters to match the overridden method from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3247,7 +3350,7 @@
    * @param paramCount the number of required parameters in the overridden member
    * @param className the name of the class from the overridden method
    */
-  static const StaticWarningCode INVALID_OVERRIDE_REQUIRED = const StaticWarningCode.con1('INVALID_OVERRIDE_REQUIRED', 38, "Must have %d required parameters or less to match the overridden method from '%s'");
+  static const StaticWarningCode INVALID_OVERRIDE_REQUIRED = const StaticWarningCode.con1('INVALID_OVERRIDE_REQUIRED', 40, "Must have %d required parameters or less to match the overridden method from '%s'");
 
   /**
    * 7.3 Setters: It is a static warning if a setter <i>m1</i> overrides a setter <i>m2</i> and the
@@ -3259,7 +3362,7 @@
    * @param className the name of the class where the overridden setter is declared
    * @see #INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
    */
-  static const StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE = const StaticWarningCode.con1('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 39, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
+  static const StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE = const StaticWarningCode.con1('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 41, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> &hellip;
@@ -3273,7 +3376,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 40, "The element type '%s' cannot be assigned to the list type '%s'");
+  static const StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 42, "The element type '%s' cannot be assigned to the list type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -3288,7 +3391,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 41, "The element type '%s' cannot be assigned to the map key type '%s'");
+  static const StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 43, "The element type '%s' cannot be assigned to the map key type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -3303,33 +3406,33 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 42, "The element type '%s' cannot be assigned to the map value type '%s'");
+  static const StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 44, "The element type '%s' cannot be assigned to the map value type '%s'");
 
   /**
    * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i> with argument type
    * <i>T</i> and a getter named <i>v</i> with return type <i>S</i>, and <i>T</i> may not be
    * assigned to <i>S</i>.
    */
-  static const StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = const StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES', 43, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s')");
+  static const StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = const StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES', 45, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s')");
 
   /**
    * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i> with argument type
    * <i>T</i> and a getter named <i>v</i> with return type <i>S</i>, and <i>T</i> may not be
    * assigned to <i>S</i>.
    */
-  static const StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE = const StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE', 44, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s'), from superclass '%s'");
+  static const StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE = const StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE', 46, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s'), from superclass '%s'");
 
   /**
    * 13.12 Return: It is a static warning if a function contains both one or more return statements
    * of the form <i>return;</i> and one or more return statements of the form <i>return e;</i>.
    */
-  static const StaticWarningCode MIXED_RETURN_TYPES = const StaticWarningCode.con1('MIXED_RETURN_TYPES', 45, "Methods and functions cannot use return both with and without values");
+  static const StaticWarningCode MIXED_RETURN_TYPES = const StaticWarningCode.con1('MIXED_RETURN_TYPES', 47, "Methods and functions cannot use return both with and without values");
 
   /**
    * 12.11.1 New: It is a static warning if <i>q</i> is a constructor of an abstract class and
    * <i>q</i> is not a factory constructor.
    */
-  static const StaticWarningCode NEW_WITH_ABSTRACT_CLASS = const StaticWarningCode.con1('NEW_WITH_ABSTRACT_CLASS', 46, "Abstract classes cannot be created with a 'new' expression");
+  static const StaticWarningCode NEW_WITH_ABSTRACT_CLASS = const StaticWarningCode.con1('NEW_WITH_ABSTRACT_CLASS', 48, "Abstract classes cannot be created with a 'new' expression");
 
   /**
    * 15.8 Parameterized Types: Any use of a malbounded type gives rise to a static warning.
@@ -3340,7 +3443,7 @@
    * @see CompileTimeErrorCode#CONST_WITH_INVALID_TYPE_PARAMETERS
    * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
    */
-  static const StaticWarningCode NEW_WITH_INVALID_TYPE_PARAMETERS = const StaticWarningCode.con1('NEW_WITH_INVALID_TYPE_PARAMETERS', 47, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static const StaticWarningCode NEW_WITH_INVALID_TYPE_PARAMETERS = const StaticWarningCode.con1('NEW_WITH_INVALID_TYPE_PARAMETERS', 49, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
   /**
    * 12.11.1 New: It is a static warning if <i>T</i> is not a class accessible in the current scope,
@@ -3348,7 +3451,7 @@
    *
    * @param name the name of the non-type element
    */
-  static const StaticWarningCode NEW_WITH_NON_TYPE = const StaticWarningCode.con1('NEW_WITH_NON_TYPE', 48, "The name '%s' is not a class");
+  static const StaticWarningCode NEW_WITH_NON_TYPE = const StaticWarningCode.con1('NEW_WITH_NON_TYPE', 50, "The name '%s' is not a class");
 
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
@@ -3359,7 +3462,7 @@
    * a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
    * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
    */
-  static const StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = const StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR', 49, "The class '%s' does not have a constructor '%s'");
+  static const StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = const StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR', 51, "The class '%s' does not have a constructor '%s'");
 
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
@@ -3370,7 +3473,7 @@
    * a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
    * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
    */
-  static const StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 50, "The class '%s' does not have a default constructor");
+  static const StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 52, "The class '%s' does not have a default constructor");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -3390,7 +3493,7 @@
    * @param memberName the name of the fourth member
    * @param additionalCount the number of additional missing members that aren't listed
    */
-  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 51, "Missing concrete implementation of %s, %s, %s, %s and %d more");
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 53, "Missing concrete implementation of %s, %s, %s, %s and %d more");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -3409,7 +3512,7 @@
    * @param memberName the name of the third member
    * @param memberName the name of the fourth member
    */
-  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 52, "Missing concrete implementation of %s, %s, %s and %s");
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 54, "Missing concrete implementation of %s, %s, %s and %s");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -3425,7 +3528,7 @@
    *
    * @param memberName the name of the member
    */
-  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 53, "Missing concrete implementation of %s");
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 55, "Missing concrete implementation of %s");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -3443,7 +3546,7 @@
    * @param memberName the name of the second member
    * @param memberName the name of the third member
    */
-  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 54, "Missing concrete implementation of %s, %s and %s");
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 56, "Missing concrete implementation of %s, %s and %s");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -3460,7 +3563,7 @@
    * @param memberName the name of the first member
    * @param memberName the name of the second member
    */
-  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 55, "Missing concrete implementation of %s and %s");
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 57, "Missing concrete implementation of %s and %s");
 
   /**
    * 13.11 Try: An on-catch clause of the form <i>on T catch (p<sub>1</sub>, p<sub>2</sub>) s</i> or
@@ -3470,18 +3573,18 @@
    *
    * @param name the name of the non-type element
    */
-  static const StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = const StaticWarningCode.con1('NON_TYPE_IN_CATCH_CLAUSE', 56, "The name '%s' is not a type and cannot be used in an on-catch clause");
+  static const StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = const StaticWarningCode.con1('NON_TYPE_IN_CATCH_CLAUSE', 58, "The name '%s' is not a type and cannot be used in an on-catch clause");
 
   /**
    * 7.1.1 Operators: It is a static warning if the return type of the user-declared operator []= is
    * explicitly declared and not void.
    */
-  static const StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = const StaticWarningCode.con1('NON_VOID_RETURN_FOR_OPERATOR', 57, "The return type of the operator []= must be 'void'");
+  static const StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = const StaticWarningCode.con1('NON_VOID_RETURN_FOR_OPERATOR', 59, "The return type of the operator []= must be 'void'");
 
   /**
    * 7.3 Setters: It is a static warning if a setter declares a return type other than void.
    */
-  static const StaticWarningCode NON_VOID_RETURN_FOR_SETTER = const StaticWarningCode.con1('NON_VOID_RETURN_FOR_SETTER', 58, "The return type of the setter must be 'void'");
+  static const StaticWarningCode NON_VOID_RETURN_FOR_SETTER = const StaticWarningCode.con1('NON_VOID_RETURN_FOR_SETTER', 60, "The return type of the setter must be 'void'");
 
   /**
    * 15.1 Static Types: A type <i>T</i> is malformed iff: * <i>T</i> has the form <i>id</i> or the
@@ -3494,7 +3597,7 @@
    *
    * @param nonTypeName the name that is not a type
    */
-  static const StaticWarningCode NOT_A_TYPE = const StaticWarningCode.con1('NOT_A_TYPE', 59, "%s is not a type");
+  static const StaticWarningCode NOT_A_TYPE = const StaticWarningCode.con1('NOT_A_TYPE', 61, "%s is not a type");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -3504,7 +3607,7 @@
    * @param argumentCount the actual number of positional arguments given
    * @see #EXTRA_POSITIONAL_ARGUMENTS
    */
-  static const StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const StaticWarningCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 60, "%d required argument(s) expected, but %d found");
+  static const StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const StaticWarningCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 62, "%d required argument(s) expected, but %d found");
 
   /**
    * 14.3 Parts: It is a static warning if the referenced part declaration <i>p</i> names a library
@@ -3513,7 +3616,7 @@
    * @param expectedLibraryName the name of expected library name
    * @param actualLibraryName the non-matching actual library name from the "part of" declaration
    */
-  static const StaticWarningCode PART_OF_DIFFERENT_LIBRARY = const StaticWarningCode.con1('PART_OF_DIFFERENT_LIBRARY', 61, "Expected this library to be part of '%s', not '%s'");
+  static const StaticWarningCode PART_OF_DIFFERENT_LIBRARY = const StaticWarningCode.con1('PART_OF_DIFFERENT_LIBRARY', 63, "Expected this library to be part of '%s', not '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -3522,7 +3625,7 @@
    * @param redirectedName the name of the redirected constructor
    * @param redirectingName the name of the redirecting constructor
    */
-  static const StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = const StaticWarningCode.con1('REDIRECT_TO_INVALID_FUNCTION_TYPE', 62, "The redirected constructor '%s' has incompatible parameters with '%s'");
+  static const StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = const StaticWarningCode.con1('REDIRECT_TO_INVALID_FUNCTION_TYPE', 64, "The redirected constructor '%s' has incompatible parameters with '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -3531,21 +3634,21 @@
    * @param redirectedName the name of the redirected constructor return type
    * @param redirectingName the name of the redirecting constructor return type
    */
-  static const StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = const StaticWarningCode.con1('REDIRECT_TO_INVALID_RETURN_TYPE', 63, "The return type '%s' of the redirected constructor is not assignable to '%s'");
+  static const StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = const StaticWarningCode.con1('REDIRECT_TO_INVALID_RETURN_TYPE', 65, "The return type '%s' of the redirected constructor is not assignable to '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
    * current scope; if type does denote such a class <i>C</i> it is a static warning if the
    * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static const StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = const StaticWarningCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 64, "The constructor '%s' could not be found in '%s'");
+  static const StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = const StaticWarningCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 66, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
    * current scope; if type does denote such a class <i>C</i> it is a static warning if the
    * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static const StaticWarningCode REDIRECT_TO_NON_CLASS = const StaticWarningCode.con1('REDIRECT_TO_NON_CLASS', 65, "The name '%s' is not a type and cannot be used in a redirected constructor");
+  static const StaticWarningCode REDIRECT_TO_NON_CLASS = const StaticWarningCode.con1('REDIRECT_TO_NON_CLASS', 67, "The name '%s' is not a type and cannot be used in a redirected constructor");
 
   /**
    * 13.12 Return: Let <i>f</i> be the function immediately enclosing a return statement of the form
@@ -3555,7 +3658,7 @@
    * * The return type of <i>f</i> may not be assigned to void.
    * </ol>
    */
-  static const StaticWarningCode RETURN_WITHOUT_VALUE = const StaticWarningCode.con1('RETURN_WITHOUT_VALUE', 66, "Missing return value after 'return'");
+  static const StaticWarningCode RETURN_WITHOUT_VALUE = const StaticWarningCode.con1('RETURN_WITHOUT_VALUE', 68, "Missing return value after 'return'");
 
   /**
    * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
@@ -3563,26 +3666,26 @@
    *
    * @param memberName the name of the instance member
    */
-  static const StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = const StaticWarningCode.con1('STATIC_ACCESS_TO_INSTANCE_MEMBER', 67, "Instance member '%s' cannot be accessed using static access");
+  static const StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = const StaticWarningCode.con1('STATIC_ACCESS_TO_INSTANCE_MEMBER', 69, "Instance member '%s' cannot be accessed using static access");
 
   /**
    * 13.9 Switch: It is a static warning if the type of <i>e</i> may not be assigned to the type of
    * <i>e<sub>k</sub></i>.
    */
-  static const StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = const StaticWarningCode.con1('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 68, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
+  static const StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = const StaticWarningCode.con1('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 70, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
 
   /**
    * 15.1 Static Types: It is a static warning to use a deferred type in a type annotation.
    *
    * @param name the name of the type that is deferred and being used in a type annotation
    */
-  static const StaticWarningCode TYPE_ANNOTATION_DEFERRED_CLASS = const StaticWarningCode.con1('TYPE_ANNOTATION_DEFERRED_CLASS', 69, "The deferred type '%s' cannot be used in a declaration");
+  static const StaticWarningCode TYPE_ANNOTATION_DEFERRED_CLASS = const StaticWarningCode.con1('TYPE_ANNOTATION_DEFERRED_CLASS', 71, "The deferred type '%s' cannot be used in a declaration, cast or type test");
 
   /**
    * 12.31 Type Test: It is a static warning if <i>T</i> does not denote a type available in the
    * current lexical scope.
    */
-  static const StaticWarningCode TYPE_TEST_NON_TYPE = const StaticWarningCode.con1('TYPE_TEST_NON_TYPE', 70, "The name '%s' is not a type and cannot be used in an 'is' expression");
+  static const StaticWarningCode TYPE_TEST_NON_TYPE = const StaticWarningCode.con1('TYPE_TEST_NON_TYPE', 72, "The name '%s' is not a type and cannot be used in an 'is' expression");
 
   /**
    * 10 Generics: However, a type parameter is considered to be a malformed type when referenced by
@@ -3591,7 +3694,7 @@
    * 15.1 Static Types: Any use of a malformed type gives rise to a static warning. A malformed type
    * is then interpreted as dynamic by the static type checker and the runtime.
    */
-  static const StaticWarningCode TYPE_PARAMETER_REFERENCED_BY_STATIC = const StaticWarningCode.con1('TYPE_PARAMETER_REFERENCED_BY_STATIC', 71, "Static members cannot reference type parameters");
+  static const StaticWarningCode TYPE_PARAMETER_REFERENCED_BY_STATIC = const StaticWarningCode.con1('TYPE_PARAMETER_REFERENCED_BY_STATIC', 73, "Static members cannot reference type parameters");
 
   /**
    * 12.16.3 Static Invocation: A static method invocation <i>i</i> has the form
@@ -3601,12 +3704,12 @@
    *
    * @param undefinedClassName the name of the undefined class
    */
-  static const StaticWarningCode UNDEFINED_CLASS = const StaticWarningCode.con1('UNDEFINED_CLASS', 72, "Undefined class '%s'");
+  static const StaticWarningCode UNDEFINED_CLASS = const StaticWarningCode.con1('UNDEFINED_CLASS', 74, "Undefined class '%s'");
 
   /**
    * Same as [UNDEFINED_CLASS], but to catch using "boolean" instead of "bool".
    */
-  static const StaticWarningCode UNDEFINED_CLASS_BOOLEAN = const StaticWarningCode.con1('UNDEFINED_CLASS_BOOLEAN', 73, "Undefined class 'boolean'; did you mean 'bool'?");
+  static const StaticWarningCode UNDEFINED_CLASS_BOOLEAN = const StaticWarningCode.con1('UNDEFINED_CLASS_BOOLEAN', 75, "Undefined class 'boolean'; did you mean 'bool'?");
 
   /**
    * 12.17 Getter Invocation: It is a static warning if there is no class <i>C</i> in the enclosing
@@ -3616,7 +3719,7 @@
    * @param getterName the name of the getter
    * @param enclosingType the name of the enclosing type where the getter is being looked for
    */
-  static const StaticWarningCode UNDEFINED_GETTER = const StaticWarningCode.con1('UNDEFINED_GETTER', 74, "There is no such getter '%s' in '%s'");
+  static const StaticWarningCode UNDEFINED_GETTER = const StaticWarningCode.con1('UNDEFINED_GETTER', 76, "There is no such getter '%s' in '%s'");
 
   /**
    * 12.30 Identifier Reference: It is as static warning if an identifier expression of the form
@@ -3626,7 +3729,7 @@
    *
    * @param name the name of the identifier
    */
-  static const StaticWarningCode UNDEFINED_IDENTIFIER = const StaticWarningCode.con1('UNDEFINED_IDENTIFIER', 75, "Undefined name '%s'");
+  static const StaticWarningCode UNDEFINED_IDENTIFIER = const StaticWarningCode.con1('UNDEFINED_IDENTIFIER', 77, "Undefined name '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -3635,7 +3738,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static const StaticWarningCode UNDEFINED_NAMED_PARAMETER = const StaticWarningCode.con1('UNDEFINED_NAMED_PARAMETER', 76, "The named parameter '%s' is not defined");
+  static const StaticWarningCode UNDEFINED_NAMED_PARAMETER = const StaticWarningCode.con1('UNDEFINED_NAMED_PARAMETER', 78, "The named parameter '%s' is not defined");
 
   /**
    * 12.18 Assignment: It is as static warning if an assignment of the form <i>v = e</i> occurs
@@ -3650,7 +3753,7 @@
    * @param setterName the name of the getter
    * @param enclosingType the name of the enclosing type where the setter is being looked for
    */
-  static const StaticWarningCode UNDEFINED_SETTER = const StaticWarningCode.con1('UNDEFINED_SETTER', 77, "There is no such setter '%s' in '%s'");
+  static const StaticWarningCode UNDEFINED_SETTER = const StaticWarningCode.con1('UNDEFINED_SETTER', 79, "There is no such setter '%s' in '%s'");
 
   /**
    * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
@@ -3659,18 +3762,20 @@
    * @param methodName the name of the method
    * @param enclosingType the name of the enclosing type where the method is being looked for
    */
-  static const StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = const StaticWarningCode.con1('UNDEFINED_STATIC_METHOD_OR_GETTER', 78, "There is no such static method, getter or setter '%s' in '%s'");
+  static const StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = const StaticWarningCode.con1('UNDEFINED_STATIC_METHOD_OR_GETTER', 80, "There is no such static method, getter or setter '%s' in '%s'");
 
   /**
    * 7.2 Getters: It is a static warning if the return type of a getter is void.
    */
-  static const StaticWarningCode VOID_RETURN_FOR_GETTER = const StaticWarningCode.con1('VOID_RETURN_FOR_GETTER', 79, "The return type of the getter must not be 'void'");
+  static const StaticWarningCode VOID_RETURN_FOR_GETTER = const StaticWarningCode.con1('VOID_RETURN_FOR_GETTER', 81, "The return type of the getter must not be 'void'");
 
   static const List<StaticWarningCode> values = const [
       AMBIGUOUS_IMPORT,
       ARGUMENT_TYPE_NOT_ASSIGNABLE,
       ASSIGNMENT_TO_CONST,
       ASSIGNMENT_TO_FINAL,
+      ASSIGNMENT_TO_FINAL_NO_SETTER,
+      ASSIGNMENT_TO_FUNCTION,
       ASSIGNMENT_TO_METHOD,
       CASE_BLOCK_NOT_TERMINATED,
       CAST_TO_NON_TYPE,
diff --git a/pkg/analyzer/lib/src/generated/index.dart b/pkg/analyzer/lib/src/generated/index.dart
index 434af7d..ae07ab5 100644
--- a/pkg/analyzer/lib/src/generated/index.dart
+++ b/pkg/analyzer/lib/src/generated/index.dart
@@ -440,14 +440,14 @@
    * 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");
+  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");
+  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
@@ -480,6 +480,54 @@
   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");
@@ -1010,10 +1058,17 @@
       }
       recordRelationship(element, relationship, location);
     }
-    if (element is FunctionElement) {
+    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);
   }
@@ -1062,6 +1117,21 @@
     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);
@@ -1224,10 +1294,7 @@
   bool _isAlreadyHandledName(SimpleIdentifier node) {
     AstNode parent = node.parent;
     if (parent is MethodInvocation) {
-      Element element = node.staticElement;
-      if (element is MethodElement || element is FunctionElement) {
-        return identical(parent.methodName, node);
-      }
+      return identical(parent.methodName, node);
     }
     return false;
   }
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index b613897..2c99216 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -229,8 +229,55 @@
 }
 
 class StringUtils {
-  static List<String> split(String s, [String pattern = '']) => s.split(pattern);
-  static String replace(String s, String from, String to) => s.replaceAll(from, to);
+  static String capitalize(String str) {
+    if (isEmpty(str)) {
+      return str;
+    }
+    return str.substring(0, 1).toUpperCase() + str.substring(1);
+  }
+
+  static bool equals(String cs1, String cs2) {
+    if (cs1 == cs2) {
+      return true;
+    }
+    if (cs1 == null || cs2 == null) {
+      return false;
+    }
+    return cs1 == cs2;
+  }
+
+  static bool isEmpty(String str) {
+    return str == null || str.isEmpty;
+  }
+
+  static String join(Iterable iter, [String separator = ' ', int start = 0, int
+      end = -1]) {
+    if (start != 0) {
+      iter = iter.skip(start);
+    }
+    if (end != -1) {
+      iter = iter.take(end - start);
+    }
+    return iter.join(separator);
+  }
+
+  static String remove(String str, String remove) {
+    if (isEmpty(str) || isEmpty(remove)) {
+      return str;
+    }
+    return str.replaceAll(remove, '');
+  }
+
+  static String removeStart(String str, String remove) {
+    if (isEmpty(str) || isEmpty(remove)) {
+      return str;
+    }
+    if (str.startsWith(remove)) {
+      return str.substring(remove.length);
+    }
+    return str;
+  }
+
   static String repeat(String s, int n) {
     StringBuffer sb = new StringBuffer();
     for (int i = 0; i < n; i++) {
@@ -238,8 +285,14 @@
     }
     return sb.toString();
   }
-  static String join(Iterable iter, [String separator = " "]) {
-    return iter.join(separator);
+
+  static List<String> split(String s, [String pattern = '']) {
+    return s.split(pattern);
+  }
+
+  static List<String> splitByWholeSeparatorPreserveAllTokens(String s, String
+      pattern) {
+    return s.split(pattern);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/generated/java_engine.dart b/pkg/analyzer/lib/src/generated/java_engine.dart
index 3ce0ec1..37cbe39 100644
--- a/pkg/analyzer/lib/src/generated/java_engine.dart
+++ b/pkg/analyzer/lib/src/generated/java_engine.dart
@@ -179,6 +179,11 @@
     target.add(value);
     return target;
   }
+  static List addAt(List target, int index, Object value) {
+    target = new List.from(target);
+    target.insert(index, value);
+    return target;
+  }
   static List addAll(List target, List source) {
     List result = new List.from(target);
     result.addAll(source);
@@ -197,3 +202,88 @@
   String toString() => id;
   static UUID randomUUID() => new UUID((__nextId).toString());
 }
+
+
+/**
+ * Instances of the class `AnalysisException` represent an exception that
+ * occurred during the analysis of one or more sources.
+ */
+class AnalysisException implements Exception {
+  /**
+   * The message that explains why the exception occurred.
+   */
+  final String message;
+
+  /**
+   * The exception that caused this exception, or `null` if this exception was
+   * not caused by another exception.
+   */
+  final CaughtException cause;
+
+  /**
+   * Initialize a newly created exception to have the given [message] and
+   * [cause].
+   */
+  AnalysisException([this.message = 'Exception', this.cause = null]);
+}
+
+
+/**
+ * Instances of the class `CaughtException` represent an exception that was
+ * caught and has an associated stack trace.
+ */
+class CaughtException implements Exception {
+  /**
+   * The exception that was caught.
+   */
+  final Exception exception;
+
+  /**
+   * The stack trace associated with the exception.
+   */
+  StackTrace stackTrace;
+
+  /**
+   * Initialize a newly created caught exception to have the given [exception]
+   * and [stackTrace].
+   */
+  CaughtException(this.exception, stackTrace) {
+    if (stackTrace == null) {
+      try {
+        throw this;
+      } catch (_, st) {
+        stackTrace = st;
+      }
+    }
+    this.stackTrace = stackTrace;
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    _writeOn(buffer);
+    return buffer.toString();
+  }
+
+  /**
+   * Write a textual representation of the caught exception and its associated
+   * stack trace.
+   */
+  void _writeOn(StringBuffer buffer) {
+    if (exception is AnalysisException) {
+      AnalysisException analysisException = exception;
+      buffer.writeln(analysisException.message);
+      if (stackTrace != null) {
+        buffer.writeln(stackTrace.toString());
+      }
+      CaughtException cause = analysisException.cause;
+      if (cause != null) {
+        buffer.write('Caused by ');
+        cause._writeOn(buffer);
+      }
+    } else {
+      buffer.writeln(exception.toString());
+      buffer.writeln(stackTrace.toString());
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 93a86b6..bac76fa 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -15,7 +15,7 @@
 import 'scanner.dart';
 import 'ast.dart';
 import 'utilities_dart.dart';
-import 'engine.dart' show AnalysisEngine;
+import 'engine.dart' show AnalysisEngine, AnalysisOptionsImpl;
 import 'utilities_collection.dart' show TokenMap;
 
 /**
@@ -1436,6 +1436,11 @@
   bool _parseFunctionBodies = true;
 
   /**
+   * A flag indicating whether parser is to parse deferred libraries.
+   */
+  bool _parseDeferredLibraries = AnalysisOptionsImpl.DEFAULT_ENABLE_DEFERRED_LOADING;
+
+  /**
    * The next token to be parsed.
    */
   Token _currentToken;
@@ -1561,6 +1566,15 @@
   }
 
   /**
+   * Set whether parser is to parse deferred libraries.
+   *
+   * @param parseDeferredLibraries `true` if parser is to parse deferred libraries
+   */
+  void set parseDeferredLibraries(bool parseDeferredLibraries) {
+    this._parseDeferredLibraries = parseDeferredLibraries;
+  }
+
+  /**
    * Set whether parser is to parse function bodies.
    *
    * @param parseFunctionBodies `true` if parser is to parse function bodies
@@ -2035,7 +2049,7 @@
   }
 
   /**
-   * Parse an expression that does not contain any cascades.
+   * Parse an expression that might contain a cascade.
    *
    * <pre>
    * expression ::=
@@ -3515,7 +3529,8 @@
    *
    * @param prefix the expression preceding the selector
    * @param optional `true` if the selector is optional
-   * @return the assignable selector that was parsed
+   * @return the assignable selector that was parsed, or the original prefix if there was no
+   *         assignable selector
    */
   Expression _parseAssignableSelector(Expression prefix, bool optional) {
     if (_matches(TokenType.OPEN_SQUARE_BRACKET)) {
@@ -3653,6 +3668,7 @@
       _reportErrorForToken(ParserErrorCode.MISSING_IDENTIFIER, _currentToken, [_currentToken.lexeme]);
       functionName = _createSyntheticIdentifier();
     }
+    assert((expression == null && functionName != null) || (expression != null && functionName == null));
     if (_currentToken.type == TokenType.OPEN_PAREN) {
       while (_currentToken.type == TokenType.OPEN_PAREN) {
         if (functionName != null) {
@@ -3670,6 +3686,7 @@
       expression = new PropertyAccess(expression, period, functionName);
       period = null;
     }
+    assert(expression != null);
     bool progress = true;
     while (progress) {
       progress = false;
@@ -4987,7 +5004,12 @@
     Token asToken = null;
     SimpleIdentifier prefix = null;
     if (_matchesKeyword(Keyword.DEFERRED)) {
-      deferredToken = andAdvance;
+      if (_parseDeferredLibraries) {
+        deferredToken = andAdvance;
+      } else {
+        _reportErrorForCurrentToken(ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED, []);
+        _advance();
+      }
     }
     if (_matchesKeyword(Keyword.AS)) {
       asToken = andAdvance;
@@ -7456,231 +7478,233 @@
 
   static const ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE = const ParserErrorCode.con3('CONTINUE_WITHOUT_LABEL_IN_CASE', 19, "A continue statement in a switch statement must have a label as a target");
 
-  static const ParserErrorCode DEPRECATED_CLASS_TYPE_ALIAS = const ParserErrorCode.con3('DEPRECATED_CLASS_TYPE_ALIAS', 20, "The 'typedef' mixin application was replaced with 'class'");
+  static const ParserErrorCode DEFERRED_IMPORTS_NOT_SUPPORTED = const ParserErrorCode.con3('DEFERRED_IMPORTS_NOT_SUPPORTED', 20, "Deferred imports are not supported by default");
 
-  static const ParserErrorCode DIRECTIVE_AFTER_DECLARATION = const ParserErrorCode.con3('DIRECTIVE_AFTER_DECLARATION', 21, "Directives must appear before any declarations");
+  static const ParserErrorCode DEPRECATED_CLASS_TYPE_ALIAS = const ParserErrorCode.con3('DEPRECATED_CLASS_TYPE_ALIAS', 21, "The 'typedef' mixin application was replaced with 'class'");
 
-  static const ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = const ParserErrorCode.con3('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 22, "The label %s was already used in this switch statement");
+  static const ParserErrorCode DIRECTIVE_AFTER_DECLARATION = const ParserErrorCode.con3('DIRECTIVE_AFTER_DECLARATION', 22, "Directives must appear before any declarations");
 
-  static const ParserErrorCode DUPLICATED_MODIFIER = const ParserErrorCode.con3('DUPLICATED_MODIFIER', 23, "The modifier '%s' was already specified.");
+  static const ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = const ParserErrorCode.con3('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 23, "The label %s was already used in this switch statement");
 
-  static const ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND = const ParserErrorCode.con3('EQUALITY_CANNOT_BE_EQUALITY_OPERAND', 24, "Equality expression cannot be operand of another equality expression.");
+  static const ParserErrorCode DUPLICATED_MODIFIER = const ParserErrorCode.con3('DUPLICATED_MODIFIER', 24, "The modifier '%s' was already specified.");
 
-  static const ParserErrorCode EXPECTED_CASE_OR_DEFAULT = const ParserErrorCode.con3('EXPECTED_CASE_OR_DEFAULT', 25, "Expected 'case' or 'default'");
+  static const ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND = const ParserErrorCode.con3('EQUALITY_CANNOT_BE_EQUALITY_OPERAND', 25, "Equality expression cannot be operand of another equality expression.");
 
-  static const ParserErrorCode EXPECTED_CLASS_MEMBER = const ParserErrorCode.con3('EXPECTED_CLASS_MEMBER', 26, "Expected a class member");
+  static const ParserErrorCode EXPECTED_CASE_OR_DEFAULT = const ParserErrorCode.con3('EXPECTED_CASE_OR_DEFAULT', 26, "Expected 'case' or 'default'");
 
-  static const ParserErrorCode EXPECTED_EXECUTABLE = const ParserErrorCode.con3('EXPECTED_EXECUTABLE', 27, "Expected a method, getter, setter or operator declaration");
+  static const ParserErrorCode EXPECTED_CLASS_MEMBER = const ParserErrorCode.con3('EXPECTED_CLASS_MEMBER', 27, "Expected a class member");
 
-  static const ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = const ParserErrorCode.con3('EXPECTED_LIST_OR_MAP_LITERAL', 28, "Expected a list or map literal");
+  static const ParserErrorCode EXPECTED_EXECUTABLE = const ParserErrorCode.con3('EXPECTED_EXECUTABLE', 28, "Expected a method, getter, setter or operator declaration");
 
-  static const ParserErrorCode EXPECTED_STRING_LITERAL = const ParserErrorCode.con3('EXPECTED_STRING_LITERAL', 29, "Expected a string literal");
+  static const ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = const ParserErrorCode.con3('EXPECTED_LIST_OR_MAP_LITERAL', 29, "Expected a list or map literal");
 
-  static const ParserErrorCode EXPECTED_TOKEN = const ParserErrorCode.con3('EXPECTED_TOKEN', 30, "Expected to find '%s'");
+  static const ParserErrorCode EXPECTED_STRING_LITERAL = const ParserErrorCode.con3('EXPECTED_STRING_LITERAL', 30, "Expected a string literal");
 
-  static const ParserErrorCode EXPECTED_TYPE_NAME = const ParserErrorCode.con3('EXPECTED_TYPE_NAME', 31, "Expected a type name");
+  static const ParserErrorCode EXPECTED_TOKEN = const ParserErrorCode.con3('EXPECTED_TOKEN', 31, "Expected to find '%s'");
 
-  static const ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 32, "Export directives must preceed part directives");
+  static const ParserErrorCode EXPECTED_TYPE_NAME = const ParserErrorCode.con3('EXPECTED_TYPE_NAME', 32, "Expected a type name");
 
-  static const ParserErrorCode EXTERNAL_AFTER_CONST = const ParserErrorCode.con3('EXTERNAL_AFTER_CONST', 33, "The modifier 'external' should be before the modifier 'const'");
+  static const ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 33, "Export directives must preceed part directives");
 
-  static const ParserErrorCode EXTERNAL_AFTER_FACTORY = const ParserErrorCode.con3('EXTERNAL_AFTER_FACTORY', 34, "The modifier 'external' should be before the modifier 'factory'");
+  static const ParserErrorCode EXTERNAL_AFTER_CONST = const ParserErrorCode.con3('EXTERNAL_AFTER_CONST', 34, "The modifier 'external' should be before the modifier 'const'");
 
-  static const ParserErrorCode EXTERNAL_AFTER_STATIC = const ParserErrorCode.con3('EXTERNAL_AFTER_STATIC', 35, "The modifier 'external' should be before the modifier 'static'");
+  static const ParserErrorCode EXTERNAL_AFTER_FACTORY = const ParserErrorCode.con3('EXTERNAL_AFTER_FACTORY', 35, "The modifier 'external' should be before the modifier 'factory'");
 
-  static const ParserErrorCode EXTERNAL_CLASS = const ParserErrorCode.con3('EXTERNAL_CLASS', 36, "Classes cannot be declared to be 'external'");
+  static const ParserErrorCode EXTERNAL_AFTER_STATIC = const ParserErrorCode.con3('EXTERNAL_AFTER_STATIC', 36, "The modifier 'external' should be before the modifier 'static'");
 
-  static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_CONSTRUCTOR_WITH_BODY', 37, "External constructors cannot have a body");
+  static const ParserErrorCode EXTERNAL_CLASS = const ParserErrorCode.con3('EXTERNAL_CLASS', 37, "Classes cannot be declared to be 'external'");
 
-  static const ParserErrorCode EXTERNAL_FIELD = const ParserErrorCode.con3('EXTERNAL_FIELD', 38, "Fields cannot be declared to be 'external'");
+  static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_CONSTRUCTOR_WITH_BODY', 38, "External constructors cannot have a body");
 
-  static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_GETTER_WITH_BODY', 39, "External getters cannot have a body");
+  static const ParserErrorCode EXTERNAL_FIELD = const ParserErrorCode.con3('EXTERNAL_FIELD', 39, "Fields cannot be declared to be 'external'");
 
-  static const ParserErrorCode EXTERNAL_METHOD_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_METHOD_WITH_BODY', 40, "External methods cannot have a body");
+  static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_GETTER_WITH_BODY', 40, "External getters cannot have a body");
 
-  static const ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_OPERATOR_WITH_BODY', 41, "External operators cannot have a body");
+  static const ParserErrorCode EXTERNAL_METHOD_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_METHOD_WITH_BODY', 41, "External methods cannot have a body");
 
-  static const ParserErrorCode EXTERNAL_SETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_SETTER_WITH_BODY', 42, "External setters cannot have a body");
+  static const ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_OPERATOR_WITH_BODY', 42, "External operators cannot have a body");
 
-  static const ParserErrorCode EXTERNAL_TYPEDEF = const ParserErrorCode.con3('EXTERNAL_TYPEDEF', 43, "Type aliases cannot be declared to be 'external'");
+  static const ParserErrorCode EXTERNAL_SETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_SETTER_WITH_BODY', 43, "External setters cannot have a body");
 
-  static const ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = const ParserErrorCode.con3('FACTORY_TOP_LEVEL_DECLARATION', 44, "Top-level declarations cannot be declared to be 'factory'");
+  static const ParserErrorCode EXTERNAL_TYPEDEF = const ParserErrorCode.con3('EXTERNAL_TYPEDEF', 44, "Type aliases cannot be declared to be 'external'");
 
-  static const ParserErrorCode FACTORY_WITHOUT_BODY = const ParserErrorCode.con3('FACTORY_WITHOUT_BODY', 45, "A non-redirecting 'factory' constructor must have a body");
+  static const ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = const ParserErrorCode.con3('FACTORY_TOP_LEVEL_DECLARATION', 45, "Top-level declarations cannot be declared to be 'factory'");
 
-  static const ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const ParserErrorCode.con3('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 46, "Field initializers can only be used in a constructor");
+  static const ParserErrorCode FACTORY_WITHOUT_BODY = const ParserErrorCode.con3('FACTORY_WITHOUT_BODY', 46, "A non-redirecting 'factory' constructor must have a body");
 
-  static const ParserErrorCode FINAL_AND_VAR = const ParserErrorCode.con3('FINAL_AND_VAR', 47, "Members cannot be declared to be both 'final' and 'var'");
+  static const ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const ParserErrorCode.con3('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 47, "Field initializers can only be used in a constructor");
 
-  static const ParserErrorCode FINAL_CLASS = const ParserErrorCode.con3('FINAL_CLASS', 48, "Classes cannot be declared to be 'final'");
+  static const ParserErrorCode FINAL_AND_VAR = const ParserErrorCode.con3('FINAL_AND_VAR', 48, "Members cannot be declared to be both 'final' and 'var'");
 
-  static const ParserErrorCode FINAL_CONSTRUCTOR = const ParserErrorCode.con3('FINAL_CONSTRUCTOR', 49, "A constructor cannot be declared to be 'final'");
+  static const ParserErrorCode FINAL_CLASS = const ParserErrorCode.con3('FINAL_CLASS', 49, "Classes cannot be declared to be 'final'");
 
-  static const ParserErrorCode FINAL_METHOD = const ParserErrorCode.con3('FINAL_METHOD', 50, "Getters, setters and methods cannot be declared to be 'final'");
+  static const ParserErrorCode FINAL_CONSTRUCTOR = const ParserErrorCode.con3('FINAL_CONSTRUCTOR', 50, "A constructor cannot be declared to be 'final'");
 
-  static const ParserErrorCode FINAL_TYPEDEF = const ParserErrorCode.con3('FINAL_TYPEDEF', 51, "Type aliases cannot be declared to be 'final'");
+  static const ParserErrorCode FINAL_METHOD = const ParserErrorCode.con3('FINAL_METHOD', 51, "Getters, setters and methods cannot be declared to be 'final'");
 
-  static const ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = const ParserErrorCode.con3('FUNCTION_TYPED_PARAMETER_VAR', 52, "Function typed parameters cannot specify 'const', 'final' or 'var' instead of return type");
+  static const ParserErrorCode FINAL_TYPEDEF = const ParserErrorCode.con3('FINAL_TYPEDEF', 52, "Type aliases cannot be declared to be 'final'");
 
-  static const ParserErrorCode GETTER_IN_FUNCTION = const ParserErrorCode.con3('GETTER_IN_FUNCTION', 53, "Getters cannot be defined within methods or functions");
+  static const ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = const ParserErrorCode.con3('FUNCTION_TYPED_PARAMETER_VAR', 53, "Function typed parameters cannot specify 'const', 'final' or 'var' instead of return type");
 
-  static const ParserErrorCode GETTER_WITH_PARAMETERS = const ParserErrorCode.con3('GETTER_WITH_PARAMETERS', 54, "Getter should be declared without a parameter list");
+  static const ParserErrorCode GETTER_IN_FUNCTION = const ParserErrorCode.con3('GETTER_IN_FUNCTION', 54, "Getters cannot be defined within methods or functions");
 
-  static const ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = const ParserErrorCode.con3('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', 55, "Illegal assignment to non-assignable expression");
+  static const ParserErrorCode GETTER_WITH_PARAMETERS = const ParserErrorCode.con3('GETTER_WITH_PARAMETERS', 55, "Getter should be declared without a parameter list");
 
-  static const ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_EXTENDS', 56, "The extends clause must be before the implements clause");
+  static const ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = const ParserErrorCode.con3('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', 56, "Illegal assignment to non-assignable expression");
 
-  static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_WITH', 57, "The with clause must be before the implements clause");
+  static const ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_EXTENDS', 57, "The extends clause must be before the implements clause");
 
-  static const ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 58, "Import directives must preceed part directives");
+  static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_WITH', 58, "The with clause must be before the implements clause");
 
-  static const ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = const ParserErrorCode.con3('INITIALIZED_VARIABLE_IN_FOR_EACH', 59, "The loop variable in a for-each loop cannot be initialized");
+  static const ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 59, "Import directives must preceed part directives");
 
-  static const ParserErrorCode INVALID_CODE_POINT = const ParserErrorCode.con3('INVALID_CODE_POINT', 60, "The escape sequence '%s' is not a valid code point");
+  static const ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = const ParserErrorCode.con3('INITIALIZED_VARIABLE_IN_FOR_EACH', 60, "The loop variable in a for-each loop cannot be initialized");
 
-  static const ParserErrorCode INVALID_COMMENT_REFERENCE = const ParserErrorCode.con3('INVALID_COMMENT_REFERENCE', 61, "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
+  static const ParserErrorCode INVALID_CODE_POINT = const ParserErrorCode.con3('INVALID_CODE_POINT', 61, "The escape sequence '%s' is not a valid code point");
 
-  static const ParserErrorCode INVALID_HEX_ESCAPE = const ParserErrorCode.con3('INVALID_HEX_ESCAPE', 62, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
+  static const ParserErrorCode INVALID_COMMENT_REFERENCE = const ParserErrorCode.con3('INVALID_COMMENT_REFERENCE', 62, "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
 
-  static const ParserErrorCode INVALID_OPERATOR = const ParserErrorCode.con3('INVALID_OPERATOR', 63, "The string '%s' is not a valid operator");
+  static const ParserErrorCode INVALID_HEX_ESCAPE = const ParserErrorCode.con3('INVALID_HEX_ESCAPE', 63, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
 
-  static const ParserErrorCode INVALID_OPERATOR_FOR_SUPER = const ParserErrorCode.con3('INVALID_OPERATOR_FOR_SUPER', 64, "The operator '%s' cannot be used with 'super'");
+  static const ParserErrorCode INVALID_OPERATOR = const ParserErrorCode.con3('INVALID_OPERATOR', 64, "The string '%s' is not a valid operator");
 
-  static const ParserErrorCode INVALID_UNICODE_ESCAPE = const ParserErrorCode.con3('INVALID_UNICODE_ESCAPE', 65, "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'");
+  static const ParserErrorCode INVALID_OPERATOR_FOR_SUPER = const ParserErrorCode.con3('INVALID_OPERATOR_FOR_SUPER', 65, "The operator '%s' cannot be used with 'super'");
 
-  static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = const ParserErrorCode.con3('LIBRARY_DIRECTIVE_NOT_FIRST', 66, "The library directive must appear before all other directives");
+  static const ParserErrorCode INVALID_UNICODE_ESCAPE = const ParserErrorCode.con3('INVALID_UNICODE_ESCAPE', 66, "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'");
 
-  static const ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER = const ParserErrorCode.con3('LOCAL_FUNCTION_DECLARATION_MODIFIER', 67, "Local function declarations cannot specify any modifier");
+  static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = const ParserErrorCode.con3('LIBRARY_DIRECTIVE_NOT_FIRST', 67, "The library directive must appear before all other directives");
 
-  static const ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = const ParserErrorCode.con3('MISSING_ASSIGNABLE_SELECTOR', 68, "Missing selector such as \".<identifier>\" or \"[0]\"");
+  static const ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER = const ParserErrorCode.con3('LOCAL_FUNCTION_DECLARATION_MODIFIER', 68, "Local function declarations cannot specify any modifier");
 
-  static const ParserErrorCode MISSING_CATCH_OR_FINALLY = const ParserErrorCode.con3('MISSING_CATCH_OR_FINALLY', 69, "A try statement must have either a catch or finally clause");
+  static const ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = const ParserErrorCode.con3('MISSING_ASSIGNABLE_SELECTOR', 69, "Missing selector such as \".<identifier>\" or \"[0]\"");
 
-  static const ParserErrorCode MISSING_CLASS_BODY = const ParserErrorCode.con3('MISSING_CLASS_BODY', 70, "A class definition must have a body, even if it is empty");
+  static const ParserErrorCode MISSING_CATCH_OR_FINALLY = const ParserErrorCode.con3('MISSING_CATCH_OR_FINALLY', 70, "A try statement must have either a catch or finally clause");
 
-  static const ParserErrorCode MISSING_CLOSING_PARENTHESIS = const ParserErrorCode.con3('MISSING_CLOSING_PARENTHESIS', 71, "The closing parenthesis is missing");
+  static const ParserErrorCode MISSING_CLASS_BODY = const ParserErrorCode.con3('MISSING_CLASS_BODY', 71, "A class definition must have a body, even if it is empty");
 
-  static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = const ParserErrorCode.con3('MISSING_CONST_FINAL_VAR_OR_TYPE', 72, "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
+  static const ParserErrorCode MISSING_CLOSING_PARENTHESIS = const ParserErrorCode.con3('MISSING_CLOSING_PARENTHESIS', 72, "The closing parenthesis is missing");
 
-  static const ParserErrorCode MISSING_EXPRESSION_IN_THROW = const ParserErrorCode.con3('MISSING_EXPRESSION_IN_THROW', 73, "Throw expressions must compute the object to be thrown");
+  static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = const ParserErrorCode.con3('MISSING_CONST_FINAL_VAR_OR_TYPE', 73, "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
 
-  static const ParserErrorCode MISSING_FUNCTION_BODY = const ParserErrorCode.con3('MISSING_FUNCTION_BODY', 74, "A function body must be provided");
+  static const ParserErrorCode MISSING_EXPRESSION_IN_THROW = const ParserErrorCode.con3('MISSING_EXPRESSION_IN_THROW', 74, "Throw expressions must compute the object to be thrown");
 
-  static const ParserErrorCode MISSING_FUNCTION_PARAMETERS = const ParserErrorCode.con3('MISSING_FUNCTION_PARAMETERS', 75, "Functions must have an explicit list of parameters");
+  static const ParserErrorCode MISSING_FUNCTION_BODY = const ParserErrorCode.con3('MISSING_FUNCTION_BODY', 75, "A function body must be provided");
 
-  static const ParserErrorCode MISSING_GET = const ParserErrorCode.con3('MISSING_GET', 76, "Getters must have the keyword 'get' before the getter name");
+  static const ParserErrorCode MISSING_FUNCTION_PARAMETERS = const ParserErrorCode.con3('MISSING_FUNCTION_PARAMETERS', 76, "Functions must have an explicit list of parameters");
+
+  static const ParserErrorCode MISSING_GET = const ParserErrorCode.con3('MISSING_GET', 77, "Getters must have the keyword 'get' before the getter name");
 
-  static const ParserErrorCode MISSING_IDENTIFIER = const ParserErrorCode.con3('MISSING_IDENTIFIER', 77, "Expected an identifier");
+  static const ParserErrorCode MISSING_IDENTIFIER = const ParserErrorCode.con3('MISSING_IDENTIFIER', 78, "Expected an identifier");
 
-  static const ParserErrorCode MISSING_KEYWORD_OPERATOR = const ParserErrorCode.con3('MISSING_KEYWORD_OPERATOR', 78, "Operator declarations must be preceeded by the keyword 'operator'");
+  static const ParserErrorCode MISSING_KEYWORD_OPERATOR = const ParserErrorCode.con3('MISSING_KEYWORD_OPERATOR', 79, "Operator declarations must be preceeded by the keyword 'operator'");
 
-  static const ParserErrorCode MISSING_NAME_IN_LIBRARY_DIRECTIVE = const ParserErrorCode.con3('MISSING_NAME_IN_LIBRARY_DIRECTIVE', 79, "Library directives must include a library name");
+  static const ParserErrorCode MISSING_NAME_IN_LIBRARY_DIRECTIVE = const ParserErrorCode.con3('MISSING_NAME_IN_LIBRARY_DIRECTIVE', 80, "Library directives must include a library name");
 
-  static const ParserErrorCode MISSING_NAME_IN_PART_OF_DIRECTIVE = const ParserErrorCode.con3('MISSING_NAME_IN_PART_OF_DIRECTIVE', 80, "Library directives must include a library name");
+  static const ParserErrorCode MISSING_NAME_IN_PART_OF_DIRECTIVE = const ParserErrorCode.con3('MISSING_NAME_IN_PART_OF_DIRECTIVE', 81, "Library directives must include a library name");
 
-  static const ParserErrorCode MISSING_PREFIX_IN_DEFERRED_IMPORT = const ParserErrorCode.con3('MISSING_PREFIX_IN_DEFERRED_IMPORT', 81, "Deferred imports must have a prefix");
+  static const ParserErrorCode MISSING_PREFIX_IN_DEFERRED_IMPORT = const ParserErrorCode.con3('MISSING_PREFIX_IN_DEFERRED_IMPORT', 82, "Deferred imports must have a prefix");
 
-  static const ParserErrorCode MISSING_STATEMENT = const ParserErrorCode.con3('MISSING_STATEMENT', 82, "Expected a statement");
+  static const ParserErrorCode MISSING_STATEMENT = const ParserErrorCode.con3('MISSING_STATEMENT', 83, "Expected a statement");
 
-  static const ParserErrorCode MISSING_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('MISSING_TERMINATOR_FOR_PARAMETER_GROUP', 83, "There is no '%s' to close the parameter group");
+  static const ParserErrorCode MISSING_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('MISSING_TERMINATOR_FOR_PARAMETER_GROUP', 84, "There is no '%s' to close the parameter group");
 
-  static const ParserErrorCode MISSING_TYPEDEF_PARAMETERS = const ParserErrorCode.con3('MISSING_TYPEDEF_PARAMETERS', 84, "Type aliases for functions must have an explicit list of parameters");
+  static const ParserErrorCode MISSING_TYPEDEF_PARAMETERS = const ParserErrorCode.con3('MISSING_TYPEDEF_PARAMETERS', 85, "Type aliases for functions must have an explicit list of parameters");
 
-  static const ParserErrorCode MISSING_VARIABLE_IN_FOR_EACH = const ParserErrorCode.con3('MISSING_VARIABLE_IN_FOR_EACH', 85, "A loop variable must be declared in a for-each loop before the 'in', but none were found");
+  static const ParserErrorCode MISSING_VARIABLE_IN_FOR_EACH = const ParserErrorCode.con3('MISSING_VARIABLE_IN_FOR_EACH', 86, "A loop variable must be declared in a for-each loop before the 'in', but none were found");
 
-  static const ParserErrorCode MIXED_PARAMETER_GROUPS = const ParserErrorCode.con3('MIXED_PARAMETER_GROUPS', 86, "Cannot have both positional and named parameters in a single parameter list");
+  static const ParserErrorCode MIXED_PARAMETER_GROUPS = const ParserErrorCode.con3('MIXED_PARAMETER_GROUPS', 87, "Cannot have both positional and named parameters in a single parameter list");
 
-  static const ParserErrorCode MULTIPLE_EXTENDS_CLAUSES = const ParserErrorCode.con3('MULTIPLE_EXTENDS_CLAUSES', 87, "Each class definition can have at most one extends clause");
+  static const ParserErrorCode MULTIPLE_EXTENDS_CLAUSES = const ParserErrorCode.con3('MULTIPLE_EXTENDS_CLAUSES', 88, "Each class definition can have at most one extends clause");
 
-  static const ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES = const ParserErrorCode.con3('MULTIPLE_IMPLEMENTS_CLAUSES', 88, "Each class definition can have at most one implements clause");
+  static const ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES = const ParserErrorCode.con3('MULTIPLE_IMPLEMENTS_CLAUSES', 89, "Each class definition can have at most one implements clause");
 
-  static const ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES = const ParserErrorCode.con3('MULTIPLE_LIBRARY_DIRECTIVES', 89, "Only one library directive may be declared in a file");
+  static const ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES = const ParserErrorCode.con3('MULTIPLE_LIBRARY_DIRECTIVES', 90, "Only one library directive may be declared in a file");
 
-  static const ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS = const ParserErrorCode.con3('MULTIPLE_NAMED_PARAMETER_GROUPS', 90, "Cannot have multiple groups of named parameters in a single parameter list");
+  static const ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS = const ParserErrorCode.con3('MULTIPLE_NAMED_PARAMETER_GROUPS', 91, "Cannot have multiple groups of named parameters in a single parameter list");
 
-  static const ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES = const ParserErrorCode.con3('MULTIPLE_PART_OF_DIRECTIVES', 91, "Only one part-of directive may be declared in a file");
+  static const ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES = const ParserErrorCode.con3('MULTIPLE_PART_OF_DIRECTIVES', 92, "Only one part-of directive may be declared in a file");
 
-  static const ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS = const ParserErrorCode.con3('MULTIPLE_POSITIONAL_PARAMETER_GROUPS', 92, "Cannot have multiple groups of positional parameters in a single parameter list");
+  static const ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS = const ParserErrorCode.con3('MULTIPLE_POSITIONAL_PARAMETER_GROUPS', 93, "Cannot have multiple groups of positional parameters in a single parameter list");
 
-  static const ParserErrorCode MULTIPLE_VARIABLES_IN_FOR_EACH = const ParserErrorCode.con3('MULTIPLE_VARIABLES_IN_FOR_EACH', 93, "A single loop variable must be declared in a for-each loop before the 'in', but %s were found");
+  static const ParserErrorCode MULTIPLE_VARIABLES_IN_FOR_EACH = const ParserErrorCode.con3('MULTIPLE_VARIABLES_IN_FOR_EACH', 94, "A single loop variable must be declared in a for-each loop before the 'in', but %s were found");
 
-  static const ParserErrorCode MULTIPLE_WITH_CLAUSES = const ParserErrorCode.con3('MULTIPLE_WITH_CLAUSES', 94, "Each class definition can have at most one with clause");
+  static const ParserErrorCode MULTIPLE_WITH_CLAUSES = const ParserErrorCode.con3('MULTIPLE_WITH_CLAUSES', 95, "Each class definition can have at most one with clause");
 
-  static const ParserErrorCode NAMED_FUNCTION_EXPRESSION = const ParserErrorCode.con3('NAMED_FUNCTION_EXPRESSION', 95, "Function expressions cannot be named");
+  static const ParserErrorCode NAMED_FUNCTION_EXPRESSION = const ParserErrorCode.con3('NAMED_FUNCTION_EXPRESSION', 96, "Function expressions cannot be named");
 
-  static const ParserErrorCode NAMED_PARAMETER_OUTSIDE_GROUP = const ParserErrorCode.con3('NAMED_PARAMETER_OUTSIDE_GROUP', 96, "Named parameters must be enclosed in curly braces ('{' and '}')");
+  static const ParserErrorCode NAMED_PARAMETER_OUTSIDE_GROUP = const ParserErrorCode.con3('NAMED_PARAMETER_OUTSIDE_GROUP', 97, "Named parameters must be enclosed in curly braces ('{' and '}')");
 
-  static const ParserErrorCode NATIVE_CLAUSE_IN_NON_SDK_CODE = const ParserErrorCode.con3('NATIVE_CLAUSE_IN_NON_SDK_CODE', 97, "Native clause can only be used in the SDK and code that is loaded through native extensions");
+  static const ParserErrorCode NATIVE_CLAUSE_IN_NON_SDK_CODE = const ParserErrorCode.con3('NATIVE_CLAUSE_IN_NON_SDK_CODE', 98, "Native clause can only be used in the SDK and code that is loaded through native extensions");
 
-  static const ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE = const ParserErrorCode.con3('NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE', 98, "Native functions can only be declared in the SDK and code that is loaded through native extensions");
+  static const ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE = const ParserErrorCode.con3('NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE', 99, "Native functions can only be declared in the SDK and code that is loaded through native extensions");
 
-  static const ParserErrorCode NON_CONSTRUCTOR_FACTORY = const ParserErrorCode.con3('NON_CONSTRUCTOR_FACTORY', 99, "Only constructors can be declared to be a 'factory'");
+  static const ParserErrorCode NON_CONSTRUCTOR_FACTORY = const ParserErrorCode.con3('NON_CONSTRUCTOR_FACTORY', 100, "Only constructors can be declared to be a 'factory'");
 
-  static const ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME = const ParserErrorCode.con3('NON_IDENTIFIER_LIBRARY_NAME', 100, "The name of a library must be an identifier");
+  static const ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME = const ParserErrorCode.con3('NON_IDENTIFIER_LIBRARY_NAME', 101, "The name of a library must be an identifier");
 
-  static const ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = const ParserErrorCode.con3('NON_PART_OF_DIRECTIVE_IN_PART', 101, "The part-of directive must be the only directive in a part");
+  static const ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = const ParserErrorCode.con3('NON_PART_OF_DIRECTIVE_IN_PART', 102, "The part-of directive must be the only directive in a part");
 
-  static const ParserErrorCode NON_USER_DEFINABLE_OPERATOR = const ParserErrorCode.con3('NON_USER_DEFINABLE_OPERATOR', 102, "The operator '%s' is not user definable");
+  static const ParserErrorCode NON_USER_DEFINABLE_OPERATOR = const ParserErrorCode.con3('NON_USER_DEFINABLE_OPERATOR', 103, "The operator '%s' is not user definable");
 
-  static const ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = const ParserErrorCode.con3('NORMAL_BEFORE_OPTIONAL_PARAMETERS', 103, "Normal parameters must occur before optional parameters");
+  static const ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = const ParserErrorCode.con3('NORMAL_BEFORE_OPTIONAL_PARAMETERS', 104, "Normal parameters must occur before optional parameters");
 
-  static const ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = const ParserErrorCode.con3('POSITIONAL_AFTER_NAMED_ARGUMENT', 104, "Positional arguments must occur before named arguments");
+  static const ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = const ParserErrorCode.con3('POSITIONAL_AFTER_NAMED_ARGUMENT', 105, "Positional arguments must occur before named arguments");
 
-  static const ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = const ParserErrorCode.con3('POSITIONAL_PARAMETER_OUTSIDE_GROUP', 105, "Positional parameters must be enclosed in square brackets ('[' and ']')");
+  static const ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = const ParserErrorCode.con3('POSITIONAL_PARAMETER_OUTSIDE_GROUP', 106, "Positional parameters must be enclosed in square brackets ('[' and ']')");
 
-  static const ParserErrorCode REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR = const ParserErrorCode.con3('REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR', 106, "Only factory constructor can specify '=' redirection.");
+  static const ParserErrorCode REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR = const ParserErrorCode.con3('REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR', 107, "Only factory constructor can specify '=' redirection.");
 
-  static const ParserErrorCode SETTER_IN_FUNCTION = const ParserErrorCode.con3('SETTER_IN_FUNCTION', 107, "Setters cannot be defined within methods or functions");
+  static const ParserErrorCode SETTER_IN_FUNCTION = const ParserErrorCode.con3('SETTER_IN_FUNCTION', 108, "Setters cannot be defined within methods or functions");
 
-  static const ParserErrorCode STATIC_AFTER_CONST = const ParserErrorCode.con3('STATIC_AFTER_CONST', 108, "The modifier 'static' should be before the modifier 'const'");
+  static const ParserErrorCode STATIC_AFTER_CONST = const ParserErrorCode.con3('STATIC_AFTER_CONST', 109, "The modifier 'static' should be before the modifier 'const'");
 
-  static const ParserErrorCode STATIC_AFTER_FINAL = const ParserErrorCode.con3('STATIC_AFTER_FINAL', 109, "The modifier 'static' should be before the modifier 'final'");
+  static const ParserErrorCode STATIC_AFTER_FINAL = const ParserErrorCode.con3('STATIC_AFTER_FINAL', 110, "The modifier 'static' should be before the modifier 'final'");
 
-  static const ParserErrorCode STATIC_AFTER_VAR = const ParserErrorCode.con3('STATIC_AFTER_VAR', 110, "The modifier 'static' should be before the modifier 'var'");
+  static const ParserErrorCode STATIC_AFTER_VAR = const ParserErrorCode.con3('STATIC_AFTER_VAR', 111, "The modifier 'static' should be before the modifier 'var'");
 
-  static const ParserErrorCode STATIC_CONSTRUCTOR = const ParserErrorCode.con3('STATIC_CONSTRUCTOR', 111, "Constructors cannot be static");
+  static const ParserErrorCode STATIC_CONSTRUCTOR = const ParserErrorCode.con3('STATIC_CONSTRUCTOR', 112, "Constructors cannot be static");
 
-  static const ParserErrorCode STATIC_GETTER_WITHOUT_BODY = const ParserErrorCode.con3('STATIC_GETTER_WITHOUT_BODY', 112, "A 'static' getter must have a body");
+  static const ParserErrorCode STATIC_GETTER_WITHOUT_BODY = const ParserErrorCode.con3('STATIC_GETTER_WITHOUT_BODY', 113, "A 'static' getter must have a body");
 
-  static const ParserErrorCode STATIC_OPERATOR = const ParserErrorCode.con3('STATIC_OPERATOR', 113, "Operators cannot be static");
+  static const ParserErrorCode STATIC_OPERATOR = const ParserErrorCode.con3('STATIC_OPERATOR', 114, "Operators cannot be static");
 
-  static const ParserErrorCode STATIC_SETTER_WITHOUT_BODY = const ParserErrorCode.con3('STATIC_SETTER_WITHOUT_BODY', 114, "A 'static' setter must have a body");
+  static const ParserErrorCode STATIC_SETTER_WITHOUT_BODY = const ParserErrorCode.con3('STATIC_SETTER_WITHOUT_BODY', 115, "A 'static' setter must have a body");
 
-  static const ParserErrorCode STATIC_TOP_LEVEL_DECLARATION = const ParserErrorCode.con3('STATIC_TOP_LEVEL_DECLARATION', 115, "Top-level declarations cannot be declared to be 'static'");
+  static const ParserErrorCode STATIC_TOP_LEVEL_DECLARATION = const ParserErrorCode.con3('STATIC_TOP_LEVEL_DECLARATION', 116, "Top-level declarations cannot be declared to be 'static'");
 
-  static const ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = const ParserErrorCode.con3('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE', 116, "The 'default' case should be the last case in a switch statement");
+  static const ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = const ParserErrorCode.con3('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE', 117, "The 'default' case should be the last case in a switch statement");
 
-  static const ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES = const ParserErrorCode.con3('SWITCH_HAS_MULTIPLE_DEFAULT_CASES', 117, "The 'default' case can only be declared once");
+  static const ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES = const ParserErrorCode.con3('SWITCH_HAS_MULTIPLE_DEFAULT_CASES', 118, "The 'default' case can only be declared once");
 
-  static const ParserErrorCode TOP_LEVEL_OPERATOR = const ParserErrorCode.con3('TOP_LEVEL_OPERATOR', 118, "Operators must be declared within a class");
+  static const ParserErrorCode TOP_LEVEL_OPERATOR = const ParserErrorCode.con3('TOP_LEVEL_OPERATOR', 119, "Operators must be declared within a class");
 
-  static const ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', 119, "There is no '%s' to open a parameter group");
+  static const ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', 120, "There is no '%s' to open a parameter group");
 
-  static const ParserErrorCode UNEXPECTED_TOKEN = const ParserErrorCode.con3('UNEXPECTED_TOKEN', 120, "Unexpected token '%s'");
+  static const ParserErrorCode UNEXPECTED_TOKEN = const ParserErrorCode.con3('UNEXPECTED_TOKEN', 121, "Unexpected token '%s'");
 
-  static const ParserErrorCode WITH_BEFORE_EXTENDS = const ParserErrorCode.con3('WITH_BEFORE_EXTENDS', 121, "The extends clause must be before the with clause");
+  static const ParserErrorCode WITH_BEFORE_EXTENDS = const ParserErrorCode.con3('WITH_BEFORE_EXTENDS', 122, "The extends clause must be before the with clause");
 
-  static const ParserErrorCode WITH_WITHOUT_EXTENDS = const ParserErrorCode.con3('WITH_WITHOUT_EXTENDS', 122, "The with clause cannot be used without an extends clause");
+  static const ParserErrorCode WITH_WITHOUT_EXTENDS = const ParserErrorCode.con3('WITH_WITHOUT_EXTENDS', 123, "The with clause cannot be used without an extends clause");
 
-  static const ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER = const ParserErrorCode.con3('WRONG_SEPARATOR_FOR_NAMED_PARAMETER', 123, "The default value of a named parameter should be preceeded by ':'");
+  static const ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER = const ParserErrorCode.con3('WRONG_SEPARATOR_FOR_NAMED_PARAMETER', 124, "The default value of a named parameter should be preceeded by ':'");
 
-  static const ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = const ParserErrorCode.con3('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', 124, "The default value of a positional parameter should be preceeded by '='");
+  static const ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = const ParserErrorCode.con3('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', 125, "The default value of a positional parameter should be preceeded by '='");
 
-  static const ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('WRONG_TERMINATOR_FOR_PARAMETER_GROUP', 125, "Expected '%s' to close parameter group");
+  static const ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('WRONG_TERMINATOR_FOR_PARAMETER_GROUP', 126, "Expected '%s' to close parameter group");
 
-  static const ParserErrorCode VAR_AND_TYPE = const ParserErrorCode.con3('VAR_AND_TYPE', 126, "Variables cannot be declared using both 'var' and a type name; remove the 'var'");
+  static const ParserErrorCode VAR_AND_TYPE = const ParserErrorCode.con3('VAR_AND_TYPE', 127, "Variables cannot be declared using both 'var' and a type name; remove the 'var'");
 
-  static const ParserErrorCode VAR_AS_TYPE_NAME = const ParserErrorCode.con3('VAR_AS_TYPE_NAME', 127, "The keyword 'var' cannot be used as a type name");
+  static const ParserErrorCode VAR_AS_TYPE_NAME = const ParserErrorCode.con3('VAR_AS_TYPE_NAME', 128, "The keyword 'var' cannot be used as a type name");
 
-  static const ParserErrorCode VAR_CLASS = const ParserErrorCode.con3('VAR_CLASS', 128, "Classes cannot be declared to be 'var'");
+  static const ParserErrorCode VAR_CLASS = const ParserErrorCode.con3('VAR_CLASS', 129, "Classes cannot be declared to be 'var'");
 
-  static const ParserErrorCode VAR_RETURN_TYPE = const ParserErrorCode.con3('VAR_RETURN_TYPE', 129, "The return type cannot be 'var'");
+  static const ParserErrorCode VAR_RETURN_TYPE = const ParserErrorCode.con3('VAR_RETURN_TYPE', 130, "The return type cannot be 'var'");
 
-  static const ParserErrorCode VAR_TYPEDEF = const ParserErrorCode.con3('VAR_TYPEDEF', 130, "Type aliases cannot be declared to be 'var'");
+  static const ParserErrorCode VAR_TYPEDEF = const ParserErrorCode.con3('VAR_TYPEDEF', 131, "Type aliases cannot be declared to be 'var'");
 
-  static const ParserErrorCode VOID_PARAMETER = const ParserErrorCode.con3('VOID_PARAMETER', 131, "Parameters cannot have a type of 'void'");
+  static const ParserErrorCode VOID_PARAMETER = const ParserErrorCode.con3('VOID_PARAMETER', 132, "Parameters cannot have a type of 'void'");
 
-  static const ParserErrorCode VOID_VARIABLE = const ParserErrorCode.con3('VOID_VARIABLE', 132, "Variables cannot have a type of 'void'");
+  static const ParserErrorCode VOID_VARIABLE = const ParserErrorCode.con3('VOID_VARIABLE', 133, "Variables cannot have a type of 'void'");
 
   static const List<ParserErrorCode> values = const [
       ABSTRACT_CLASS_MEMBER,
@@ -7703,6 +7727,7 @@
       CONSTRUCTOR_WITH_RETURN_TYPE,
       CONTINUE_OUTSIDE_OF_LOOP,
       CONTINUE_WITHOUT_LABEL_IN_CASE,
+      DEFERRED_IMPORTS_NOT_SUPPORTED,
       DEPRECATED_CLASS_TYPE_ALIAS,
       DIRECTIVE_AFTER_DECLARATION,
       DUPLICATE_LABEL_IN_SWITCH_STATEMENT,
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index f106655..f1e857c 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1354,11 +1354,16 @@
   InterfaceType _stringType;
 
   /**
+   * The current library that is being analyzed.
+   */
+  final LibraryElement _currentLibrary;
+
+  /**
    * Initialize a newly created constant verifier.
    *
    * @param errorReporter the error reporter by which errors will be reported
    */
-  ConstantVerifier(this._errorReporter, this._typeProvider) {
+  ConstantVerifier(this._errorReporter, this._currentLibrary, this._typeProvider) {
     this._boolType = _typeProvider.boolType;
     this._intType = _typeProvider.intType;
     this._numType = _typeProvider.numType;
@@ -1415,8 +1420,12 @@
   Object visitListLiteral(ListLiteral node) {
     super.visitListLiteral(node);
     if (node.constKeyword != null) {
+      EvaluationResultImpl result;
       for (Expression element in node.elements) {
-        _validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT);
+        result = _validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT);
+        if (result is ValidResult) {
+          _reportErrorIfFromDeferredLibrary(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY);
+        }
       }
     }
     return null;
@@ -1432,18 +1441,27 @@
     for (MapLiteralEntry entry in node.entries) {
       Expression key = entry.key;
       if (isConst) {
-        EvaluationResultImpl result = _validate(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY);
-        _validate(entry.value, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE);
-        if (result is ValidResult) {
-          DartObject value = result.value;
+        EvaluationResultImpl keyResult = _validate(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY);
+        Expression valueExpression = entry.value;
+        EvaluationResultImpl valueResult = _validate(valueExpression, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE);
+        if (valueResult is ValidResult) {
+          _reportErrorIfFromDeferredLibrary(valueExpression, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY);
+        }
+        if (keyResult is ValidResult) {
+          _reportErrorIfFromDeferredLibrary(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY);
+          DartObject value = keyResult.value;
           if (keys.contains(value)) {
             invalidKeys.add(key);
           } else {
             keys.add(value);
           }
+          DartType type = value.type;
+          if (_implementsEqualsWhenNotAllowed(type)) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, key, [type.displayName]);
+          }
         }
       } else {
-        EvaluationResultImpl result = key.accept(new ConstantVisitor(_typeProvider));
+        EvaluationResultImpl result = key.accept(new ConstantVisitor.con1(_typeProvider));
         if (result is ValidResult) {
           DartObject value = result.value;
           if (keys.contains(value)) {
@@ -1472,10 +1490,37 @@
   }
 
   @override
-  Object visitSwitchCase(SwitchCase node) {
-    super.visitSwitchCase(node);
-    _validate(node.expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION);
-    return null;
+  Object visitSwitchStatement(SwitchStatement node) {
+    // TODO(paulberry): to minimize error messages, it would be nice to
+    // compare all types with the most popular type rather than the first
+    // type.
+    NodeList<SwitchMember> switchMembers = node.members;
+    bool foundError = false;
+    DartType firstType = null;
+    for (SwitchMember switchMember in switchMembers) {
+      if (switchMember is SwitchCase) {
+        SwitchCase switchCase = switchMember;
+        Expression expression = switchCase.expression;
+        EvaluationResultImpl caseResult = _validate(expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION);
+        if (caseResult is ValidResult) {
+          _reportErrorIfFromDeferredLibrary(expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY);
+          DartObject value = caseResult.value;
+          if (firstType == null) {
+            firstType = value.type;
+          } else {
+            DartType nType = value.type;
+            if (firstType != nType) {
+              _errorReporter.reportErrorForNode(CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, expression, [expression.toSource(), firstType.displayName]);
+              foundError = true;
+            }
+          }
+        }
+      }
+    }
+    if (!foundError) {
+      _checkForCaseExpressionTypeImplementsEquals(node, firstType);
+    }
+    return super.visitSwitchStatement(node);
   }
 
   @override
@@ -1498,17 +1543,79 @@
         _reportErrors(result, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
         return null;
       }
-      DeferredLibraryReferenceDetector referenceDetector = new DeferredLibraryReferenceDetector();
-      initializer.accept(referenceDetector);
-      if (referenceDetector.result) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY, initializer, []);
-        return null;
-      }
+      _reportErrorIfFromDeferredLibrary(initializer, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY);
     }
     return null;
   }
 
   /**
+   * This verifies that the passed switch statement does not have a case expression with the
+   * operator '==' overridden.
+   *
+   * @param node the switch statement to evaluate
+   * @param type the common type of all 'case' expressions
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
+   */
+  bool _checkForCaseExpressionTypeImplementsEquals(SwitchStatement node, DartType type) {
+    if (!_implementsEqualsWhenNotAllowed(type)) {
+      return false;
+    }
+    // report error
+    _errorReporter.reportErrorForToken(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, node.keyword, [type.displayName]);
+    return true;
+  }
+
+  /**
+   * @return `true` if given [Type] implements operator <i>==</i>, and it is not
+   *         <i>int</i> or <i>String</i>.
+   */
+  bool _implementsEqualsWhenNotAllowed(DartType type) {
+    // ignore int or String
+    if (type == null || type == _intType || type == _typeProvider.stringType) {
+      return false;
+    } else if (type == _typeProvider.doubleType) {
+      return true;
+    }
+    // prepare ClassElement
+    Element element = type.element;
+    if (element is! ClassElement) {
+      return false;
+    }
+    ClassElement classElement = element as ClassElement;
+    // lookup for ==
+    MethodElement method = classElement.lookUpMethod("==", _currentLibrary);
+    while (method != null && method.isAbstract) {
+      ClassElement definingClass = method.enclosingElement;
+      if (definingClass == null) {
+        return false;
+      }
+      method = definingClass.lookUpInheritedMethod("==", _currentLibrary);
+    }
+    if (method == null || method.enclosingElement.type.isObject) {
+      return false;
+    }
+    // there is == that we don't like
+    return true;
+  }
+
+  /**
+   * Given some computed [Expression], this method generates the passed [ErrorCode] on
+   * the node if its' value consists of information from a deferred library.
+   *
+   * @param expression the expression to be tested for a deferred library reference
+   * @param errorCode the error code to be used if the expression is or consists of a reference to a
+   *          deferred library
+   */
+  void _reportErrorIfFromDeferredLibrary(Expression expression, ErrorCode errorCode) {
+    DeferredLibraryReferenceDetector referenceDetector = new DeferredLibraryReferenceDetector();
+    expression.accept(referenceDetector);
+    if (referenceDetector.result) {
+      _errorReporter.reportErrorForNode(errorCode, expression, []);
+    }
+  }
+
+  /**
    * If the given result represents one or more errors, report those errors. Except for special
    * cases, use the given error code rather than the one reported in the error.
    *
@@ -1539,7 +1646,7 @@
    * @return the value of the compile time constant
    */
   EvaluationResultImpl _validate(Expression expression, ErrorCode errorCode) {
-    EvaluationResultImpl result = expression.accept(new ConstantVisitor(_typeProvider));
+    EvaluationResultImpl result = expression.accept(new ConstantVisitor.con1(_typeProvider));
     _reportErrors(result, errorCode);
     return result;
   }
@@ -1576,10 +1683,8 @@
           EvaluationResultImpl result = _validate(defaultValue, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE);
           VariableElementImpl element = parameter.element as VariableElementImpl;
           element.evaluationResult = result;
-          DeferredLibraryReferenceDetector referenceDetector = new DeferredLibraryReferenceDetector();
-          defaultValue.accept(referenceDetector);
-          if (result is ValidResult && referenceDetector.result) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY, defaultValue, []);
+          if (result is ValidResult) {
+            _reportErrorIfFromDeferredLibrary(defaultValue, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY);
           }
         }
       }
@@ -1596,6 +1701,9 @@
   void _validateInitializerExpression(List<ParameterElement> parameterElements, Expression expression) {
     EvaluationResultImpl result = expression.accept(new ConstantVisitor_ConstantVerifier_validateInitializerExpression(_typeProvider, this, parameterElements));
     _reportErrors(result, CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER);
+    if (result is ValidResult) {
+      _reportErrorIfFromDeferredLibrary(expression, CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY);
+    }
   }
 
   /**
@@ -1662,7 +1770,7 @@
 
   List<ParameterElement> parameterElements;
 
-  ConstantVisitor_ConstantVerifier_validateInitializerExpression(TypeProvider arg0, this.ConstantVerifier_this, this.parameterElements) : super(arg0);
+  ConstantVisitor_ConstantVerifier_validateInitializerExpression(TypeProvider arg0, this.ConstantVerifier_this, this.parameterElements) : super.con1(arg0);
 
   @override
   EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) {
@@ -5045,6 +5153,9 @@
       // Generate the type name.
       // The error code will never be generated via type propagation
       DartType targetType = _getStaticType(target);
+      if (targetType is InterfaceType && !targetType.isObject) {
+        targetType = (targetType as InterfaceType).superclass;
+      }
       String targetTypeName = targetType == null ? null : targetType.name;
       _resolver.reportErrorForNode(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, methodName, [methodName.name, targetTypeName]);
     }
@@ -5509,10 +5620,8 @@
             return _resolveArgumentsToFunction(false, argumentList, callMethod);
           }
         } else if (getterReturnType is FunctionType) {
-          Element functionElement = getterReturnType.element;
-          if (functionElement is ExecutableElement) {
-            return _resolveArgumentsToFunction(false, argumentList, functionElement);
-          }
+          List<ParameterElement> parameters = getterReturnType.parameters;
+          return _resolveArgumentsToParameters(false, argumentList, parameters);
         }
       }
     } else if (element is ExecutableElement) {
@@ -6662,13 +6771,13 @@
           element = setter;
         }
       }
-    } else if (element == null && node.inSetterContext()) {
+    } else if (element == null && (node.inSetterContext() || node.parent is CommentReference)) {
       element = _resolver.nameScope.lookup(new ElementResolver_SyntheticIdentifier("${node.name}="), _definingLibrary);
     }
     ClassElement enclosingClass = _resolver.enclosingClass;
     if (element == null && enclosingClass != null) {
       InterfaceType enclosingType = enclosingClass.type;
-      if (element == null && node.inSetterContext()) {
+      if (element == null && (node.inSetterContext() || node.parent is CommentReference)) {
         element = _lookUpSetter(null, enclosingType, node.name);
       }
       if (element == null && node.inGetterContext()) {
@@ -7157,6 +7266,12 @@
   }
 
   @override
+  Object visitAsExpression(AsExpression node) {
+    _checkForTypeAnnotationDeferredClass(node.type);
+    return super.visitAsExpression(node);
+  }
+
+  @override
   Object visitAssertStatement(AssertStatement node) {
     _checkForNonBoolExpression(node);
     return super.visitAssertStatement(node);
@@ -7179,7 +7294,15 @@
 
   @override
   Object visitBinaryExpression(BinaryExpression node) {
-    _checkForArgumentTypeNotAssignableForArgument(node.rightOperand);
+    sc.Token operator = node.operator;
+    sc.TokenType type = operator.type;
+    if (type == sc.TokenType.AMPERSAND_AMPERSAND || type == sc.TokenType.BAR_BAR) {
+      String lexeme = operator.lexeme;
+      _checkForAssignability(node.leftOperand, _boolType, StaticTypeWarningCode.NON_BOOL_OPERAND, [lexeme]);
+      _checkForAssignability(node.rightOperand, _boolType, StaticTypeWarningCode.NON_BOOL_OPERAND, [lexeme]);
+    } else {
+      _checkForArgumentTypeNotAssignableForArgument(node.rightOperand);
+    }
     return super.visitBinaryExpression(node);
   }
 
@@ -7219,6 +7342,7 @@
     bool previousIsInCatchClause = _isInCatchClause;
     try {
       _isInCatchClause = true;
+      _checkForTypeAnnotationDeferredClass(node.exceptionType);
       return super.visitCatchClause(node);
     } finally {
       _isInCatchClause = previousIsInCatchClause;
@@ -7557,6 +7681,12 @@
   }
 
   @override
+  Object visitIsExpression(IsExpression node) {
+    _checkForTypeAnnotationDeferredClass(node.type);
+    return super.visitIsExpression(node);
+  }
+
+  @override
   Object visitListLiteral(ListLiteral node) {
     TypeArgumentList typeArguments = node.typeArguments;
     if (typeArguments != null) {
@@ -7586,7 +7716,6 @@
       _checkForMapTypeNotAssignable(node, typeArguments);
     }
     _checkForNonConstMapAsExpressionStatement(node);
-    _checkForConstMapKeyExpressionTypeImplementsEquals(node);
     return super.visitMapLiteral(node);
   }
 
@@ -7752,7 +7881,6 @@
 
   @override
   Object visitSwitchStatement(SwitchStatement node) {
-    _checkForInconsistentCaseExpressionTypes(node);
     _checkForSwitchExpressionNotAssignable(node);
     _checkForCaseBlocksNotTerminated(node);
     return super.visitSwitchStatement(node);
@@ -8585,6 +8713,31 @@
   }
 
   /**
+   * Check that the static type of the given expression is assignable to the given type. If it
+   * isn't, report an error with the given error code.
+   *
+   * @param expression the expression being tested
+   * @param type the type that the expression must be assignable to
+   * @param errorCode the error code to be reported
+   * @param arguments the arguments to pass in when creating the error
+   * @return `true` if an error was reported
+   */
+  bool _checkForAssignability(Expression expression, InterfaceType type, ErrorCode errorCode, List<Object> arguments) {
+    if (expression == null) {
+      return false;
+    }
+    DartType expressionType = expression.staticType;
+    if (expressionType == null) {
+      return false;
+    }
+    if (expressionType.isAssignableTo(type)) {
+      return false;
+    }
+    _errorReporter.reportErrorForNode(errorCode, expression, arguments);
+    return true;
+  }
+
+  /**
    * This verifies that the passed expression is not final.
    *
    * @param node the expression to evaluate
@@ -8619,11 +8772,19 @@
         return true;
       }
       if (variable.isFinal) {
+        if (variable is FieldElementImpl && variable.setter == null && variable.isSynthetic) {
+          _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER, highlightedNode, [variable.name, variable.enclosingElement.displayName]);
+          return true;
+        }
         _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL, highlightedNode, [variable.name]);
         return true;
       }
       return false;
     }
+    if (element is FunctionElement) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FUNCTION, expression, []);
+      return true;
+    }
     if (element is MethodElement) {
       _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_METHOD, expression, []);
       return true;
@@ -8717,24 +8878,6 @@
   }
 
   /**
-   * This verifies that the passed switch statement does not have a case expression with the
-   * operator '==' overridden.
-   *
-   * @param node the switch statement to evaluate
-   * @param type the common type of all 'case' expressions
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
-   */
-  bool _checkForCaseExpressionTypeImplementsEquals(SwitchStatement node, DartType type) {
-    if (!_implementsEqualsWhenNotAllowed(type)) {
-      return false;
-    }
-    // report error
-    _errorReporter.reportErrorForToken(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, node.keyword, [type.displayName]);
-    return true;
-  }
-
-  /**
    * This verifies that the passed method declaration is abstract only if the enclosing class is
    * also abstract.
    *
@@ -9122,6 +9265,11 @@
     if (node.factoryKeyword != null) {
       return false;
     }
+    // check for mixins
+    if (_enclosingClass.mixins.length != 0) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN, node.returnType, []);
+      return true;
+    }
     // try to find and check super constructor invocation
     for (ConstructorInitializer initializer in node.initializers) {
       if (initializer is SuperConstructorInvocation) {
@@ -9130,7 +9278,7 @@
         if (element == null || element.isConst) {
           return false;
         }
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, superInvocation, []);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, superInvocation, [element.enclosingElement.displayName]);
         return true;
       }
     }
@@ -9150,7 +9298,7 @@
       return false;
     }
     // default constructor is not 'const', report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, node.returnType, []);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, node.returnType, [supertype.displayName]);
     return true;
   }
 
@@ -9227,32 +9375,6 @@
   }
 
   /**
-   * This verifies that the all keys of the passed map literal have class type that does not declare
-   * operator <i>==<i>.
-   *
-   * @param key the map literal to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
-   */
-  bool _checkForConstMapKeyExpressionTypeImplementsEquals(MapLiteral node) {
-    // OK, not const.
-    if (node.constKeyword == null) {
-      return false;
-    }
-    // Check every map entry.
-    bool hasProblems = false;
-    for (MapLiteralEntry entry in node.entries) {
-      Expression key = entry.key;
-      DartType type = key.staticType;
-      if (_implementsEqualsWhenNotAllowed(type)) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, key, [type.displayName]);
-        hasProblems = true;
-      }
-    }
-    return hasProblems;
-  }
-
-  /**
    * This verifies that the passed instance creation expression is not being invoked on an abstract
    * class.
    *
@@ -10008,42 +10130,6 @@
   }
 
   /**
-   * This verifies that the passed switch statement case expressions all have the same type.
-   *
-   * @param node the switch statement to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#INCONSISTENT_CASE_EXPRESSION_TYPES
-   */
-  bool _checkForInconsistentCaseExpressionTypes(SwitchStatement node) {
-    // TODO(jwren) Revisit this algorithm, should there up to n-1 errors?
-    NodeList<SwitchMember> switchMembers = node.members;
-    bool foundError = false;
-    DartType firstType = null;
-    for (SwitchMember switchMember in switchMembers) {
-      if (switchMember is SwitchCase) {
-        SwitchCase switchCase = switchMember;
-        Expression expression = switchCase.expression;
-        if (firstType == null) {
-          // TODO(brianwilkerson) This is failing with const variables whose declared type is
-          // dynamic. The problem is that we don't have any way to propagate type information for
-          // the variable.
-          firstType = expression.bestType;
-        } else {
-          DartType nType = expression.bestType;
-          if (firstType != nType) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, expression, [expression.toSource(), firstType.displayName]);
-            foundError = true;
-          }
-        }
-      }
-    }
-    if (!foundError) {
-      _checkForCaseExpressionTypeImplementsEquals(node, firstType);
-    }
-    return foundError;
-  }
-
-  /**
    * For each class declaration, this method is called which verifies that all inherited members are
    * inherited consistently.
    *
@@ -11032,6 +11118,7 @@
    * @see CompileTimeErrorCode#FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR
    * @see CompileTimeErrorCode#MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS
    * @see CompileTimeErrorCode#SUPER_IN_REDIRECTING_CONSTRUCTOR
+   * @see CompileTimeErrorCode#REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR
    */
   bool _checkForRedirectingConstructorErrorCodes(ConstructorDeclaration node) {
     bool errorReported = false;
@@ -11055,6 +11142,22 @@
           _errorReporter.reportErrorForNode(CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS, initializer, []);
           errorReported = true;
         }
+        if (node.factoryKeyword == null) {
+          RedirectingConstructorInvocation invocation = initializer;
+          ConstructorElement redirectingElement = invocation.staticElement;
+          if (redirectingElement == null) {
+            String enclosingTypeName = _enclosingClass.displayName;
+            String constructorStrName = enclosingTypeName;
+            if (invocation.constructorName != null) {
+              constructorStrName += ".${invocation.constructorName.name}";
+            }
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR, invocation, [constructorStrName, enclosingTypeName]);
+          } else {
+            if (redirectingElement.isFactory) {
+              _errorReporter.reportErrorForNode(CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR, initializer, []);
+            }
+          }
+        }
         numRedirections++;
       }
     }
@@ -11766,30 +11869,6 @@
     }
   }
 
-  /**
-   * @return `true` if given [Type] implements operator <i>==</i>, and it is not
-   *         <i>int</i> or <i>String</i>.
-   */
-  bool _implementsEqualsWhenNotAllowed(DartType type) {
-    // ignore int or String
-    if (type == null || type == _intType || type == _typeProvider.stringType) {
-      return false;
-    }
-    // prepare ClassElement
-    Element element = type.element;
-    if (element is! ClassElement) {
-      return false;
-    }
-    ClassElement classElement = element as ClassElement;
-    // lookup for ==
-    MethodElement method = classElement.lookUpMethod("==", _currentLibrary);
-    if (method == null || method.enclosingElement.type.isObject) {
-      return false;
-    }
-    // there is == that we don't like
-    return true;
-  }
-
   bool _isFunctionType(DartType type) {
     if (type.isDynamic || type.isBottom) {
       return true;
@@ -11984,13 +12063,13 @@
   bool visitArgumentList(ArgumentList node) => _visitExpressions(node.arguments);
 
   @override
-  bool visitAsExpression(AsExpression node) => node.expression.accept(this);
+  bool visitAsExpression(AsExpression node) => _nodeExits(node.expression);
 
   @override
-  bool visitAssertStatement(AssertStatement node) => node.condition.accept(this);
+  bool visitAssertStatement(AssertStatement node) => _nodeExits(node.condition);
 
   @override
-  bool visitAssignmentExpression(AssignmentExpression node) => node.leftHandSide.accept(this) || node.rightHandSide.accept(this);
+  bool visitAssignmentExpression(AssignmentExpression node) => _nodeExits(node.leftHandSide) || _nodeExits(node.rightHandSide);
 
   @override
   bool visitBinaryExpression(BinaryExpression node) {
@@ -12019,14 +12098,14 @@
       }
     }
     Expression rhsExpression = node.rightOperand;
-    return (lhsExpression != null && lhsExpression.accept(this)) || (rhsExpression != null && rhsExpression.accept(this));
+    return _nodeExits(lhsExpression) || _nodeExits(rhsExpression);
   }
 
   @override
   bool visitBlock(Block node) => _visitStatements(node.statements);
 
   @override
-  bool visitBlockFunctionBody(BlockFunctionBody node) => node.block.accept(this);
+  bool visitBlockFunctionBody(BlockFunctionBody node) => _nodeExits(node.block);
 
   @override
   bool visitBreakStatement(BreakStatement node) {
@@ -12035,13 +12114,7 @@
   }
 
   @override
-  bool visitCascadeExpression(CascadeExpression node) {
-    Expression target = node.target;
-    if (target.accept(this)) {
-      return true;
-    }
-    return _visitExpressions(node.cascadeSections);
-  }
+  bool visitCascadeExpression(CascadeExpression node) => _nodeExits(node.target) || _visitExpressions(node.cascadeSections);
 
   @override
   bool visitConditionalExpression(ConditionalExpression node) {
@@ -12050,7 +12123,7 @@
     Expression elseStatement = node.elseExpression;
     // TODO(jwren) Do we want to take constant expressions into account, evaluate if(false) {}
     // differently than if(<condition>), when <condition> evaluates to a constant false value?
-    if (conditionExpression.accept(this)) {
+    if (_nodeExits(conditionExpression)) {
       return true;
     }
     if (thenStatement == null || elseStatement == null) {
@@ -12068,7 +12141,7 @@
     _enclosingBlockContainsBreak = false;
     try {
       Expression conditionExpression = node.condition;
-      if (conditionExpression.accept(this)) {
+      if (_nodeExits(conditionExpression)) {
         return true;
       }
       // TODO(jwren) Do we want to take all constant expressions into account?
@@ -12076,7 +12149,7 @@
         BooleanLiteral booleanLiteral = conditionExpression;
         // If do {} while (true), and the body doesn't return or the body doesn't have a break, then
         // return true.
-        bool blockReturns = node.body.accept(this);
+        bool blockReturns = _nodeExits(node.body);
         if (booleanLiteral.value && (blockReturns || !_enclosingBlockContainsBreak)) {
           return true;
         }
@@ -12091,14 +12164,14 @@
   bool visitEmptyStatement(EmptyStatement node) => false;
 
   @override
-  bool visitExpressionStatement(ExpressionStatement node) => node.expression.accept(this);
+  bool visitExpressionStatement(ExpressionStatement node) => _nodeExits(node.expression);
 
   @override
   bool visitForEachStatement(ForEachStatement node) {
     bool outerBreakValue = _enclosingBlockContainsBreak;
     _enclosingBlockContainsBreak = false;
     try {
-      return node.iterator.accept(this);
+      return _nodeExits(node.iterator);
     } finally {
       _enclosingBlockContainsBreak = outerBreakValue;
     }
@@ -12112,11 +12185,11 @@
       if (node.variables != null && _visitVariableDeclarations(node.variables.variables)) {
         return true;
       }
-      if (node.initialization != null && node.initialization.accept(this)) {
+      if (node.initialization != null && _nodeExits(node.initialization)) {
         return true;
       }
       Expression conditionExpression = node.condition;
-      if (conditionExpression != null && conditionExpression.accept(this)) {
+      if (conditionExpression != null && _nodeExits(conditionExpression)) {
         return true;
       }
       if (_visitExpressions(node.updaters)) {
@@ -12127,7 +12200,7 @@
       // break, then return true.
       bool implicitOrExplictTrue = conditionExpression == null || (conditionExpression is BooleanLiteral && conditionExpression.value);
       if (implicitOrExplictTrue) {
-        bool blockReturns = node.body.accept(this);
+        bool blockReturns = _nodeExits(node.body);
         if (blockReturns || !_enclosingBlockContainsBreak) {
           return true;
         }
@@ -12146,7 +12219,7 @@
 
   @override
   bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    if (node.function.accept(this)) {
+    if (_nodeExits(node.function)) {
       return true;
     }
     return node.argumentList.accept(this);
@@ -12160,7 +12233,7 @@
     Expression conditionExpression = node.condition;
     Statement thenStatement = node.thenStatement;
     Statement elseStatement = node.elseStatement;
-    if (conditionExpression.accept(this)) {
+    if (_nodeExits(conditionExpression)) {
       return true;
     }
     // TODO(jwren) Do we want to take all constant expressions into account?
@@ -12168,32 +12241,32 @@
       BooleanLiteral booleanLiteral = conditionExpression;
       if (booleanLiteral.value) {
         // if(true) ...
-        return thenStatement.accept(this);
+        return _nodeExits(thenStatement);
       } else if (elseStatement != null) {
         // if (false) ...
-        return elseStatement.accept(this);
+        return _nodeExits(elseStatement);
       }
     }
     if (thenStatement == null || elseStatement == null) {
       return false;
     }
-    return thenStatement.accept(this) && elseStatement.accept(this);
+    return _nodeExits(thenStatement) && _nodeExits(elseStatement);
   }
 
   @override
   bool visitIndexExpression(IndexExpression node) {
     Expression target = node.realTarget;
-    if (target != null && target.accept(this)) {
+    if (_nodeExits(target)) {
       return true;
     }
-    if (node.index.accept(this)) {
+    if (_nodeExits(node.index)) {
       return true;
     }
     return false;
   }
 
   @override
-  bool visitInstanceCreationExpression(InstanceCreationExpression node) => node.argumentList.accept(this);
+  bool visitInstanceCreationExpression(InstanceCreationExpression node) => _nodeExits(node.argumentList);
 
   @override
   bool visitIsExpression(IsExpression node) => node.expression.accept(this);
@@ -12213,7 +12286,7 @@
     if (target != null && target.accept(this)) {
       return true;
     }
-    return node.argumentList.accept(this);
+    return _nodeExits(node.argumentList);
   }
 
   @override
@@ -12289,11 +12362,11 @@
 
   @override
   bool visitTryStatement(TryStatement node) {
-    if (node.body.accept(this)) {
+    if (_nodeExits(node.body)) {
       return true;
     }
     Block finallyBlock = node.finallyBlock;
-    if (finallyBlock != null && finallyBlock.accept(this)) {
+    if (_nodeExits(finallyBlock)) {
       return true;
     }
     return false;
@@ -12350,6 +12423,19 @@
     }
   }
 
+  /**
+   * Return `true` if the given node exits.
+   *
+   * @param node the node being tested
+   * @return `true` if the given node exits
+   */
+  bool _nodeExits(AstNode node) {
+    if (node == null) {
+      return false;
+    }
+    return node.accept(this);
+  }
+
   bool _visitExpressions(NodeList<Expression> expressions) {
     for (int i = expressions.length - 1; i >= 0; i--) {
       if (expressions[i].accept(this)) {
@@ -12757,9 +12843,9 @@
           script.scriptLibrary = library;
           _resolvedLibraries.addAll(resolver.resolvedLibraries);
           _errorListener.addAll(resolver.errorListener);
-        } on AnalysisException catch (exception) {
+        } on AnalysisException catch (exception, stackTrace) {
           //TODO (danrubel): Handle or forward the exception
-          AnalysisEngine.instance.logger.logError2("Could not resolve script tag", exception);
+          AnalysisEngine.instance.logger.logError2("Could not resolve script tag", new CaughtException(exception, stackTrace));
         }
         node.scriptElement = script;
         _scripts.add(script);
@@ -13307,7 +13393,7 @@
     AstNode rootNode = _findResolutionRoot(node);
     Scope scope = ScopeBuilder.scopeFor(rootNode, _errorListener);
     if (_elementModelChanged(rootNode.parent)) {
-      throw new AnalysisException.con1("Cannot resolve node: element model changed");
+      throw new AnalysisException("Cannot resolve node: element model changed");
     }
     _resolveTypes(node, scope);
     _resolveVariables(node, scope);
@@ -13334,7 +13420,7 @@
   bool _elementModelChanged(AstNode node) {
     Element element = _getElement(node);
     if (element == null) {
-      throw new AnalysisException.con1("Cannot resolve node: a ${node.runtimeType.toString()} does not define an element");
+      throw new AnalysisException("Cannot resolve node: a ${node.runtimeType.toString()} does not define an element");
     }
     DeclarationMatcher matcher = new DeclarationMatcher();
     return !matcher.matches(node, element);
@@ -13356,7 +13442,7 @@
       parent = result.parent;
     }
     if (parent == null) {
-      throw new AnalysisException.con1("Cannot resolve node: no resolvable node");
+      throw new AnalysisException("Cannot resolve node: no resolvable node");
     }
     return result;
   }
@@ -14530,8 +14616,8 @@
     if (_libraryElement == null) {
       try {
         _libraryElement = _analysisContext.computeLibraryElement(librarySource) as LibraryElementImpl;
-      } on AnalysisException catch (exception) {
-        AnalysisEngine.instance.logger.logError2("Could not compute library element for ${librarySource.fullName}", exception);
+      } on AnalysisException catch (exception, stackTrace) {
+        AnalysisEngine.instance.logger.logError2("Could not compute library element for ${librarySource.fullName}", new CaughtException(exception, stackTrace));
       }
     }
     return _libraryElement;
@@ -15175,7 +15261,7 @@
         // This will be true unless the library being analyzed is the core library.
         _coreLibrary = createLibrary(_coreLibrarySource);
         if (_coreLibrary == null) {
-          throw new AnalysisException.con1("Core library does not exist");
+          throw new AnalysisException("Core library does not exist");
         }
       }
       instrumentation.metric3("createLibrary", "complete");
@@ -15202,7 +15288,7 @@
       instrumentation.metric3("buildElementModels", "complete");
       LibraryElement coreElement = _coreLibrary.libraryElement;
       if (coreElement == null) {
-        throw new AnalysisException.con1("Could not resolve dart:core");
+        throw new AnalysisException("Could not resolve dart:core");
       }
       _buildDirectiveModels();
       instrumentation.metric3("buildDirectiveModels", "complete");
@@ -15259,7 +15345,7 @@
         // This will be true unless the library being analyzed is the core library.
         _coreLibrary = _createLibraryOrNull(_coreLibrarySource);
         if (_coreLibrary == null) {
-          throw new AnalysisException.con1("Core library does not exist");
+          throw new AnalysisException("Core library does not exist");
         }
       }
       instrumentation.metric3("createLibrary", "complete");
@@ -15286,7 +15372,7 @@
       instrumentation.metric3("buildElementModels", "complete");
       LibraryElement coreElement = _coreLibrary.libraryElement;
       if (coreElement == null) {
-        throw new AnalysisException.con1("Could not resolve dart:core");
+        throw new AnalysisException("Could not resolve dart:core");
       }
       _buildDirectiveModels();
       instrumentation.metric3("buildDirectiveModels", "complete");
@@ -15739,8 +15825,8 @@
             if (unit != null) {
               computer.add(unit);
             }
-          } on AnalysisException catch (exception) {
-            AnalysisEngine.instance.logger.logError2("Internal Error: Could not access AST for ${source.fullName} during constant evaluation", exception);
+          } on AnalysisException catch (exception, stackTrace) {
+            AnalysisEngine.instance.logger.logError2("Internal Error: Could not access AST for ${source.fullName} during constant evaluation", new CaughtException(exception, stackTrace));
           }
         }
       }
@@ -15934,7 +16020,7 @@
       instrumentation.metric3("buildElementModels", "complete");
       LibraryElement coreElement = _coreLibrary.libraryElement;
       if (coreElement == null) {
-        throw new AnalysisException.con1("Could not resolve dart:core");
+        throw new AnalysisException("Could not resolve dart:core");
       }
       _buildDirectiveModels();
       instrumentation.metric3("buildDirectiveModels", "complete");
@@ -17622,6 +17708,12 @@
   ClassElement _enclosingClass = null;
 
   /**
+   * The class declaration representing the class containing the current node, or `null` if
+   * the current node is not contained in a class.
+   */
+  ClassDeclaration _enclosingClassDeclaration = null;
+
+  /**
    * The element representing the function containing the current node, or `null` if the
    * current node is not contained in a function.
    */
@@ -17716,6 +17808,14 @@
   TypePromotionManager get promoteManager => _promoteManager;
 
   @override
+  Object visitAnnotation(Annotation node) {
+    if (identical(node.parent, _enclosingClassDeclaration)) {
+      return null;
+    }
+    return super.visitAnnotation(node);
+  }
+
+  @override
   Object visitAsExpression(AsExpression node) {
     super.visitAsExpression(node);
     overrideExpression(node.expression, node.type.type);
@@ -17800,6 +17900,12 @@
 
   @override
   Object visitClassDeclaration(ClassDeclaration node) {
+    // Resolve the class metadata in the library scope.
+    if (node.metadata != null) {
+      node.metadata.accept(this);
+    }
+    _enclosingClassDeclaration = node;
+    // Continue the class resolution.
     ClassElement outerType = _enclosingClass;
     try {
       _enclosingClass = node.element;
@@ -17808,6 +17914,7 @@
     } finally {
       _typeAnalyzer.thisType = outerType == null ? null : outerType.type;
       _enclosingClass = outerType;
+      _enclosingClassDeclaration = null;
     }
     return null;
   }
@@ -19038,14 +19145,14 @@
    */
   static Scope scopeFor(AstNode node, AnalysisErrorListener errorListener) {
     if (node == null) {
-      throw new AnalysisException.con1("Cannot create scope: node is null");
+      throw new AnalysisException("Cannot create scope: node is null");
     } else if (node is CompilationUnit) {
       ScopeBuilder builder = new ScopeBuilder(errorListener);
       return builder._scopeForAstNode(node);
     }
     AstNode parent = node.parent;
     if (parent == null) {
-      throw new AnalysisException.con1("Cannot create scope: node is not part of a CompilationUnit");
+      throw new AnalysisException("Cannot create scope: node is not part of a CompilationUnit");
     }
     ScopeBuilder builder = new ScopeBuilder(errorListener);
     return builder._scopeForAstNode(parent);
@@ -19081,25 +19188,25 @@
     }
     AstNode parent = node.parent;
     if (parent == null) {
-      throw new AnalysisException.con1("Cannot create scope: node is not part of a CompilationUnit");
+      throw new AnalysisException("Cannot create scope: node is not part of a CompilationUnit");
     }
     Scope scope = _scopeForAstNode(parent);
     if (node is ClassDeclaration) {
       ClassElement element = node.element;
       if (element == null) {
-        throw new AnalysisException.con1("Cannot build a scope for an unresolved class");
+        throw new AnalysisException("Cannot build a scope for an unresolved class");
       }
       scope = new ClassScope(scope, element);
     } else if (node is ClassTypeAlias) {
       ClassElement element = node.element;
       if (element == null) {
-        throw new AnalysisException.con1("Cannot build a scope for an unresolved class type alias");
+        throw new AnalysisException("Cannot build a scope for an unresolved class type alias");
       }
       scope = new ClassScope(scope, element);
     } else if (node is ConstructorDeclaration) {
       ConstructorElement element = node.element;
       if (element == null) {
-        throw new AnalysisException.con1("Cannot build a scope for an unresolved constructor");
+        throw new AnalysisException("Cannot build a scope for an unresolved constructor");
       }
       FunctionScope functionScope = new FunctionScope(scope, element);
       functionScope.defineParameters();
@@ -19107,7 +19214,7 @@
     } else if (node is FunctionDeclaration) {
       ExecutableElement element = node.element;
       if (element == null) {
-        throw new AnalysisException.con1("Cannot build a scope for an unresolved function");
+        throw new AnalysisException("Cannot build a scope for an unresolved function");
       }
       FunctionScope functionScope = new FunctionScope(scope, element);
       functionScope.defineParameters();
@@ -19117,7 +19224,7 @@
     } else if (node is MethodDeclaration) {
       ExecutableElement element = node.element;
       if (element == null) {
-        throw new AnalysisException.con1("Cannot build a scope for an unresolved method");
+        throw new AnalysisException("Cannot build a scope for an unresolved method");
       }
       FunctionScope functionScope = new FunctionScope(scope, element);
       functionScope.defineParameters();
@@ -19129,11 +19236,11 @@
   Scope _scopeForCompilationUnit(CompilationUnit node) {
     CompilationUnitElement unitElement = node.element;
     if (unitElement == null) {
-      throw new AnalysisException.con1("Cannot create scope: compilation unit is not resolved");
+      throw new AnalysisException("Cannot create scope: compilation unit is not resolved");
     }
     LibraryElement libraryElement = unitElement.library;
     if (libraryElement == null) {
-      throw new AnalysisException.con1("Cannot create scope: compilation unit is not part of a library");
+      throw new AnalysisException("Cannot create scope: compilation unit is not part of a library");
     }
     return new LibraryScope(libraryElement, _errorListener);
   }
diff --git a/pkg/analyzer/lib/src/generated/utilities_collection.dart b/pkg/analyzer/lib/src/generated/utilities_collection.dart
index 85d6a76..0ba35d3 100644
--- a/pkg/analyzer/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_collection.dart
@@ -134,11 +134,23 @@
   }
 
   /**
-   * Return a list of nodes that form a cycle, or `null` if there are no cycles in this graph.
-   *
-   * @return a list of nodes that form a cycle
+   * Run a topological sort of the graph. Since the graph may contain cycles, this results in a list
+   * of strongly connected components rather than a list of nodes. The nodes in each strongly
+   * connected components only have edges that point to nodes in the same component or earlier
+   * components.
    */
-  List<N> findCycle() => null;
+  List<List<N>> computeTopologicalSort() {
+    DirectedGraph_SccFinder<N> finder = new DirectedGraph_SccFinder<N>(this);
+    return finder.computeTopologicalSort();
+  }
+
+  /**
+   * Return true if the graph contains at least one path from `source` to `destination`.
+   */
+  bool containsPath(N source, N destination) {
+    Set<N> nodesVisited = new Set<N>();
+    return _containsPathInternal(source, destination, nodesVisited);
+  }
 
   /**
    * Return a list of nodes that form a cycle containing the given node. If the node is not part of
@@ -162,6 +174,11 @@
   int get nodeCount => _edges.length;
 
   /**
+   * Return a set of all nodes in the graph.
+   */
+  Set<N> get nodes => _edges.keys.toSet();
+
+  /**
    * Return a set containing the tails of edges that have the given node as their head. The set will
    * be empty if there are no such edges or if the node is not part of the graph. Clients must not
    * modify the returned set.
@@ -243,6 +260,24 @@
     return sink;
   }
 
+  bool _containsPathInternal(N source, N destination, Set<N> nodesVisited) {
+    if (identical(source, destination)) {
+      return true;
+    }
+    Set<N> tails = _edges[source];
+    if (tails != null) {
+      nodesVisited.add(source);
+      for (N tail in tails) {
+        if (!nodesVisited.contains(tail)) {
+          if (_containsPathInternal(tail, destination, nodesVisited)) {
+            return true;
+          }
+        }
+      }
+    }
+    return false;
+  }
+
   /**
    * Return one node that has no outgoing edges (that is, for which there are no edges that have
    * that node as the head of the edge), or `null` if there are no such nodes.
@@ -323,6 +358,13 @@
   Map<N, DirectedGraph_NodeInfo<N>> _nodeMap = new Map<N, DirectedGraph_NodeInfo<N>>();
 
   /**
+   * A list of all strongly connected components found, in topological sort order (each node in a
+   * strongly connected component only has edges that point to nodes in the same component or
+   * earlier components).
+   */
+  List<List<N>> _allComponents = new List<List<N>>();
+
+  /**
    * Initialize a newly created finder.
    */
   DirectedGraph_SccFinder(this._graph) : super();
@@ -338,6 +380,21 @@
   List<N> componentContaining(N node) => _strongConnect(node).component;
 
   /**
+   * Run Tarjan's algorithm and return the resulting list of strongly connected components. The
+   * list is in topological sort order (each node in a strongly connected component only has edges
+   * that point to nodes in the same component or earlier components).
+   */
+  List<List<N>> computeTopologicalSort() {
+    for (N node in _graph._edges.keys.toSet()) {
+      DirectedGraph_NodeInfo<N> nodeInfo = _nodeMap[node];
+      if (nodeInfo == null) {
+        _strongConnect(node);
+      }
+    }
+    return _allComponents;
+  }
+
+  /**
    * Remove and return the top-most element from the stack.
    *
    * @return the element that was removed
@@ -400,6 +457,7 @@
         component.add(w);
         _nodeMap[w].component = component;
       } while (!identical(w, v));
+      _allComponents.add(component);
     }
     return vInfo;
   }
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 0df5783..cb37f34 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.15.2-dev
+version: 0.15.4
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index 7664e36..f4f69e9 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -1121,84 +1121,84 @@
 class IndexExpressionTest extends EngineTestCase {
   void test_inGetterContext_assignment_compound_left() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // a[i] += ?
-    AstFactory.assignmentExpression(expression, TokenType.PLUS_EQ, null);
+    // a[b] += c
+    AstFactory.assignmentExpression(expression, TokenType.PLUS_EQ, AstFactory.identifier3("c"));
     JUnitTestCase.assertTrue(expression.inGetterContext());
   }
 
   void test_inGetterContext_assignment_simple_left() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // a[i] = ?
-    AstFactory.assignmentExpression(expression, TokenType.EQ, null);
+    // a[b] = c
+    AstFactory.assignmentExpression(expression, TokenType.EQ, AstFactory.identifier3("c"));
     JUnitTestCase.assertFalse(expression.inGetterContext());
   }
 
   void test_inGetterContext_nonAssignment() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // a[i] + ?
-    AstFactory.binaryExpression(expression, TokenType.PLUS, null);
+    // a[b] + c
+    AstFactory.binaryExpression(expression, TokenType.PLUS, AstFactory.identifier3("c"));
     JUnitTestCase.assertTrue(expression.inGetterContext());
   }
 
   void test_inSetterContext_assignment_compound_left() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // a[i] += ?
-    AstFactory.assignmentExpression(expression, TokenType.PLUS_EQ, null);
+    // a[b] += c
+    AstFactory.assignmentExpression(expression, TokenType.PLUS_EQ, AstFactory.identifier3("c"));
     JUnitTestCase.assertTrue(expression.inSetterContext());
   }
 
   void test_inSetterContext_assignment_compound_right() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // ? += a[i]
-    AstFactory.assignmentExpression(null, TokenType.PLUS_EQ, expression);
+    // c += a[b]
+    AstFactory.assignmentExpression(AstFactory.identifier3("c"), TokenType.PLUS_EQ, expression);
     JUnitTestCase.assertFalse(expression.inSetterContext());
   }
 
   void test_inSetterContext_assignment_simple_left() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // a[i] = ?
-    AstFactory.assignmentExpression(expression, TokenType.EQ, null);
+    // a[b] = c
+    AstFactory.assignmentExpression(expression, TokenType.EQ, AstFactory.identifier3("c"));
     JUnitTestCase.assertTrue(expression.inSetterContext());
   }
 
   void test_inSetterContext_assignment_simple_right() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // ? = a[i]
-    AstFactory.assignmentExpression(null, TokenType.EQ, expression);
+    // c = a[b]
+    AstFactory.assignmentExpression(AstFactory.identifier3("c"), TokenType.EQ, expression);
     JUnitTestCase.assertFalse(expression.inSetterContext());
   }
 
   void test_inSetterContext_nonAssignment() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    AstFactory.binaryExpression(expression, TokenType.PLUS, null);
-    // a[i] + ?
+    AstFactory.binaryExpression(expression, TokenType.PLUS, AstFactory.identifier3("c"));
+    // a[b] + cc
     JUnitTestCase.assertFalse(expression.inSetterContext());
   }
 
   void test_inSetterContext_postfix() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
     AstFactory.postfixExpression(expression, TokenType.PLUS_PLUS);
-    // a[i]++
+    // a[b]++
     JUnitTestCase.assertTrue(expression.inSetterContext());
   }
 
   void test_inSetterContext_prefix_bang() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // !a[i]
+    // !a[b]
     AstFactory.prefixExpression(TokenType.BANG, expression);
     JUnitTestCase.assertFalse(expression.inSetterContext());
   }
 
   void test_inSetterContext_prefix_minusMinus() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // --a[i]
+    // --a[b]
     AstFactory.prefixExpression(TokenType.MINUS_MINUS, expression);
     JUnitTestCase.assertTrue(expression.inSetterContext());
   }
 
   void test_inSetterContext_prefix_plusPlus() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // ++a[i]
+    // ++a[b]
     AstFactory.prefixExpression(TokenType.PLUS_PLUS, expression);
     JUnitTestCase.assertTrue(expression.inSetterContext());
   }
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index 485ffd9..9cbb1e6 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -289,6 +289,47 @@
     JUnitTestCase.assertNull(classA.lookUpGetter("g", library));
   }
 
+  void test_lookUpInheritedMethod_declared() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement method = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertNull(classA.lookUpInheritedMethod(methodName, library));
+  }
+
+  void test_lookUpInheritedMethod_declaredAndInherited() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement inheritedMethod = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    MethodElement method = ElementFactory.methodElement(methodName, null, []);
+    classB.methods = <MethodElement> [method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertSame(inheritedMethod, classB.lookUpInheritedMethod(methodName, library));
+  }
+
+  void test_lookUpInheritedMethod_inherited() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement inheritedMethod = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertSame(inheritedMethod, classB.lookUpInheritedMethod(methodName, library));
+  }
+
+  void test_lookUpInheritedMethod_undeclared() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertNull(classA.lookUpInheritedMethod("m", library));
+  }
+
   void test_lookUpMethod_declared() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
@@ -453,6 +494,22 @@
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_lookUpGetter_undeclared_recursive);
       });
+      _ut.test('test_lookUpInheritedMethod_declared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedMethod_declared);
+      });
+      _ut.test('test_lookUpInheritedMethod_declaredAndInherited', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedMethod_declaredAndInherited);
+      });
+      _ut.test('test_lookUpInheritedMethod_inherited', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedMethod_inherited);
+      });
+      _ut.test('test_lookUpInheritedMethod_undeclared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedMethod_undeclared);
+      });
       _ut.test('test_lookUpMethod_declared', () {
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_lookUpMethod_declared);
@@ -1021,6 +1078,15 @@
     JUnitTestCase.assertEquals(encoding, location.encoding);
   }
 
+  /**
+   * For example unnamed constructor.
+   */
+  void test_create_encoding_emptyLast() {
+    String encoding = "a;b;c;";
+    ElementLocationImpl location = new ElementLocationImpl.con2(encoding);
+    JUnitTestCase.assertEquals(encoding, location.encoding);
+  }
+
   void test_equals_equal() {
     String encoding = "a;b;c";
     ElementLocationImpl first = new ElementLocationImpl.con2(encoding);
@@ -1086,6 +1152,10 @@
         final __test = new ElementLocationImplTest();
         runJUnitTest(__test, __test.test_create_encoding);
       });
+      _ut.test('test_create_encoding_emptyLast', () {
+        final __test = new ElementLocationImplTest();
+        runJUnitTest(__test, __test.test_create_encoding_emptyLast);
+      });
       _ut.test('test_equals_equal', () {
         final __test = new ElementLocationImplTest();
         runJUnitTest(__test, __test.test_equals_equal);
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index a22619a..7d1c72b 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -3195,6 +3195,7 @@
     listener.setLineInfo(new TestSource(), scanner.lineStarts);
     Token token = scanner.tokenize();
     Parser parser = new Parser(null, listener);
+    parser.parseDeferredLibraries = true;
     CompilationUnit unit = parser.parseCompilationUnit(token);
     JUnitTestCase.assertNotNull(unit);
     listener.assertErrorsWithCodes(errorCodes);
@@ -3294,6 +3295,7 @@
     //
     Parser parser = new Parser(null, listener);
     parser.parseFunctionBodies = parseFunctionBodies;
+    parser.parseDeferredLibraries = true;
     Object result = invokeParserMethodImpl(parser, methodName, objects, tokenStream);
     //
     // Partially test the results.
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index a118fb6..cbea5a5 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -225,7 +225,7 @@
   @override
   void set analysisOptions(AnalysisOptions options) {
     AnalysisOptions currentOptions = analysisOptions;
-    bool needsRecompute = currentOptions.analyzeFunctionBodies != options.analyzeFunctionBodies || currentOptions.generateSdkErrors != options.generateSdkErrors || currentOptions.dart2jsHint != options.dart2jsHint || (currentOptions.hint && !options.hint) || currentOptions.preserveComments != options.preserveComments;
+    bool needsRecompute = currentOptions.analyzeFunctionBodies != options.analyzeFunctionBodies || currentOptions.generateSdkErrors != options.generateSdkErrors || currentOptions.enableDeferredLoading != options.enableDeferredLoading || currentOptions.dart2jsHint != options.dart2jsHint || (currentOptions.hint && !options.hint) || currentOptions.preserveComments != options.preserveComments;
     if (needsRecompute) {
       JUnitTestCase.fail("Cannot set options that cause the sources to be reanalyzed in a test context");
     }
@@ -562,6 +562,43 @@
     verify([source]);
   }
 
+  void test_consistentCaseExpressionTypes_dynamic() {
+    // Even though A.S and S have a static type of "dynamic", we should see
+    // that they match 'abc', because they are constant strings.
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static const S = 'A.S';",
+        "}",
+        "",
+        "const S = 'S';",
+        "",
+        "foo(var p) {",
+        "  switch (p) {",
+        "    case S:",
+        "      break;",
+        "    case A.S:",
+        "      break;",
+        "    case 'abc':",
+        "      break;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constConstructorWithMixin() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class M {",
+        "}",
+        "class A extends Object with M {",
+        "  const A();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN]);
+    verify([source]);
+  }
+
   void test_constConstructorWithNonConstSuper_explicit() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -597,7 +634,9 @@
         "  const B();",
         "}"]));
     resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD]);
+    assertErrors(source, [
+        CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN,
+        CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD]);
     verify([source]);
   }
 
@@ -656,6 +695,19 @@
     verify([source]);
   }
 
+  void test_constEval_newInstance_externalFactoryConstConstructor() {
+    // We can't evaluate "const A()" because its constructor is external.  But
+    // the code is correct--we shouldn't report an error.
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  external factory const A();",
+        "}",
+        "const x = const A();"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_constEval_propertyExtraction_targetNotConst() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -715,6 +767,7 @@
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
+        StaticTypeWarningCode.NON_BOOL_OPERAND,
         HintCode.DEAD_CODE]);
     verify([source]);
   }
@@ -846,6 +899,44 @@
     verify([source]);
   }
 
+  void test_constMapKeyTypeImplementsEquals_dynamic() {
+    // Note: static type of B.a is "dynamic", but actual type of the const
+    // object is A.  We need to make sure we examine the actual type when
+    // deciding whether there is a problem with operator==.
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A();",
+        "  operator ==(other) => false;",
+        "}",
+        "class B {",
+        "  static const a = const A();",
+        "}",
+        "main() {",
+        "  const {B.a : 0};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
+    verify([source]);
+  }
+
+  void test_constMapKeyTypeImplementsEquals_factory() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A { const factory A() = B; }",
+        "",
+        "class B implements A {",
+        "  const B();",
+        "",
+        "  operator ==(o) => true;",
+        "}",
+        "",
+        "main() {",
+        "  var m = const { const A(): 42 };",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
+    verify([source]);
+  }
+
   void test_constMapKeyTypeImplementsEquals_super() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1872,6 +1963,33 @@
     verify([source]);
   }
 
+  void test_inconsistentCaseExpressionTypes_dynamic() {
+    // Even though A.S and S have a static type of "dynamic", we should see
+    // that they fail to match 3, because they are constant strings.
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static const S = 'A.S';",
+        "}",
+        "",
+        "const S = 'S';",
+        "",
+        "foo(var p) {",
+        "  switch (p) {",
+        "    case 3:",
+        "      break;",
+        "    case S:",
+        "      break;",
+        "    case A.S:",
+        "      break;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES,
+        CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES]);
+    verify([source]);
+  }
+
   void test_inconsistentCaseExpressionTypes_repeated() {
     Source source = addSource(EngineTestCase.createSource([
         "f(var p) {",
@@ -2064,6 +2182,12 @@
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
   }
 
+  void test_invalidAnnotation_useLibraryScope() {
+    Source source = addSource(EngineTestCase.createSource(["@foo", "class A {", "  static const foo = null;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+  }
+
   void test_invalidAnnotationFromDeferredLibrary() {
     // See test_invalidAnnotation_notConstantVariable
     addNamedSource("/lib1.dart", EngineTestCase.createSource([
@@ -2715,6 +2839,38 @@
     verify([source]);
   }
 
+  void test_nonConstCaseExpressionFromDeferredLibrary() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "main (int p) {",
+        "  switch (p) {",
+        "    case a.c:",
+        "      break;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstCaseExpressionFromDeferredLibrary_nested() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "main (int p) {",
+        "  switch (p) {",
+        "    case a.c + 1:",
+        "      break;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
   void test_nonConstListElement() {
     Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const [a];", "}"]));
     resolve(source);
@@ -2722,6 +2878,32 @@
     verify([source]);
   }
 
+  void test_nonConstListElementFromDeferredLibrary() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f() {",
+        "  return const [a.c];",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstListElementFromDeferredLibrary_nested() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f() {",
+        "  return const [a.c + 1];",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
   void test_nonConstMapAsExpressionStatement_begin() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  {'a' : 0, 'b' : 1}.length;", "}"]));
     resolve(source);
@@ -2743,6 +2925,32 @@
     verify([source]);
   }
 
+  void test_nonConstMapKeyFromDeferredLibrary() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f() {",
+        "  return const {a.c : 0};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstMapKeyFromDeferredLibrary_nested() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f() {",
+        "  return const {a.c + 1 : 0};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
   void test_nonConstMapValue() {
     Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const {'a' : a};", "}"]));
     resolve(source);
@@ -2750,6 +2958,32 @@
     verify([source]);
   }
 
+  void test_nonConstMapValueFromDeferredLibrary() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f() {",
+        "  return const {'a' : a.c};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstMapValueFromDeferredLibrary_nested() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f() {",
+        "  return const {'a' : a.c + 1};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
   void test_nonConstValueInInitializer_binary_notBool_left() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2757,7 +2991,9 @@
         "  const A(String p) : a = p && true;",
         "}"]));
     resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
+    assertErrors(source, [
+        CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
+        StaticTypeWarningCode.NON_BOOL_OPERAND]);
     verify([source]);
   }
 
@@ -2768,7 +3004,9 @@
         "  const A(String p) : a = true && p;",
         "}"]));
     resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
+    assertErrors(source, [
+        CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
+        StaticTypeWarningCode.NON_BOOL_OPERAND]);
     verify([source]);
   }
 
@@ -2836,6 +3074,64 @@
     verify([source]);
   }
 
+  void test_nonConstValueInInitializerFromDeferredLibrary_field() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class A {",
+        "  final int x;",
+        "  const A() : x = a.C;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializerFromDeferredLibrary_field_nested() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class A {",
+        "  final int x;",
+        "  const A() : x = a.C + 1;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializerFromDeferredLibrary_redirecting() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class A {",
+        "  const A.named(p);",
+        "  const A() : this.named(a.C);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializerFromDeferredLibrary_super() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class A {",
+        "  const A(p);",
+        "}",
+        "class B extends A {",
+        "  const B() : super(a.C);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
   void test_nonGenerativeConstructor_explicit() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3178,6 +3474,23 @@
     verify([source]);
   }
 
+  void test_redirectGenerativeToMissingConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() : this.noSuchConstructor();", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR]);
+  }
+
+  void test_redirectGenerativeToNonGenerativeConstructor() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A() : this.x();",
+        "  factory A.x() => null;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR]);
+    verify([source]);
+  }
+
   void test_redirectToMissingConstructor_named() {
     Source source = addSource(EngineTestCase.createSource([
         "class A implements B{",
@@ -3718,7 +4031,9 @@
         "  const A(bool p) : a = ${expr};",
         "}"]));
     resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
+    assertErrors(source, [
+        CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
+        StaticTypeWarningCode.NON_BOOL_OPERAND]);
     verify([source]);
     reset();
   }
@@ -3850,6 +4165,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_conflictingTypeVariableAndMember_setter);
       });
+      _ut.test('test_consistentCaseExpressionTypes_dynamic', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_consistentCaseExpressionTypes_dynamic);
+      });
+      _ut.test('test_constConstructorWithMixin', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constConstructorWithMixin);
+      });
       _ut.test('test_constConstructorWithNonConstSuper_explicit', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_constConstructorWithNonConstSuper_explicit);
@@ -3930,6 +4253,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_constEval_newInstance_constConstructor);
       });
+      _ut.test('test_constEval_newInstance_externalFactoryConstConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEval_newInstance_externalFactoryConstConstructor);
+      });
       _ut.test('test_constEval_propertyExtraction_targetNotConst', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_constEval_propertyExtraction_targetNotConst);
@@ -3970,6 +4297,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_constMapKeyTypeImplementsEquals_direct);
       });
+      _ut.test('test_constMapKeyTypeImplementsEquals_dynamic', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constMapKeyTypeImplementsEquals_dynamic);
+      });
+      _ut.test('test_constMapKeyTypeImplementsEquals_factory', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constMapKeyTypeImplementsEquals_factory);
+      });
       _ut.test('test_constMapKeyTypeImplementsEquals_super', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_constMapKeyTypeImplementsEquals_super);
@@ -4390,6 +4725,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_inconsistentCaseExpressionTypes);
       });
+      _ut.test('test_inconsistentCaseExpressionTypes_dynamic', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_inconsistentCaseExpressionTypes_dynamic);
+      });
       _ut.test('test_inconsistentCaseExpressionTypes_repeated', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_inconsistentCaseExpressionTypes_repeated);
@@ -4486,6 +4825,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidAnnotation_unresolved_prefixedIdentifier);
       });
+      _ut.test('test_invalidAnnotation_useLibraryScope', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_useLibraryScope);
+      });
       _ut.test('test_invalidConstructorName_notEnclosingClassName_defined', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidConstructorName_notEnclosingClassName_defined);
@@ -4742,10 +5085,26 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_nonConstCaseExpression);
       });
+      _ut.test('test_nonConstCaseExpressionFromDeferredLibrary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstCaseExpressionFromDeferredLibrary);
+      });
+      _ut.test('test_nonConstCaseExpressionFromDeferredLibrary_nested', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstCaseExpressionFromDeferredLibrary_nested);
+      });
       _ut.test('test_nonConstListElement', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_nonConstListElement);
       });
+      _ut.test('test_nonConstListElementFromDeferredLibrary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstListElementFromDeferredLibrary);
+      });
+      _ut.test('test_nonConstListElementFromDeferredLibrary_nested', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstListElementFromDeferredLibrary_nested);
+      });
       _ut.test('test_nonConstMapAsExpressionStatement_begin', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_nonConstMapAsExpressionStatement_begin);
@@ -4758,10 +5117,42 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_nonConstMapKey);
       });
+      _ut.test('test_nonConstMapKeyFromDeferredLibrary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstMapKeyFromDeferredLibrary);
+      });
+      _ut.test('test_nonConstMapKeyFromDeferredLibrary_nested', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstMapKeyFromDeferredLibrary_nested);
+      });
       _ut.test('test_nonConstMapValue', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_nonConstMapValue);
       });
+      _ut.test('test_nonConstMapValueFromDeferredLibrary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstMapValueFromDeferredLibrary);
+      });
+      _ut.test('test_nonConstMapValueFromDeferredLibrary_nested', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstMapValueFromDeferredLibrary_nested);
+      });
+      _ut.test('test_nonConstValueInInitializerFromDeferredLibrary_field', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializerFromDeferredLibrary_field);
+      });
+      _ut.test('test_nonConstValueInInitializerFromDeferredLibrary_field_nested', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializerFromDeferredLibrary_field_nested);
+      });
+      _ut.test('test_nonConstValueInInitializerFromDeferredLibrary_redirecting', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializerFromDeferredLibrary_redirecting);
+      });
+      _ut.test('test_nonConstValueInInitializerFromDeferredLibrary_super', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializerFromDeferredLibrary_super);
+      });
       _ut.test('test_nonConstValueInInitializer_binary_notBool_left', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_notBool_left);
@@ -4954,6 +5345,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_tail3);
       });
+      _ut.test('test_redirectGenerativeToMissingConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_redirectGenerativeToMissingConstructor);
+      });
+      _ut.test('test_redirectGenerativeToNonGenerativeConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_redirectGenerativeToNonGenerativeConstructor);
+      });
       _ut.test('test_redirectToMissingConstructor_named', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_redirectToMissingConstructor_named);
@@ -5342,6 +5741,771 @@
   }
 }
 
+class DeferredLoadingTest extends ResolverTestCase {
+  void test_constDeferredClass() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A();", "}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "main() {",
+        "  const a.A();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_constDeferredClass_namedConstructor() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A.b();", "}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "main() {",
+        "  const a.A.b();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_constDeferredClass_new_nonTest() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A.b();", "}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "main() {",
+        "  new a.A.b();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, []);
+    verify([source]);
+  }
+
+  void test_constInitializedWithNonConstValueFromDeferredClass() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "const B = a.V;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_constInitializedWithNonConstValueFromDeferredClass_nested() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "const B = a.V + 1;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_extendsDeferredClass() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class B extends a.A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsDeferredClass_classTypeAlias() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class M {}",
+        "class C = a.A with M;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDeferredClass() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class B implements a.A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDeferredClass_classTypeAlias() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class B {}",
+        "class M {}",
+        "class C = B with M implements a.A;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_importDeferredLibraryWithLoadFunction() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "loadLibrary() {}", "f() {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as lib1;",
+        "main() { lib1.f(); }"]));
+    resolve(source);
+    assertErrors(source, [HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]);
+    verify([source]);
+  }
+
+  void test_importOfNonLibrary() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library lib;",
+        "import 'part.dart' deferred as p;",
+        "var a = new p.A();"]));
+    addNamedSource("/part.dart", EngineTestCase.createSource(["part of lib;", "class A {}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.IMPORT_OF_NON_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotationFromDeferredLibrary() {
+    // See test_invalidAnnotation_notConstantVariable
+    addNamedSource("/lib1.dart", EngineTestCase.createSource([
+        "library lib1;",
+        "class V { const V(); }",
+        "const v = const V();"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "@a.v main () {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotationFromDeferredLibrary_constructor() {
+    // See test_invalidAnnotation_notConstantVariable
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class C { const C(); }"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "@a.C() main () {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotationFromDeferredLibrary_namedConstructor() {
+    // See test_invalidAnnotation_notConstantVariable
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class C { const C.name(); }"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "@a.C.name() main () {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_loadLibraryDefined_nonTest() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "foo() => 22;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'lib.dart' deferred as other;",
+        "main() {",
+        "  other.loadLibrary().then((_) => other.foo());",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mixinDeferredClass() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class B extends Object with a.A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinDeferredClass_classTypeAlias() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class B {}",
+        "class C = B with a.A;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValueFromDeferredLibrary() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f({x : a.V}) {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValueFromDeferredLibrary_nested() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f({x : a.V + 1}) {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstCaseExpressionFromDeferredLibrary() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "main (int p) {",
+        "  switch (p) {",
+        "    case a.c:",
+        "      break;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstCaseExpressionFromDeferredLibrary_nested() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "main (int p) {",
+        "  switch (p) {",
+        "    case a.c + 1:",
+        "      break;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstListElementFromDeferredLibrary() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f() {",
+        "  return const [a.c];",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstListElementFromDeferredLibrary_nested() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f() {",
+        "  return const [a.c + 1];",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstMapKeyFromDeferredLibrary() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f() {",
+        "  return const {a.c : 0};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstMapKeyFromDeferredLibrary_nested() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f() {",
+        "  return const {a.c + 1 : 0};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstMapValueFromDeferredLibrary() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f() {",
+        "  return const {'a' : a.c};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstMapValueFromDeferredLibrary_nested() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f() {",
+        "  return const {'a' : a.c + 1};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializerFromDeferredLibrary_field() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class A {",
+        "  final int x;",
+        "  const A() : x = a.C;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializerFromDeferredLibrary_field_nested() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class A {",
+        "  final int x;",
+        "  const A() : x = a.C + 1;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializerFromDeferredLibrary_redirecting() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class A {",
+        "  const A.named(p);",
+        "  const A() : this.named(a.C);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializerFromDeferredLibrary_super() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class A {",
+        "  const A(p);",
+        "}",
+        "class B extends A {",
+        "  const B() : super(a.C);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_sharedDeferredPrefix() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f1() {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f2() {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as lib;",
+        "import 'lib2.dart' as lib;",
+        "main() { lib.f1(); lib.f2(); }"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.SHARED_DEFERRED_PREFIX]);
+    verify([source]);
+  }
+
+  void test_sharedDeferredPrefix_nonTest() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f1() {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f2() {}"]));
+    addNamedSource("/lib3.dart", EngineTestCase.createSource(["library lib3;", "f3() {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as lib1;",
+        "import 'lib2.dart' as lib;",
+        "import 'lib3.dart' as lib;",
+        "main() { lib1.f1(); lib.f2(); lib.f3(); }"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_asExpression() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f(var v) {",
+        "  v as a.A;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_catchClause() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f(var v) {",
+        "  try {",
+        "  } on a.A {",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_fieldFormalParameter() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class C {",
+        "  var v;",
+        "  C(a.A this.v);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_functionDeclaration_returnType() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "a.A f() { return null; }"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f(a.A g()) {}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_isExpression() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f(var v) {",
+        "  bool b = v is a.A;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_methodDeclaration_returnType() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class C {",
+        "  a.A m() { return null; }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_simpleFormalParameter() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f(a.A v) {}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_typeArgumentList() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class C<E> {}",
+        "C<a.A> c;"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_typeArgumentList2() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class C<E, F> {}",
+        "C<a.A, a.A> c;"]));
+    resolve(source);
+    assertErrors(source, [
+        StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS,
+        StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_typeParameter_bound() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class C<E extends a.A> {}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_variableDeclarationList() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "a.A v;"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  @override
+  void reset() {
+    AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
+    analysisOptions.enableDeferredLoading = true;
+    resetWithOptions(analysisOptions);
+  }
+
+  static dartSuite() {
+    _ut.group('DeferredLoadingTest', () {
+      _ut.test('test_constDeferredClass', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_constDeferredClass);
+      });
+      _ut.test('test_constDeferredClass_namedConstructor', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_constDeferredClass_namedConstructor);
+      });
+      _ut.test('test_constDeferredClass_new_nonTest', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_constDeferredClass_new_nonTest);
+      });
+      _ut.test('test_constInitializedWithNonConstValueFromDeferredClass', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_constInitializedWithNonConstValueFromDeferredClass);
+      });
+      _ut.test('test_constInitializedWithNonConstValueFromDeferredClass_nested', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_constInitializedWithNonConstValueFromDeferredClass_nested);
+      });
+      _ut.test('test_extendsDeferredClass', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_extendsDeferredClass);
+      });
+      _ut.test('test_extendsDeferredClass_classTypeAlias', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_extendsDeferredClass_classTypeAlias);
+      });
+      _ut.test('test_implementsDeferredClass', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_implementsDeferredClass);
+      });
+      _ut.test('test_implementsDeferredClass_classTypeAlias', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_implementsDeferredClass_classTypeAlias);
+      });
+      _ut.test('test_importDeferredLibraryWithLoadFunction', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_importDeferredLibraryWithLoadFunction);
+      });
+      _ut.test('test_importOfNonLibrary', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_importOfNonLibrary);
+      });
+      _ut.test('test_invalidAnnotationFromDeferredLibrary', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_invalidAnnotationFromDeferredLibrary);
+      });
+      _ut.test('test_invalidAnnotationFromDeferredLibrary_constructor', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_invalidAnnotationFromDeferredLibrary_constructor);
+      });
+      _ut.test('test_invalidAnnotationFromDeferredLibrary_namedConstructor', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_invalidAnnotationFromDeferredLibrary_namedConstructor);
+      });
+      _ut.test('test_loadLibraryDefined_nonTest', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_loadLibraryDefined_nonTest);
+      });
+      _ut.test('test_mixinDeferredClass', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_mixinDeferredClass);
+      });
+      _ut.test('test_mixinDeferredClass_classTypeAlias', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_mixinDeferredClass_classTypeAlias);
+      });
+      _ut.test('test_nonConstCaseExpressionFromDeferredLibrary', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_nonConstCaseExpressionFromDeferredLibrary);
+      });
+      _ut.test('test_nonConstCaseExpressionFromDeferredLibrary_nested', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_nonConstCaseExpressionFromDeferredLibrary_nested);
+      });
+      _ut.test('test_nonConstListElementFromDeferredLibrary', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_nonConstListElementFromDeferredLibrary);
+      });
+      _ut.test('test_nonConstListElementFromDeferredLibrary_nested', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_nonConstListElementFromDeferredLibrary_nested);
+      });
+      _ut.test('test_nonConstMapKeyFromDeferredLibrary', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_nonConstMapKeyFromDeferredLibrary);
+      });
+      _ut.test('test_nonConstMapKeyFromDeferredLibrary_nested', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_nonConstMapKeyFromDeferredLibrary_nested);
+      });
+      _ut.test('test_nonConstMapValueFromDeferredLibrary', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_nonConstMapValueFromDeferredLibrary);
+      });
+      _ut.test('test_nonConstMapValueFromDeferredLibrary_nested', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_nonConstMapValueFromDeferredLibrary_nested);
+      });
+      _ut.test('test_nonConstValueInInitializerFromDeferredLibrary_field', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializerFromDeferredLibrary_field);
+      });
+      _ut.test('test_nonConstValueInInitializerFromDeferredLibrary_field_nested', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializerFromDeferredLibrary_field_nested);
+      });
+      _ut.test('test_nonConstValueInInitializerFromDeferredLibrary_redirecting', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializerFromDeferredLibrary_redirecting);
+      });
+      _ut.test('test_nonConstValueInInitializerFromDeferredLibrary_super', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializerFromDeferredLibrary_super);
+      });
+      _ut.test('test_nonConstantDefaultValueFromDeferredLibrary', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_nonConstantDefaultValueFromDeferredLibrary);
+      });
+      _ut.test('test_nonConstantDefaultValueFromDeferredLibrary_nested', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_nonConstantDefaultValueFromDeferredLibrary_nested);
+      });
+      _ut.test('test_sharedDeferredPrefix', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_sharedDeferredPrefix);
+      });
+      _ut.test('test_sharedDeferredPrefix_nonTest', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_sharedDeferredPrefix_nonTest);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_asExpression', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_asExpression);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_catchClause', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_catchClause);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_fieldFormalParameter', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_fieldFormalParameter);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_functionDeclaration_returnType', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_functionDeclaration_returnType);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_isExpression', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_isExpression);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_methodDeclaration_returnType', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_methodDeclaration_returnType);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_simpleFormalParameter', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_simpleFormalParameter);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_typeArgumentList', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_typeArgumentList);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_typeArgumentList2', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_typeArgumentList2);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_typeParameter_bound', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_typeParameter_bound);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_variableDeclarationList', () {
+        final __test = new DeferredLoadingTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_variableDeclarationList);
+      });
+    });
+  }
+}
+
 class ElementResolverTest extends EngineTestCase {
   /**
    * The error listener to which errors will be reported.
@@ -9845,6 +11009,38 @@
     verify([source]);
   }
 
+  void test_assignmentToFinalNoSetter_prefixedIdentifier() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int get x => 0;",
+        "  set x(v) {}",
+        "}",
+        "main() {",
+        "  A a = new A();",
+        "  a.x = 0;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_assignmentToFinalNoSetter_propertyAccess() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int get x => 0;",
+        "  set x(v) {}",
+        "}",
+        "class B {",
+        "  static A a;",
+        "}",
+        "main() {",
+        "  B.a.x = 0;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_assignmentToFinals_importWithPrefix() {
     Source source = addSource(EngineTestCase.createSource([
         "library lib;",
@@ -9920,6 +11116,33 @@
     verify([source]);
   }
 
+  void test_caseExpressionTypeImplementsEquals() {
+    Source source = addSource(EngineTestCase.createSource([
+        "print(p) {}",
+        "",
+        "abstract class B {",
+        "  final id;",
+        "  const B(this.id);",
+        "  String toString() => 'C(\$id)';",
+        "  /** Equality is identity equality, the id isn't used. */",
+        "  bool operator==(Object other);",
+        "  }",
+        "",
+        "class C extends B {",
+        "  const C(id) : super(id);",
+        "}",
+        "",
+        "void doSwitch(c) {",
+        "  switch (c) {",
+        "  case const C(0): print('Switch: 0'); break;",
+        "  case const C(1): print('Switch: 1'); break;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_caseExpressionTypeImplementsEquals_int() {
     Source source = addSource(EngineTestCase.createSource([
         "f(int i) {",
@@ -10033,6 +11256,33 @@
     EngineTestCase.assertInstanceOf((obj) => obj is MethodElement, MethodElement, ref.staticElement);
   }
 
+  void test_commentReference_setter() {
+    String code = EngineTestCase.createSource([
+        "class A {",
+        "  /// [x] in A",
+        "  mA() {}",
+        "  set x(value) {}",
+        "}",
+        "class B extends A {",
+        "  /// [x] in B",
+        "  mB() {}",
+        "}",
+        ""]);
+    Source source = addSource(code);
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = analysisContext.parseCompilationUnit(source);
+    {
+      SimpleIdentifier ref = EngineTestCase.findNode(unit, code, "x] in A", (node) => node is SimpleIdentifier);
+      EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccessorElement, PropertyAccessorElement, ref.staticElement);
+    }
+    {
+      SimpleIdentifier ref = EngineTestCase.findNode(unit, code, "x] in B", (node) => node is SimpleIdentifier);
+      EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccessorElement, PropertyAccessorElement, ref.staticElement);
+    }
+  }
+
   void test_concreteClassWithAbstractMember() {
     Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  m();", "}"]));
     resolve(source);
@@ -10133,7 +11383,7 @@
         "  const B();",
         "}"]));
     resolve(source);
-    assertNoErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN]);
     verify([source]);
   }
 
@@ -10263,6 +11513,28 @@
     verify([source]);
   }
 
+  void test_constMapKeyExpressionTypeImplementsEquals_abstract() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class B {",
+        "  final id;",
+        "  const B(this.id);",
+        "  String toString() => 'C(\$id)';",
+        "  /** Equality is identity equality, the id isn't used. */",
+        "  bool operator==(Object other);",
+        "  }",
+        "",
+        "class C extends B {",
+        "  const C(id) : super(id);",
+        "}",
+        "",
+        "Map getMap() {",
+        "  return const { const C(0): 'Map: 0' };",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_constNotInitialized_field() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  static const int x = 0;", "}"]));
     resolve(source);
@@ -11990,6 +13262,46 @@
     verify([source]);
   }
 
+  void test_nonBoolOperand_and_bool() {
+    Source source = addSource(EngineTestCase.createSource([
+        "bool f(bool left, bool right) {",
+        "  return left && right;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonBoolOperand_and_dynamic() {
+    Source source = addSource(EngineTestCase.createSource([
+        "bool f(left, dynamic right) {",
+        "  return left && right;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonBoolOperand_or_bool() {
+    Source source = addSource(EngineTestCase.createSource([
+        "bool f(bool left, bool right) {",
+        "  return left || right;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonBoolOperand_or_dynamic() {
+    Source source = addSource(EngineTestCase.createSource([
+        "bool f(dynamic left, right) {",
+        "  return left || right;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_nonConstantDefaultValue_function_named() {
     Source source = addSource(EngineTestCase.createSource(["f({x : 2 + 3}) {}"]));
     resolve(source);
@@ -13556,6 +14868,14 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_typedef_parameter);
       });
+      _ut.test('test_assignmentToFinalNoSetter_prefixedIdentifier', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_assignmentToFinalNoSetter_prefixedIdentifier);
+      });
+      _ut.test('test_assignmentToFinalNoSetter_propertyAccess', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_assignmentToFinalNoSetter_propertyAccess);
+      });
       _ut.test('test_assignmentToFinal_prefixNegate', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_assignmentToFinal_prefixNegate);
@@ -13580,6 +14900,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_caseBlockNotTerminated_lastCase);
       });
+      _ut.test('test_caseExpressionTypeImplementsEquals', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_caseExpressionTypeImplementsEquals);
+      });
       _ut.test('test_caseExpressionTypeImplementsEquals_Object', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_caseExpressionTypeImplementsEquals_Object);
@@ -13612,6 +14936,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_commentReference_class);
       });
+      _ut.test('test_commentReference_setter', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_commentReference_setter);
+      });
       _ut.test('test_concreteClassWithAbstractMember', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_concreteClassWithAbstractMember);
@@ -13684,6 +15012,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_constEval_symbol);
       });
+      _ut.test('test_constMapKeyExpressionTypeImplementsEquals_abstract', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_constMapKeyExpressionTypeImplementsEquals_abstract);
+      });
       _ut.test('test_constNotInitialized_field', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_constNotInitialized_field);
@@ -14312,6 +15644,22 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_nonBoolNegationExpression);
       });
+      _ut.test('test_nonBoolOperand_and_bool', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonBoolOperand_and_bool);
+      });
+      _ut.test('test_nonBoolOperand_and_dynamic', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonBoolOperand_and_dynamic);
+      });
+      _ut.test('test_nonBoolOperand_or_bool', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonBoolOperand_or_bool);
+      });
+      _ut.test('test_nonBoolOperand_or_dynamic', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonBoolOperand_or_dynamic);
+      });
       _ut.test('test_nonConstCaseExpression', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_nonConstCaseExpression);
@@ -15853,7 +17201,7 @@
 
   List<bool> found;
 
-  List<AnalysisException> thrownException;
+  List<CaughtException> thrownException;
 
   RecursiveAstVisitor_SimpleResolverTest_test_localVariable_types_invoked(this.SimpleResolverTest_this, this.found, this.thrownException) : super();
 
@@ -15868,8 +17216,8 @@
         // check propagated type
         FunctionType propagatedType = node.propagatedType as FunctionType;
         JUnitTestCase.assertEquals(SimpleResolverTest_this.typeProvider.stringType, propagatedType.returnType);
-      } on AnalysisException catch (e) {
-        thrownException[0] = e;
+      } on AnalysisException catch (e, stackTrace) {
+        thrownException[0] = new CaughtException(e, stackTrace);
       }
     }
     return null;
@@ -16251,6 +17599,19 @@
     return library;
   }
 
+  Expression findTopLevelConstantExpression(CompilationUnit compilationUnit, String name) {
+    for (CompilationUnitMember member in compilationUnit.declarations) {
+      if (member is TopLevelVariableDeclaration) {
+        for (VariableDeclaration variable in member.variables.variables) {
+          if (variable.name.name == name) {
+            return variable.initializer;
+          }
+        }
+      }
+    }
+    return null;
+  }
+
   AnalysisContext get analysisContext => _analysisContext;
 
   /**
@@ -16300,6 +17661,12 @@
    */
   CompilationUnit resolveCompilationUnit(Source source, LibraryElement library) => _analysisContext.resolveCompilationUnit(source, library);
 
+  CompilationUnit resolveSource(String sourceText) {
+    Source source = addSource(sourceText);
+    LibraryElement library = analysisContext.computeLibraryElement(source);
+    return analysisContext.resolveCompilationUnit(source, library);
+  }
+
   @override
   void tearDown() {
     _analysisContext = null;
@@ -17155,10 +18522,10 @@
     CompilationUnit unit = analysisContext.getResolvedCompilationUnit(source, library);
     JUnitTestCase.assertNotNull(unit);
     List<bool> found = [false];
-    List<AnalysisException> thrownException = new List<AnalysisException>(1);
+    List<CaughtException> thrownException = new List<CaughtException>(1);
     unit.accept(new RecursiveAstVisitor_SimpleResolverTest_test_localVariable_types_invoked(this, found, thrownException));
     if (thrownException[0] != null) {
-      throw new AnalysisException.con3(thrownException[0]);
+      throw new AnalysisException("Exception", new CaughtException(thrownException[0], null));
     }
     JUnitTestCase.assertTrue(found[0]);
   }
@@ -19515,6 +20882,46 @@
     verify([source]);
   }
 
+  void test_nonBoolOperand_and_left() {
+    Source source = addSource(EngineTestCase.createSource([
+        "bool f(int left, bool right) {",
+        "  return left && right;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
+    verify([source]);
+  }
+
+  void test_nonBoolOperand_and_right() {
+    Source source = addSource(EngineTestCase.createSource([
+        "bool f(bool left, String right) {",
+        "  return left && right;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
+    verify([source]);
+  }
+
+  void test_nonBoolOperand_or_left() {
+    Source source = addSource(EngineTestCase.createSource([
+        "bool f(List<int> left, bool right) {",
+        "  return left || right;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
+    verify([source]);
+  }
+
+  void test_nonBoolOperand_or_right() {
+    Source source = addSource(EngineTestCase.createSource([
+        "bool f(bool left, double right) {",
+        "  return left || right;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
+    verify([source]);
+  }
+
   void test_nonTypeAsTypeArgument_notAType() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B<E> {}", "f(B<A> b) {}"]));
     resolve(source);
@@ -20514,6 +21921,22 @@
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_nonBoolNegationExpression);
       });
+      _ut.test('test_nonBoolOperand_and_left', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonBoolOperand_and_left);
+      });
+      _ut.test('test_nonBoolOperand_and_right', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonBoolOperand_and_right);
+      });
+      _ut.test('test_nonBoolOperand_or_left', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonBoolOperand_or_left);
+      });
+      _ut.test('test_nonBoolOperand_or_right', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonBoolOperand_or_right);
+      });
       _ut.test('test_nonTypeAsTypeArgument_notAType', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_nonTypeAsTypeArgument_notAType);
@@ -21424,6 +22847,20 @@
     verify([source]);
   }
 
+  void test_assignmentToFinal_postfixMinusMinus() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x--;", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+
+  void test_assignmentToFinal_postfixPlusPlus() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x++;", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+
   void test_assignmentToFinal_prefixMinusMinus() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  --x;", "}"]));
     resolve(source);
@@ -21438,22 +22875,6 @@
     verify([source]);
   }
 
-  void test_assignmentToFinal_propertyAccess() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get x => 0;",
-        "}",
-        "class B {",
-        "  static A a;",
-        "}",
-        "main() {",
-        "  B.a.x = 0;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
-    verify([source]);
-  }
-
   void test_assignmentToFinal_suffixMinusMinus() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x--;", "}"]));
     resolve(source);
@@ -21475,6 +22896,43 @@
     verify([source]);
   }
 
+  void test_assignmentToFinalNoSetter_prefixedIdentifier() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int get x => 0;",
+        "}",
+        "main() {",
+        "  A a = new A();",
+        "  a.x = 0;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER]);
+    verify([source]);
+  }
+
+  void test_assignmentToFinalNoSetter_propertyAccess() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int get x => 0;",
+        "}",
+        "class B {",
+        "  static A a;",
+        "}",
+        "main() {",
+        "  B.a.x = 0;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER]);
+    verify([source]);
+  }
+
+  void test_assignmentToFunction() {
+    Source source = addSource(EngineTestCase.createSource(["f() {}", "main() {", "  f = null;", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FUNCTION]);
+    verify([source]);
+  }
+
   void test_assignmentToMethod() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -21748,6 +23206,29 @@
     verify([source]);
   }
 
+  void test_equalKeysInMap_withEqualTypeParams() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A<T> {",
+        "  const A();",
+        "}",
+        "var m = {const A<int>(): 0, const A<int>(): 1};"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.EQUAL_KEYS_IN_MAP]);
+    verify([source]);
+  }
+
+  void test_equalKeysInMap_withUnequalTypeParams() {
+    // No error should be produced because A<int> and A<num> are different types.
+    Source source = addSource(EngineTestCase.createSource([
+        "class A<T> {",
+        "  const A();",
+        "}",
+        "var m = {const A<int>(): 0, const A<num>(): 1};"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_exportDuplicatedLibraryName() {
     Source source = addSource(EngineTestCase.createSource([
         "library test;",
@@ -23017,6 +24498,18 @@
     verify([source]);
   }
 
+  void test_notEnoughRequiredArguments_getterReturningFunction() {
+    Source source = addSource(EngineTestCase.createSource([
+        "typedef Getter(self);",
+        "Getter getter = (x) => x;",
+        "main() {",
+        "  getter();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
+    verify([source]);
+  }
+
   void test_partOfDifferentLibrary() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "part 'part.dart';"]));
     addNamedSource("/part.dart", EngineTestCase.createSource(["part of lub;"]));
@@ -23184,6 +24677,34 @@
     verify([source]);
   }
 
+  void test_typeAnnotationDeferredClass_asExpression() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f(var v) {",
+        "  v as a.A;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_catchClause() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f(var v) {",
+        "  try {",
+        "  } on a.A {",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
   void test_typeAnnotationDeferredClass_fieldFormalParameter() {
     addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
     Source source = addSource(EngineTestCase.createSource([
@@ -23220,6 +24741,19 @@
     verify([source]);
   }
 
+  void test_typeAnnotationDeferredClass_isExpression() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f(var v) {",
+        "  bool b = v is a.A;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
   void test_typeAnnotationDeferredClass_methodDeclaration_returnType() {
     addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
     Source source = addSource(EngineTestCase.createSource([
@@ -23685,6 +25219,14 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_assignmentToConst_localVariable_plusEq);
       });
+      _ut.test('test_assignmentToFinalNoSetter_prefixedIdentifier', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToFinalNoSetter_prefixedIdentifier);
+      });
+      _ut.test('test_assignmentToFinalNoSetter_propertyAccess', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToFinalNoSetter_propertyAccess);
+      });
       _ut.test('test_assignmentToFinal_instanceVariable', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_assignmentToFinal_instanceVariable);
@@ -23701,6 +25243,14 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_assignmentToFinal_localVariable_plusEq);
       });
+      _ut.test('test_assignmentToFinal_postfixMinusMinus', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToFinal_postfixMinusMinus);
+      });
+      _ut.test('test_assignmentToFinal_postfixPlusPlus', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToFinal_postfixPlusPlus);
+      });
       _ut.test('test_assignmentToFinal_prefixMinusMinus', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_assignmentToFinal_prefixMinusMinus);
@@ -23709,10 +25259,6 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_assignmentToFinal_prefixPlusPlus);
       });
-      _ut.test('test_assignmentToFinal_propertyAccess', () {
-        final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_assignmentToFinal_propertyAccess);
-      });
       _ut.test('test_assignmentToFinal_suffixMinusMinus', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_assignmentToFinal_suffixMinusMinus);
@@ -23725,6 +25271,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_assignmentToFinal_topLevelVariable);
       });
+      _ut.test('test_assignmentToFunction', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToFunction);
+      });
       _ut.test('test_assignmentToMethod', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_assignmentToMethod);
@@ -23821,6 +25371,14 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_equalKeysInMap);
       });
+      _ut.test('test_equalKeysInMap_withEqualTypeParams', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_equalKeysInMap_withEqualTypeParams);
+      });
+      _ut.test('test_equalKeysInMap_withUnequalTypeParams', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_equalKeysInMap_withUnequalTypeParams);
+      });
       _ut.test('test_exportDuplicatedLibraryName', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_exportDuplicatedLibraryName);
@@ -24237,6 +25795,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_notEnoughRequiredArguments_functionExpression);
       });
+      _ut.test('test_notEnoughRequiredArguments_getterReturningFunction', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_notEnoughRequiredArguments_getterReturningFunction);
+      });
       _ut.test('test_partOfDifferentLibrary', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_partOfDifferentLibrary);
@@ -24305,6 +25867,14 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_switchExpressionNotAssignable);
       });
+      _ut.test('test_typeAnnotationDeferredClass_asExpression', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_asExpression);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_catchClause', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_catchClause);
+      });
       _ut.test('test_typeAnnotationDeferredClass_fieldFormalParameter', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_fieldFormalParameter);
@@ -24317,6 +25887,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType);
       });
+      _ut.test('test_typeAnnotationDeferredClass_isExpression', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_isExpression);
+      });
       _ut.test('test_typeAnnotationDeferredClass_methodDeclaration_returnType', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_methodDeclaration_returnType);
@@ -25042,7 +26616,11 @@
   @override
   InterfaceType get symbolType {
     if (_symbolType == null) {
-      _symbolType = ElementFactory.classElement2("Symbol", []).type;
+      ClassElementImpl symbolClass = ElementFactory.classElement2("Symbol", []);
+      ConstructorElementImpl constructor = ElementFactory.constructorElement(symbolClass, null, true, [stringType]);
+      constructor.factory = true;
+      symbolClass.constructors = <ConstructorElement> [constructor];
+      _symbolType = symbolClass.type;
     }
     return _symbolType;
   }
@@ -26772,11 +28350,12 @@
 //  ScopeBuilderTest.dartSuite();
 //  ScopeTest.dartSuite();
 //  CompileTimeErrorCodeTest.dartSuite();
+//  DeferredLoadingTest.dartSuite();
 //  ErrorResolverTest.dartSuite();
 //  HintCodeTest.dartSuite();
 //  MemberMapTest.dartSuite();
-//  NonHintCodeTest.dartSuite();
 //  NonErrorResolverTest.dartSuite();
+//  NonHintCodeTest.dartSuite();
 //  SimpleResolverTest.dartSuite();
 //  StaticTypeWarningCodeTest.dartSuite();
 //  StaticWarningCodeTest.dartSuite();
diff --git a/pkg/args/README.md b/pkg/args/README.md
new file mode 100644
index 0000000..fe31554
--- /dev/null
+++ b/pkg/args/README.md
@@ -0,0 +1,249 @@
+Parses raw command-line arguments into a set of options and values.
+
+This library supports [GNU][] and [POSIX][] style options, and it works
+in both server-side and client-side apps.
+
+## Defining options
+
+First create an [ArgParser][]:
+
+    var parser = new ArgParser();
+
+Then define a set of options on that parser using [addOption()][addOption] and
+[addFlag()][addFlag]. Here's the minimal way to create an option named "name":
+
+    parser.addOption('name');
+
+When an option can only be set or unset (as opposed to taking a string value),
+use a flag:
+
+    parser.addFlag('name');
+
+Flag options, by default, accept a 'no-' prefix to negate the option. You can
+disable the 'no-' prefix using the `negatable` parameter:
+
+    parser.addFlag('name', negatable: false);
+
+*Note:* From here on out, "option" refers to both regular options and flags. In
+cases where the distinction matters, we'll use "non-flag option."
+
+Options can have an optional single-character abbreviation, specified with the
+`abbr` parameter:
+
+    parser.addOption('mode', abbr: 'm');
+    parser.addFlag('verbose', abbr: 'v');
+
+Options can also have a default value, specified with the `defaultsTo`
+parameter. The default value is used when arguments don't specify the option.
+
+    parser.addOption('mode', defaultsTo: 'debug');
+    parser.addFlag('verbose', defaultsTo: false);
+
+The default value for non-flag options can be any string. For flags, it must
+be a `bool`.
+
+To validate a non-flag option, you can use the `allowed` parameter to provide an
+allowed set of values. When you do, the parser throws a [FormatException] if the
+value for an option is not in the allowed set. Here's an example of specifying
+allowed values:
+
+    parser.addOption('mode', allowed: ['debug', 'release']);
+
+You can use the `callback` parameter to associate a function with an option.
+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.addFlag('verbose', callback: (verbose) {
+      if (verbose) print('Verbose');
+    });
+
+The callbacks for all options are called whenever a set of arguments is parsed.
+If an option isn't provided in the args, its callback is passed the default
+value, or `null` if no default value is set.
+
+## Parsing arguments
+
+Once you have an [ArgParser][] set up with some options and flags, you use it by
+calling [ArgParser.parse()][parse] with a set of arguments:
+
+    var results = parser.parse(['some', 'command', 'line', 'args']);
+
+These arguments usually come from the arguments to `main()`, but you can pass in
+any list of strings. The `parse()` method returns an instance of [ArgResults][],
+a map-like object that contains the values of the parsed options.
+
+    var parser = new ArgParser();
+    parser.addOption('mode');
+    parser.addFlag('verbose', defaultsTo: true);
+    var results = parser.parse(['--mode', 'debug', 'something', 'else']);
+
+    print(results['mode']); // debug
+    print(results['verbose']); // true
+
+By default, the `parse()` method stops as soon as it reaches `--` by itself or
+anything that the parser doesn't recognize as an option, flag, or option value.
+If arguments still remain, they go into [ArgResults.rest][rest].
+
+    print(results.rest); // ['something', 'else']
+
+To continue to parse options found after non-option arguments, pass
+`allowTrailingOptions: true` when creating the [ArgParser][].
+
+## Specifying options
+
+To actually pass in options and flags on the command line, use GNU or POSIX
+style. Consider this option:
+
+    parser.addOption('name', abbr: 'n');
+
+You can specify its value on the command line using any of the following:
+
+    --name=somevalue
+    --name somevalue
+    -nsomevalue
+    -n somevalue
+
+Consider this flag:
+
+    parser.addFlag('name', abbr: 'n');
+
+You can set it to true using one of the following:
+
+    --name
+    -n
+
+You can set it to false using the following:
+
+    --no-name
+
+Multiple flag abbreviations can be collapsed into a single argument. Say you
+define these flags:
+
+    parser.addFlag('verbose', abbr: 'v');
+    parser.addFlag('french', abbr: 'f');
+    parser.addFlag('iambic-pentameter', abbr: 'i');
+
+You can set all three flags at once:
+
+    -vfi
+
+By default, an option has only a single value, with later option values
+overriding earlier ones; for example:
+
+    var parser = new ArgParser();
+    parser.addOption('mode');
+    var results = parser.parse(['--mode', 'on', '--mode', 'off']);
+    print(results['mode']); // prints 'off'
+
+If you need multiple values, set the `allowMultiple` parameter. In that case the
+option can occur multiple times, and the `parse()` method returns a list of
+values:
+
+    var parser = new ArgParser();
+    parser.addOption('mode', allowMultiple: true);
+    var results = parser.parse(['--mode', 'on', '--mode', 'off']);
+    print(results['mode']); // prints '[on, off]'
+
+## Defining commands ##
+
+In addition to *options*, you can also define *commands*. A command is a named
+argument that has its own set of options. For example, consider this shell
+command:
+
+    $ git commit -a
+
+The executable is `git`, the command is `commit`, and the `-a` option is an
+option passed to the command. You can add a command using the [addCommand][]
+method:
+
+    var parser = new ArgParser();
+    var command = parser.addCommand('commit');
+
+It returns another [ArgParser][], which you can then use to define options
+specific to that command. If you already have an [ArgParser][] for the command's
+options, you can pass it in:
+
+    var parser = new ArgParser();
+    var command = new ArgParser();
+    parser.addCommand('commit', command);
+
+The [ArgParser][] for a command can then define options or flags:
+
+    command.addFlag('all', abbr: 'a');
+
+You can add multiple commands to the same parser so that a user can select one
+from a range of possible commands. When parsing an argument list, you can then
+determine which command was entered and what options were provided for it.
+
+    var results = parser.parse(['commit', '-a']);
+    print(results.command.name);   // "commit"
+    print(results.command['all']); // true
+
+Options for a command must appear after the command in the argument list. For
+example, given the above parser, `"git -a commit"` is *not* valid. The parser
+tries to find the right-most command that accepts an option. For example:
+
+    var parser = new ArgParser();
+    parser.addFlag('all', abbr: 'a');
+    var command = parser.addCommand('commit');
+    command.addFlag('all', abbr: 'a');
+
+    var results = parser.parse(['commit', '-a']);
+    print(results.command['all']); // true
+
+Here, both the top-level parser and the `"commit"` command can accept a `"-a"`
+(which is probably a bad command line interface, admittedly). In that case, when
+`"-a"` appears after `"commit"`, it is applied to that command. If it appears to
+the left of `"commit"`, it is given to the top-level parser.
+
+## Displaying usage
+
+You can automatically generate nice help text, suitable for use as the output of
+`--help`. To display good usage information, you should provide some help text
+when you create your options.
+
+To define help text for an entire option, use the `help:` parameter:
+
+    parser.addOption('mode', help: 'The compiler configuration',
+        allowed: ['debug', 'release']);
+    parser.addFlag('verbose', help: 'Show additional diagnostic info');
+
+For non-flag options, you can also provide detailed help for each expected value
+by using the `allowedHelp:` parameter:
+
+    parser.addOption('arch', help: 'The architecture to compile for',
+        allowedHelp: {
+          'ia32': 'Intel x86',
+          'arm': 'ARM Holding 32-bit chip'
+        });
+
+To display the help, use the [getUsage()][getUsage] method:
+
+    print(parser.getUsage());
+
+The resulting string looks something like this:
+
+    --mode            The compiler configuration
+                      [debug, release]
+
+    --[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
+[ArgResults]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/args/args.ArgResults
+[addOption]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/args/args.ArgParser#id_addOption
+[addFlag]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/args/args.ArgParser#id_addFlag
+[parse]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/args/args.ArgParser#id_parse
+[rest]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/args/args.ArgResults#id_rest
+[addCommand]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/args/args.ArgParser#id_addCommand
+[getUsage]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/args/args.ArgParser#id_getUsage
diff --git a/pkg/args/example/test_runner.dart b/pkg/args/example/test_runner.dart
index 74750ae..fac1690 100644
--- a/pkg/args/example/test_runner.dart
+++ b/pkg/args/example/test_runner.dart
@@ -2,11 +2,9 @@
 // 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 is an example of converting the args in test.dart to use this API.
- * It shows what it looks like to build an [ArgParser] and then, when the code
- * is run, demonstrates what the generated usage text looks like.
- */
+/// This is an example of converting the args in test.dart to use this API.
+/// It shows what it looks like to build an [ArgParser] and then, when the code
+/// is run, demonstrates what the generated usage text looks like.
 library example;
 
 import 'dart:io';
@@ -117,7 +115,6 @@
       defaultsTo: false);
 
   parser.addOption('dart',    help: 'Path to dart executable');
-  // TODO(antonm): rename the option.
   parser.addOption('drt',     help: 'Path to content shell executable');
   parser.addOption('dartium', help: 'Path to Dartium Chrome executable');
 
diff --git a/pkg/args/lib/args.dart b/pkg/args/lib/args.dart
index bdd61a5..4eb23c0 100644
--- a/pkg/args/lib/args.dart
+++ b/pkg/args/lib/args.dart
@@ -2,263 +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.
 
-/**
- * Parser support for transforming raw command-line arguments into a set
- * of options and values.
- *
- * This library supports [GNU][] and [POSIX][] style options, and it works
- * in both server-side and client-side apps.
- *
- * For information on installing this library, see the
- * [args package on pub.dartlang.org](http://pub.dartlang.org/packages/args).
- * Here's an example of importing this library:
- *
- *     import 'package:args/args.dart';
- *
- * ## Defining options
- *
- * To use this library, first create an [ArgParser]:
- *
- *     var parser = new ArgParser();
- *
- * Then define a set of options on that parser using [addOption()] and
- * [addFlag()]. Here's the minimal way to create an option named "name":
- *
- *     parser.addOption('name');
- *
- * When an option can only be set or unset (as opposed to taking a string
- * value), use a flag:
- *
- *     parser.addFlag('name');
- *
- * Flag options, by default, accept a 'no-' prefix to negate the option.
- * You can disable the 'no-' prefix using the `negatable` parameter:
- *
- *     parser.addFlag('name', negatable: false);
- *
- * **Terminology note:**
- * From here on out, the term _option_ refers to both regular options and
- * flags. In cases where the distinction matters, this documentation uses
- * the term _non-flag option._
- *
- * Options can have an optional single-character abbreviation, specified
- * with the `abbr` parameter:
- *
- *     parser.addOption('mode', abbr: 'm');
- *     parser.addFlag('verbose', abbr: 'v');
- *
- * Options can also have a default value, specified with the `defaultsTo`
- * parameter. The default value is used when arguments don't specify the
- * option.
- *
- *     parser.addOption('mode', defaultsTo: 'debug');
- *     parser.addFlag('verbose', defaultsTo: false);
- *
- * The default value for non-flag options can be any [String]. For flags,
- * it must be a [bool].
- *
- * To validate a non-flag option, you can use the `allowed` parameter to
- * provide an allowed set of values. When you do, the parser throws a
- * [FormatException] if the value for an option is not in the allowed set.
- * Here's an example of specifying allowed values:
- *
- *     parser.addOption('mode', allowed: ['debug', 'release']);
- *
- * You can use the `callback` parameter to associate a function with an
- * option. 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.addFlag('verbose', callback: (verbose) {
- *       if (verbose) print('Verbose');
- *     });
- *
- * The callbacks for all options are called whenever a set of arguments
- * is parsed. If an option isn't provided in the args, its callback is
- * passed the default value, or `null` if no default value is set.
- *
- * ## Parsing arguments
- *
- * Once you have an [ArgParser] set up with some options and flags, you
- * use it by calling [ArgParser.parse()] with a set of arguments:
- *
- *     var results = parser.parse(['some', 'command', 'line', 'args']);
- *
- * These arguments usually come from the arguments to main
- * (`main(List<String> arguments`), but you can pass in any list of strings.
- * The parse() method returns an instance of [ArgResults], a map-like
- * object that contains the values of the parsed options.
- *
- *     var parser = new ArgParser();
- *     parser.addOption('mode');
- *     parser.addFlag('verbose', defaultsTo: true);
- *     var results = parser.parse(['--mode', 'debug', 'something', 'else']);
- *
- *     print(results['mode']); // debug
- *     print(results['verbose']); // true
- *
- * By default, the parse() method stops as soon as it reaches `--` by itself
- * or anything that the parser doesn't recognize as an option, flag, or
- * option value. If arguments still remain, they go into [ArgResults.rest].
- *
- *     print(results.rest); // ['something', 'else']
- *
- * To continue to parse options found after non-option arguments, call
- * parse() with `allowTrailingOptions: true`.
- *
- * ## Specifying options
- *
- * To actually pass in options and flags on the command line, use GNU or
- * POSIX style. Consider this option:
- *
- *     parser.addOption('name', abbr: 'n');
- *
- * You can specify its value on the command line using any of the following:
- *
- *     --name=somevalue
- *     --name somevalue
- *     -nsomevalue
- *     -n somevalue
- *
- * Consider this flag:
- *
- *     parser.addFlag('name', abbr: 'n');
- *
- * You can set it to true using one of the following:
- *
- *     --name
- *     -n
- *
- * You can set it to false using the following:
- *
- *     --no-name
- *
- * Multiple flag abbreviations can be collapsed into a single argument. Say
- * you define these flags:
- *
- *     parser.addFlag('verbose', abbr: 'v');
- *     parser.addFlag('french', abbr: 'f');
- *     parser.addFlag('iambic-pentameter', abbr: 'i');
- *
- * You can set all three flags at once:
- *
- *     -vfi
- *
- * By default, an option has only a single value, with later option values
- * overriding earlier ones; for example:
- *
- *     var parser = new ArgParser();
- *     parser.addOption('mode');
- *     var results = parser.parse(['--mode', 'on', '--mode', 'off']);
- *     print(results['mode']); // prints 'off'
- *
- * If you need multiple values, set the `allowMultiple` parameter. In that
- * case the option can occur multiple times, and the parse() method returns
- * a list of values:
- *
- *     var parser = new ArgParser();
- *     parser.addOption('mode', allowMultiple: true);
- *     var results = parser.parse(['--mode', 'on', '--mode', 'off']);
- *     print(results['mode']); // prints '[on, off]'
- *
- * ## Defining commands ##
- *
- * In addition to *options*, you can also define *commands*. A command is
- * a named argument that has its own set of options. For example, consider
- * this shell command:
- *
- *     $ git commit -a
- *
- * The executable is `git`, the command is `commit`, and the `-a` option is
- * an option passed to the command. You can add a command using the
- * [addCommand] method:
- *
- *     var parser = new ArgParser();
- *     var command = parser.addCommand('commit');
- *
- * The addCommand() method returns another [ArgParser], which you can then
- * use to define options specific to that command. If you already have an
- * [ArgParser] for the command's options, you can pass it to addCommand:
- *
- *     var parser = new ArgParser();
- *     var command = new ArgParser();
- *     parser.addCommand('commit', command);
- *
- * The [ArgParser] for a command can then define options or flags:
- *
- *     command.addFlag('all', abbr: 'a');
- *
- * You can add multiple commands to the same parser so that a user can select
- * one from a range of possible commands. When parsing an argument list,
- * you can then determine which command was entered and what options were
- * provided for it.
- *
- *     var results = parser.parse(['commit', '-a']);
- *     print(results.command.name);   // "commit"
- *     print(results.command['all']); // true
- *
- * Options for a command must appear after the command in the argument list.
- * For example, given the above parser, "git -a commit" is *not* valid. The
- * parser tries to find the right-most command that accepts an option. For
- * example:
- *
- *     var parser = new ArgParser();
- *     parser.addFlag('all', abbr: 'a');
- *     var command = parser.addCommand('commit');
- *     command.addFlag('all', abbr: 'a');
- *
- *     var results = parser.parse(['commit', '-a']);
- *     print(results.command['all']); // true
- *
- * Here, both the top-level parser and the "commit" command can accept a
- * "-a" (which is probably a bad command line interface, admittedly). In
- * that case, when "-a" appears after "commit", it is applied to that
- * command. If it appears to the left of "commit", it is given to the
- * top-level parser.
- *
- * ## Displaying usage
- *
- * You can automatically generate nice help text, suitable for use as the
- * output of `--help`. To display good usage information, you should
- * provide some help text when you create your options.
- *
- * To define help text for an entire option, use the `help` parameter:
- *
- *     parser.addOption('mode', help: 'The compiler configuration',
- *         allowed: ['debug', 'release']);
- *     parser.addFlag('verbose', help: 'Show additional diagnostic info');
- *
- * For non-flag options, you can also provide detailed help for each expected
- * value by using the `allowedHelp` parameter:
- *
- *     parser.addOption('arch', help: 'The architecture to compile for',
- *         allowedHelp: {
- *           'ia32': 'Intel x86',
- *           'arm': 'ARM Holding 32-bit chip'
- *         });
- *
- * To display the help, use the ArgParser getUsage() method:
- *
- *     print(parser.getUsage());
- *
- * The resulting string looks something like this:
- *
- *     --mode            The compiler configuration
- *                       [debug, release]
- *
- *     --[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
- */
 library args;
 
 import 'package:collection/wrappers.dart';
@@ -268,38 +11,28 @@
 import 'src/options.dart';
 export 'src/options.dart';
 
-/**
- * A class for taking a list of raw command line arguments and parsing out
- * options and flags from them.
- */
+/// A class for taking a list of raw command line arguments and parsing out
+/// options and flags from them.
 class ArgParser {
   final Map<String, Option> _options;
   final Map<String, ArgParser> _commands;
 
-  /**
-   * The options that have been defined for this parser.
-   */
+  /// The options that have been defined for this parser.
   final Map<String, Option> options;
 
-  /**
-   * The commands that have been defined for this parser.
-   */
+  /// The commands that have been defined for this parser.
   final Map<String, ArgParser> commands;
 
-  /**
-   * Whether or not this parser parses options that appear after non-option
-   * arguments.
-   */
+  /// Whether or not this parser parses options that appear after non-option
+  /// arguments.
   final bool allowTrailingOptions;
 
-  /**
-   * Creates a new ArgParser.
-   *
-   * If [allowTrailingOptions] is set, the parser will continue parsing even
-   * after it finds an argument that is neither an option nor a command.
-   * This allows options to be specified after regular arguments. Defaults to
-   * `false`.
-   */
+  /// Creates a new ArgParser.
+  ///
+  /// If [allowTrailingOptions] is set, the parser will continue parsing even
+  /// after it finds an argument that is neither an option nor a command.
+  /// This allows options to be specified after regular arguments. Defaults to
+  /// `false`.
   factory ArgParser({bool allowTrailingOptions}) =>
       new ArgParser._(<String, Option>{}, <String, ArgParser>{},
           allowTrailingOptions: allowTrailingOptions);
@@ -313,13 +46,11 @@
     this.allowTrailingOptions = allowTrailingOptions != null ?
         allowTrailingOptions : false;
 
-  /**
-   * Defines a command.
-   *
-   * A command is a named argument which may in turn define its own options and
-   * subcommands using the given parser. If [parser] is omitted, implicitly
-   * creates a new one. Returns the parser for the command.
-   */
+  /// Defines a command.
+  ///
+  /// A command is a named argument which may in turn define its own options and
+  /// subcommands using the given parser. If [parser] is omitted, implicitly
+  /// creates a new one. Returns the parser for the command.
   ArgParser addCommand(String name, [ArgParser parser]) {
     // Make sure the name isn't in use.
     if (_commands.containsKey(name)) {
@@ -331,24 +62,20 @@
     return parser;
   }
 
-  /**
-   * Defines a flag. Throws an [ArgumentError] if:
-   *
-   * * There is already an option named [name].
-   * * There is already an option using abbreviation [abbr].
-   */
+  /// Defines a flag. Throws an [ArgumentError] if:
+  ///
+  /// * There is already an option named [name].
+  /// * 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,
         isFlag: true, negatable: negatable, hide: hide);
   }
 
-  /**
-   * Defines a value-taking option. Throws an [ArgumentError] if:
-   *
-   * * There is already an option with name [name].
-   * * There is already an option using abbreviation [abbr].
-   */
+  /// Defines a value-taking option. Throws an [ArgumentError] if:
+  ///
+  /// * 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 callback(value), bool allowMultiple: false, bool hide: false}) {
@@ -380,23 +107,18 @@
         allowMultiple: allowMultiple, hide: hide);
   }
 
-  /**
-   * Parses [args], a list of command-line arguments, matches them against the
-   * flags and options defined by this parser, and returns the result.
-   */
+  /// Parses [args], a list of command-line arguments, matches them against the
+  /// flags and options defined by this parser, and returns the result.
   ArgResults parse(List<String> args) =>
       new Parser(null, this, args.toList(), null, null).parse();
 
-  /**
-   * Generates a string displaying usage information for the defined options.
-   * This is basically the help text shown on the command line.
-   */
+  /// Generates a string displaying usage information for the defined options.
+  ///
+  /// This is basically the help text shown on the command line.
   String getUsage() => new Usage(this).generate();
 
-  /**
-   * Get the default value for an option. Useful after parsing to test
-   * if the user specified something other than the default.
-   */
+  /// Get the default value for an option. Useful after parsing to test if the
+  /// user specified something other than the default.
   getDefault(String option) {
     if (!options.containsKey(option)) {
       throw new ArgumentError('No option named $option');
@@ -404,48 +126,44 @@
     return options[option].defaultValue;
   }
 
-  /**
-   * Finds the option whose abbreviation is [abbr], or `null` if no option has
-   * that abbreviation.
-   */
+  /// Finds the option whose abbreviation is [abbr], or `null` if no option has
+  /// that abbreviation.
   Option findByAbbreviation(String abbr) {
     return options.values.firstWhere((option) => option.abbreviation == abbr,
         orElse: () => null);
   }
 }
 
-/**
- * The results of parsing a series of command line arguments using
- * [ArgParser.parse()]. Includes the parsed options and any remaining unparsed
- * command line arguments.
- */
+/// The results of parsing a series of command line arguments using
+/// [ArgParser.parse()].
+///
+/// Includes the parsed options and any remaining unparsed command line
+/// arguments.
 class ArgResults {
   final Map<String, dynamic> _options;
 
-  /**
-   * If these are the results for parsing a command's options, this will be
-   * the name of the command. For top-level results, this returns `null`.
-   */
+  /// If these are the results for parsing a command's options, this will be the
+  /// name of the command. For top-level results, this returns `null`.
   final String name;
 
-  /**
-   * The command that was selected, or `null` if none was. This will contain
-   * the options that were selected for that command.
-   */
+  /// The command that was selected, or `null` if none was.
+  ///
+  /// This will contain the options that were selected for that command.
   final ArgResults command;
 
-  /**
-   * The remaining command-line arguments that were not parsed as options or
-   * flags. If `--` was used to separate the options from the remaining
-   * arguments, it will not be included in this list.
-   */
+  /// The remaining command-line arguments that were not parsed as options or
+  /// flags.
+  ///
+  /// If `--` was used to separate the options from the remaining arguments,
+  /// it will not be included in this list unless parsing stopped before the
+  /// `--` was reached.
   final List<String> rest;
 
-  /** Creates a new [ArgResults]. */
+  /// Creates a new [ArgResults].
   ArgResults(this._options, this.name, this.command, List<String> rest)
     : this.rest = new UnmodifiableListView(rest);
 
-  /** Gets the parsed command-line option named [name]. */
+  /// Gets the parsed command-line option named [name].
   operator [](String name) {
     if (!_options.containsKey(name)) {
       throw new ArgumentError(
@@ -455,7 +173,7 @@
     return _options[name];
   }
 
-  /** Get the names of the options as an [Iterable]. */
+  /// Get the names of the options as an [Iterable].
   Iterable<String> get options => _options.keys;
 }
 
diff --git a/pkg/args/lib/src/options.dart b/pkg/args/lib/src/options.dart
index a4091df..d78459e 100644
--- a/pkg/args/lib/src/options.dart
+++ b/pkg/args/lib/src/options.dart
@@ -2,9 +2,7 @@
 
 import 'package:collection/wrappers.dart';
 
-/**
- * A command-line option. Includes both flags and options which take a value.
- */
+/// A command-line option. Includes both flags and options which take a value.
 class Option {
   final String name;
   final String abbreviation;
diff --git a/pkg/args/lib/src/parser.dart b/pkg/args/lib/src/parser.dart
index bccce64..3f2e79d 100644
--- a/pkg/args/lib/src/parser.dart
+++ b/pkg/args/lib/src/parser.dart
@@ -10,45 +10,39 @@
 final _ABBR_OPT = new RegExp(r'^-([a-zA-Z0-9]+)(.*)$');
 final _LONG_OPT = new RegExp(r'^--([a-zA-Z\-_0-9]+)(=(.*))?$');
 
-/**
- * The actual parsing class. Unlike [ArgParser] which is really more an "arg
- * grammar", this is the class that does the parsing and holds the mutable
- * state required during a parse.
- */
+/// The actual argument parsing class.
+///
+/// Unlike [ArgParser] which is really more an "arg grammar", this is the class
+/// that does the parsing and holds the mutable state required during a parse.
 class Parser {
-  /**
-   * If parser is parsing a command's options, this will be the name of the
-   * command. For top-level results, this returns `null`.
-   */
+  /// If parser is parsing a command's options, this will be the name of the
+  /// command. For top-level results, this returns `null`.
   final String commandName;
 
-  /**
-   * The parser for the supercommand of this command parser, or `null` if this
-   * is the top-level parser.
-   */
+  /// The parser for the supercommand of this command parser, or `null` if this
+  /// is the top-level parser.
   final Parser parent;
 
-  /** The grammar being parsed. */
+  /// The grammar being parsed.
   final ArgParser grammar;
 
-  /** The arguments being parsed. */
+  /// The arguments being parsed.
   final List<String> args;
 
-  /** The remaining non-option, non-command arguments. */
+  /// The remaining non-option, non-command arguments.
   final rest = <String>[];
 
-  /** The accumulated parsed options. */
+  /// The accumulated parsed options.
   final Map<String, dynamic> results = <String, dynamic>{};
 
   Parser(this.commandName, this.grammar, this.args, this.parent, rest) {
     if (rest != null) this.rest.addAll(rest);
   }
 
-
-  /** The current argument being parsed. */
+  /// The current argument being parsed.
   String get current => args[0];
 
-  /** Parses the arguments. This can only be called once. */
+  /// Parses the arguments. This can only be called once.
   ArgResults parse() {
     var commandResults = null;
 
@@ -112,10 +106,9 @@
     return new ArgResults(results, commandName, commandResults, rest);
   }
 
-  /**
-   * Pulls the value for [option] from the second argument in [args]. Validates
-   * that there is a valid value there.
-   */
+  /// Pulls the value for [option] from the second argument in [args].
+  ///
+  /// Validates that there is a valid value there.
   void readNextArgAsValue(Option option) {
     // Take the option argument from the next command line arg.
     validate(args.length > 0,
@@ -129,12 +122,11 @@
     args.removeAt(0);
   }
 
-  /**
-   * Tries to parse the current argument as a "solo" option, which is a single
-   * hyphen followed by a single letter. We treat this differently than
-   * collapsed abbreviations (like "-abc") to handle the possible value that
-   * may follow it.
-   */
+  /// Tries to parse the current argument as a "solo" option, which is a single
+  /// hyphen followed by a single letter.
+  ///
+  /// We treat this differently than collapsed abbreviations (like "-abc") to
+  /// handle the possible value that may follow it.
   bool parseSoloOption() {
     var soloOpt = _SOLO_OPT.firstMatch(current);
     if (soloOpt == null) return false;
@@ -158,11 +150,9 @@
     return true;
   }
 
-  /**
-   * Tries to parse the current argument as a series of collapsed abbreviations
-   * (like "-abc") or a single abbreviation with the value directly attached
-   * to it (like "-mrelease").
-   */
+  /// Tries to parse the current argument as a series of collapsed abbreviations
+  /// (like "-abc") or a single abbreviation with the value directly attached
+  /// to it (like "-mrelease").
   bool parseAbbreviation(Parser innermostCommand) {
     var abbrOpt = _ABBR_OPT.firstMatch(current);
     if (abbrOpt == null) return false;
@@ -220,10 +210,8 @@
     setOption(results, option, true);
   }
 
-  /**
-   * Tries to parse the current argument as a long-form named option, which
-   * may include a value like "--mode=release" or "--mode release".
-   */
+  /// Tries to parse the current argument as a long-form named option, which
+  /// may include a value like "--mode=release" or "--mode release".
   bool parseLongOption() {
     var longOpt = _LONG_OPT.firstMatch(current);
     if (longOpt == null) return false;
@@ -268,15 +256,14 @@
     return true;
   }
 
-  /**
-   * Called during parsing to validate the arguments. Throws a
-   * [FormatException] if [condition] is `false`.
-   */
+  /// Called during parsing to validate the arguments.
+  ///
+  /// Throws a [FormatException] if [condition] is `false`.
   void validate(bool condition, String message) {
     if (!condition) throw new FormatException(message);
   }
 
-  /** Validates and stores [value] as the value for [option]. */
+  /// Validates and stores [value] as the value for [option].
   void setOption(Map results, Option option, value) {
     // See if it's one of the allowed values.
     if (option.allowed != null) {
diff --git a/pkg/args/lib/src/usage.dart b/pkg/args/lib/src/usage.dart
index 177a0f9..a431395 100644
--- a/pkg/args/lib/src/usage.dart
+++ b/pkg/args/lib/src/usage.dart
@@ -8,59 +8,55 @@
 
 import '../args.dart';
 
-/**
- * Takes an [ArgParser] and generates a string of usage (i.e. help) text for its
- * defined options. Internally, it works like a tabular printer. The output is
- * divided into three horizontal columns, like so:
- *
- *     -h, --help  Prints the usage information
- *     |  |        |                                 |
- *
- * It builds the usage text up one column at a time and handles padding with
- * spaces and wrapping to the next line to keep the cells correctly lined up.
- */
+/// Takes an [ArgParser] and generates a string of usage (i.e. help) text for
+/// its defined options.
+///
+/// Internally, it works like a tabular printer. The output is divided into
+/// three horizontal columns, like so:
+///
+///     -h, --help  Prints the usage information
+///     |  |        |                                 |
+///
+/// It builds the usage text up one column at a time and handles padding with
+/// spaces and wrapping to the next line to keep the cells correctly lined up.
 class Usage {
   static const NUM_COLUMNS = 3; // Abbreviation, long name, help.
 
-  /** The parser this is generating usage for. */
+  /// The parser this is generating usage for.
   final ArgParser args;
 
-  /** The working buffer for the generated usage text. */
+  /// The working buffer for the generated usage text.
   StringBuffer buffer;
 
-  /**
-   * The column that the "cursor" is currently on. If the next call to
-   * [write()] is not for this column, it will correctly handle advancing to
-   * the next column (and possibly the next row).
-   */
+  /// The column that the "cursor" is currently on.
+  ///
+  /// If the next call to [write()] is not for this column, it will correctly
+  /// handle advancing to the next column (and possibly the next row).
   int currentColumn = 0;
 
-  /** The width in characters of each column. */
+  /// The width in characters of each column.
   List<int> columnWidths;
 
-  /**
-   * The number of sequential lines of text that have been written to the last
-   * column (which shows help info). We track this so that help text that spans
-   * multiple lines can be padded with a blank line after it for separation.
-   * Meanwhile, sequential options with single-line help will be compacted next
-   * to each other.
-   */
+  /// The number of sequential lines of text that have been written to the last
+  /// column (which shows help info).
+  ///
+  /// We track this so that help text that spans multiple lines can be padded
+  /// with a blank line after it for separation. Meanwhile, sequential options
+  /// with single-line help will be compacted next to each other.
   int numHelpLines = 0;
 
-  /**
-   * How many newlines need to be rendered before the next bit of text can be
-   * written. We do this lazily so that the last bit of usage doesn't have
-   * dangling newlines. We only write newlines right *before* we write some
-   * real content.
-   */
+  /// How many newlines need to be rendered before the next bit of text can be
+  /// written.
+  ///
+  /// We do this lazily so that the last bit of usage doesn't have dangling
+  /// newlines. We only write newlines right *before* we write some real
+  /// content.
   int newlinesNeeded = 0;
 
   Usage(this.args);
 
-  /**
-   * Generates a string displaying usage information for the defined options.
-   * This is basically the help text shown on the command line.
-   */
+  /// Generates a string displaying usage information for the defined options.
+  /// This is basically the help text shown on the command line.
   String generate() {
     buffer = new StringBuffer();
 
@@ -229,7 +225,7 @@
   }
 }
 
-/** Pads [source] to [length] by adding spaces at the end. */
+/// Pads [source] to [length] by adding spaces at the end.
 String padRight(String source, int length) {
   final result = new StringBuffer();
   result.write(source);
diff --git a/pkg/args/pubspec.yaml b/pkg/args/pubspec.yaml
index a5c1a18..238df34 100644
--- a/pkg/args/pubspec.yaml
+++ b/pkg/args/pubspec.yaml
@@ -1,5 +1,5 @@
 name: args
-version: 0.11.0
+version: 0.11.0+1
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 documentation: http://api.dartlang.org/docs/pkg/args
diff --git a/pkg/barback/CHANGELOG.md b/pkg/barback/CHANGELOG.md
index a00b8f8..0b702b9 100644
--- a/pkg/barback/CHANGELOG.md
+++ b/pkg/barback/CHANGELOG.md
@@ -1,6 +1,32 @@
-## 0.13.1
+## 0.14.0+2
 
-* Only run `Transformer.isPrimary` once for each asset.
+* Fix a bug with the previous bug fix.
+
+## 0.14.0+1
+
+* Fix a bug where a transformer group preceded by another transformer group
+  would sometimes fail to load secondary assets.
+
+## 0.14.0
+
+* **Breaking change**: when an output of a lazy transformer is requested, that
+  transformer will run long enough to generate the output, then become lazy
+  again. Previously, it would become eager as soon as an asset had been
+  requested.
+
+* Only run `Transformer.isPrimary` and `Transformer.declareOutputs` once for
+  each asset.
+
+* Lazy transformers' laziness is preserved when followed by
+  declaring transformers, or by normal transformers for which the lazy outputs
+  aren't primary.
+
+* Fix a bug where reading the primary input using `Transform.readInputAsString`
+  had slightly different behavior than reading it using
+  `Transform.primary.readAsString`.
+
+* Fix a crashing bug when `Barback.getAllAssets` is called synchronously after
+  creating a new `Barback` instance.
 
 * Don't warn if a lazy or declaring transformer doesn't emit outputs that it has
   declared. This is valid for transformers like dart2js that need to read their
diff --git a/pkg/barback/lib/barback.dart b/pkg/barback/lib/barback.dart
index e764f1a..c39646a 100644
--- a/pkg/barback/lib/barback.dart
+++ b/pkg/barback/lib/barback.dart
@@ -14,11 +14,10 @@
 export 'src/package_provider.dart';
 export 'src/transformer/barback_settings.dart';
 export 'src/transformer/base_transform.dart';
-export 'src/transformer/declaring_transform.dart'
-    hide DeclaringTransformController;
+export 'src/transformer/declaring_transform.dart' hide newDeclaringTransform;
 export 'src/transformer/declaring_transformer.dart';
 export 'src/transformer/lazy_transformer.dart';
-export 'src/transformer/transform.dart' hide TransformController;
+export 'src/transformer/transform.dart' hide newTransform;
 export 'src/transformer/transform_logger.dart';
 export 'src/transformer/transformer.dart';
 export 'src/transformer/transformer_group.dart';
diff --git a/pkg/barback/lib/src/asset/asset_node_set.dart b/pkg/barback/lib/src/asset/asset_node_set.dart
index 4474866..a1fc17b 100644
--- a/pkg/barback/lib/src/asset/asset_node_set.dart
+++ b/pkg/barback/lib/src/asset/asset_node_set.dart
@@ -6,19 +6,37 @@
 
 import 'package:collection/collection.dart';
 
+import 'asset_id.dart';
 import 'asset_node.dart';
 
 /// A set of [AssetNode]s that automatically ensures that nodes are removed from
 /// the set as soon as they're marked as [AssetState.REMOVED].
+///
+/// Asset nodes may be accessed by their ids. This means that only one node with
+/// a given id may be stored in the set at a time.
 class AssetNodeSet extends DelegatingSet<AssetNode> {
+  // TODO(nweiz): Use DelegatingMapSet when issue 18705 is fixed.
+  /// A map from asset ids to assets in the set.
+  final _assetsById = new Map<AssetId, AssetNode>();
+
   AssetNodeSet()
       : super(new Set());
 
+  /// Returns the asset node in the set with [id], or `null` if none exists.
+  AssetNode operator [](AssetId id) => _assetsById[id];
+
   bool add(AssetNode node) {
     if (node.state.isRemoved) return false;
-    node.whenRemoved(() => super.remove(node));
+    node.whenRemoved(() {
+      super.remove(node);
+      _assetsById.remove(node.id);
+    });
+    _assetsById[node.id] = node;
     return super.add(node);
   }
 
+  /// Returns whether an asset node with the given [id] is in the set.
+  bool containsId(AssetId id) => _assetsById.containsKey(id);
+
   void addAll(Iterable<AssetNode> nodes) => nodes.forEach(add);
 }
\ No newline at end of file
diff --git a/pkg/barback/lib/src/asset/asset_set.dart b/pkg/barback/lib/src/asset/asset_set.dart
index d385ec22..ac58774 100644
--- a/pkg/barback/lib/src/asset/asset_set.dart
+++ b/pkg/barback/lib/src/asset/asset_set.dart
@@ -16,6 +16,9 @@
 class AssetSet extends IterableBase<Asset> {
   final _assets = new Map<AssetId, Asset>();
 
+  /// The ids of the assets in the set.
+  Iterable<AssetId> get ids => _assets.keys;
+
   AssetSet();
 
   /// Creates a new AssetSet from the contents of [other].
diff --git a/pkg/barback/lib/src/errors.dart b/pkg/barback/lib/src/errors.dart
index 290d534..0c2b5c5 100644
--- a/pkg/barback/lib/src/errors.dart
+++ b/pkg/barback/lib/src/errors.dart
@@ -7,7 +7,7 @@
 import 'package:stack_trace/stack_trace.dart';
 
 import 'asset/asset_id.dart';
-import 'transformer/transformer.dart';
+import 'transformer/wrapping_aggregate_transformer.dart';
 import 'utils.dart';
 
 /// Error thrown when an asset with [id] cannot be found.
@@ -167,12 +167,17 @@
 /// the transformer that is applied to it.
 class TransformInfo {
   /// The transformer that's run for this transform.
-  final Transformer transformer;
+  ///
+  /// This may be a [Transformer] or a [WrappingAggregateTransformer]. It may
+  /// also return additional types in the future.
+  final transformer;
 
   /// The id of this transform's primary asset.
   final AssetId primaryId;
 
-  TransformInfo(this.transformer, this.primaryId);
+  TransformInfo(transformer, this.primaryId)
+      : transformer = transformer is WrappingAggregateTransformer ?
+            transformer.transformer : transformer;
 
   bool operator==(other) =>
       other is TransformInfo &&
diff --git a/pkg/barback/lib/src/graph/group_runner.dart b/pkg/barback/lib/src/graph/group_runner.dart
index ce58eda..e609ba2 100644
--- a/pkg/barback/lib/src/graph/group_runner.dart
+++ b/pkg/barback/lib/src/graph/group_runner.dart
@@ -50,8 +50,8 @@
   Stream<LogEntry> get onLog => _onLogPool.stream;
   final _onLogPool = new StreamPool<LogEntry>.broadcast();
 
-  GroupRunner(AssetCascade cascade, this._group, this._location) {
-    _addPhase(new Phase(cascade, _location), []);
+  GroupRunner(Phase previous, this._group, this._location) {
+    _addPhase(previous.addPhase(_location), []);
     for (var phase in _group.phases) {
       _addPhase(_phases.last.addPhase(), phase);
     }
@@ -78,11 +78,6 @@
     }
   }
 
-  /// Adds a new asset as an input for this group.
-  void addInput(AssetNode node) {
-    _phases.first.addInput(node);
-  }
-
   /// Removes this group and all sub-phases within it.
   void remove() {
     _onLogPool.close();
diff --git a/pkg/barback/lib/src/graph/phase.dart b/pkg/barback/lib/src/graph/phase.dart
index 70f7e7f..a4724ab 100644
--- a/pkg/barback/lib/src/graph/phase.dart
+++ b/pkg/barback/lib/src/graph/phase.dart
@@ -87,7 +87,7 @@
   NodeStatus get status {
     // Before any transformers are added, the phase should be dirty if and only
     // if any input is dirty.
-    if (_classifiers.isEmpty && _groups.isEmpty) {
+    if (_classifiers.isEmpty && _groups.isEmpty && previous == null) {
       return _inputs.any((input) => input.state.isDirty) ?
           NodeStatus.RUNNING : NodeStatus.IDLE;
     }
@@ -185,9 +185,6 @@
     for (var classifier in _classifiers.values) {
       classifier.addInput(node);
     }
-    for (var group in _groups.values) {
-      group.addInput(node);
-    }
   }
 
   // TODO(nweiz): If the output is available when this is called, it's
@@ -263,14 +260,11 @@
     }
 
     for (var added in newGroups.difference(oldGroups)) {
-      var runner = new GroupRunner(cascade, added, "$_location.$_index");
+      var runner = new GroupRunner(previous, added, "$_location.$_index");
       _groups[added] = runner;
       runner.onAsset.listen(_handleOutput);
       _streams.onLogPool.add(runner.onLog);
       runner.onStatusChange.listen((_) => _streams.changeStatus(status));
-      for (var input in _inputs) {
-        runner.addInput(input);
-      }
     }
 
     for (var forwarder in _forwarders.values) {
@@ -294,9 +288,18 @@
 
   /// Add a new phase after this one.
   ///
-  /// This may only be called on a phase with no phase following it.
-  Phase addPhase() {
-    var next = new Phase._(cascade, _location, _index + 1, this);
+  /// The new phase will have a location annotation describing its place in the
+  /// package graph. By default, this annotation will describe it as being
+  /// directly after [this]. If [location] is passed, though, it's described as
+  /// being the first phase in that location.
+  Phase addPhase([String location]) {
+    var index = 0;
+    if (location == null) {
+      location = _location;
+      index = _index + 1;
+    }
+
+    var next = new Phase._(cascade, location, index, this);
     for (var output in _outputs.values.toList()) {
       // Remove [output]'s listeners because now they should get the asset from
       // [next], rather than this phase. Any transforms consuming [output] will
diff --git a/pkg/barback/lib/src/graph/transform_node.dart b/pkg/barback/lib/src/graph/transform_node.dart
index 4cdab8e..5ef4b81 100644
--- a/pkg/barback/lib/src/graph/transform_node.dart
+++ b/pkg/barback/lib/src/graph/transform_node.dart
@@ -9,13 +9,14 @@
 import '../asset/asset.dart';
 import '../asset/asset_id.dart';
 import '../asset/asset_node.dart';
+import '../asset/asset_node_set.dart';
 import '../errors.dart';
 import '../log.dart';
-import '../transformer/declaring_transform.dart';
-import '../transformer/declaring_transformer.dart';
-import '../transformer/lazy_transformer.dart';
-import '../transformer/transform.dart';
-import '../transformer/transformer.dart';
+import '../transformer/aggregate_transform.dart';
+import '../transformer/aggregate_transformer.dart';
+import '../transformer/declaring_aggregate_transform.dart';
+import '../transformer/declaring_aggregate_transformer.dart';
+import '../transformer/lazy_aggregate_transformer.dart';
 import '../utils.dart';
 import 'node_status.dart';
 import 'node_streams.dart';
@@ -27,23 +28,29 @@
 /// Keeps track of whether it's dirty and needs to be run and which assets it
 /// depends on.
 class TransformNode {
+  /// The aggregate key for this node.
+  final String key;
+
   /// The [Phase] that this transform runs in.
   final Phase phase;
 
-  /// The [Transformer] to apply to this node's inputs.
-  final Transformer transformer;
+  /// The [AggregateTransformer] to apply to this node's inputs.
+  final AggregateTransformer transformer;
 
-  /// The node for the primary asset this transform depends on.
-  final AssetNode primary;
+  /// The primary asset nodes this transform runs on.
+  final _primaries = new AssetNodeSet();
 
   /// A string describing the location of [this] in the transformer graph.
   final String _location;
 
-  /// The subscription to [primary]'s [AssetNode.onStateChange] stream.
-  StreamSubscription _primarySubscription;
+  /// The subscription to the [_primaries]' [AssetNode.onStateChange] streams.
+  final _primarySubscriptions = new Map<AssetId, StreamSubscription>();
 
   /// The subscription to [phase]'s [Phase.onAsset] stream.
-  StreamSubscription<AssetNode> _phaseSubscription;
+  StreamSubscription<AssetNode> _phaseAssetSubscription;
+
+  /// The subscription to [phase]'s [Phase.onStatusChange] stream.
+  StreamSubscription<NodeStatus> _phaseStatusSubscription;
 
   /// How far along [this] is in processing its assets.
   NodeStatus get status {
@@ -51,19 +58,28 @@
       return NodeStatus.IDLE;
     }
 
-    if (_declaring && _state != _State.DECLARING) {
+    if (_declaring && _state != _State.DECLARING &&
+        _state != _State.NEEDS_DECLARE) {
       return NodeStatus.MATERIALIZING;
     } else {
       return NodeStatus.RUNNING;
     }
   }
 
+  /// The [TransformInfo] describing this node.
+  ///
+  /// [TransformInfo] is the publicly-visible representation of a transform
+  /// node.
+  TransformInfo get info => new TransformInfo(transformer,
+      new AssetId(phase.cascade.package, key));
+
   /// Whether this is a declaring transform.
   ///
-  /// This is usually identical to `transformer is DeclaringTransformer`, but if
-  /// a declaring and non-lazy transformer emits an error during
-  /// `declareOutputs` it's treated as though it wasn't declaring.
-  bool get _declaring => transformer is DeclaringTransformer &&
+  /// This is usually identical to `transformer is
+  /// DeclaringAggregateTransformer`, but if a declaring and non-lazy
+  /// transformer emits an error during `declareOutputs` it's treated as though
+  /// it wasn't declaring.
+  bool get _declaring => transformer is DeclaringAggregateTransformer &&
       (_state == _State.DECLARING || _declaredOutputs != null);
 
   /// Whether this transform has been forced since it last finished applying.
@@ -73,8 +89,9 @@
   /// transformers, since they always need to eagerly generate outputs.
   bool _forced;
 
-  /// The subscriptions to each input's [AssetNode.onStateChange] stream.
-  final _inputSubscriptions = new Map<AssetId, StreamSubscription>();
+  /// The subscriptions to each secondary input's [AssetNode.onStateChange]
+  /// stream.
+  final _secondarySubscriptions = new Map<AssetId, StreamSubscription>();
 
   /// The controllers for the asset nodes emitted by this node.
   final _outputControllers = new Map<AssetId, AssetNodeController>();
@@ -83,14 +100,14 @@
   /// ran.
   final _missingInputs = new Set<AssetId>();
 
-  /// The controller that's used to pass [primary] through [this] if it's not
-  /// consumed or overwritten.
+  /// The controllers that are used to pass each primary input through [this] if
+  /// it's not consumed or overwritten.
   ///
   /// This needs an intervening controller to ensure that the output can be
   /// marked dirty when determining whether [this] will consume or overwrite it,
-  /// and be marked removed if it does. [_passThroughController] will be null
-  /// if the asset is not being passed through.
-  AssetNodeController _passThroughController;
+  /// and be marked removed if it does. No pass-through controller will exist
+  /// for primary inputs that are not being passed through.
+  final _passThroughControllers = new Map<AssetId, AssetNodeController>();
 
   /// The asset node for this transform.
   final _streams = new NodeStreams();
@@ -99,7 +116,7 @@
   Stream<LogEntry> get onLog => _streams.onLog;
 
   /// The current state of [this].
-  var _state = _State.DECLARING;
+  var _state = _State.DECLARED;
 
   /// Whether [this] has been marked as removed.
   bool get _isRemoved => _streams.onAssetController.isClosed;
@@ -108,59 +125,87 @@
   // can run [apply] even if [force] hasn't been called, since [transformer]
   // should run eagerly if possible.
   bool get _canRunDeclaringEagerly =>
-      _declaring && transformer is! LazyTransformer &&
-      primary.state.isAvailable;
+      _declaring && transformer is! LazyAggregateTransformer &&
+      _primaries.every((input) => input.state.isAvailable);
 
-  /// Whether the most recent run of this transform has declared that it
-  /// consumes the primary input.
+  /// Which primary inputs the most recent run of this transform has declared
+  /// that it consumes.
   ///
-  /// Defaults to `false`. This is not meaningful unless [_state] is
-  /// [_State.APPLIED] or [_State.DECLARED].
-  bool _consumePrimary = false;
+  /// This starts out `null`, indicating that the transform hasn't declared
+  /// anything yet. This is not meaningful unless [_state] is [_State.APPLIED]
+  /// or [_State.DECLARED].
+  Set<AssetId> _consumedPrimaries;
 
   /// The set of output ids that [transformer] declared it would emit.
   ///
-  /// This is only non-null if [transformer] is a [DeclaringTransformer] and its
-  /// [declareOutputs] has been run successfully.
+  /// This is only non-null if [transformer] is a
+  /// [DeclaringAggregateTransformer] and its [declareOutputs] has been run
+  /// successfully.
   Set<AssetId> _declaredOutputs;
 
-  TransformNode(this.phase, Transformer transformer, AssetNode primary,
-      this._location)
-      : transformer = transformer,
-        primary = primary {
-    _forced = transformer is! DeclaringTransformer;
-    if (_forced) primary.force();
+  /// The controller for the currently-running
+  /// [DeclaringAggregateTransformer.declareOutputs] call's
+  /// [DeclaringAggregateTransform].
+  ///
+  /// This will be non-`null` when
+  /// [DeclaringAggregateTransformer.declareOutputs] is running. This means that
+  /// it's always non-`null` when [_state] is [_State.DECLARING], sometimes
+  /// non-`null` when it's [_State.NEEDS_DECLARE], and always `null` otherwise.
+  DeclaringAggregateTransformController _declareController;
 
-    _primarySubscription = primary.onStateChange.listen((state) {
-      if (state.isRemoved) {
-        remove();
-      } else {
-        if (_forced) primary.force();
-        _dirty();
-      }
-    });
+  /// The controller for the currently-running [AggregateTransformer.apply]
+  /// call's [AggregateTransform].
+  ///
+  /// This will be non-`null` when [AggregateTransform.apply] is running, which
+  /// means that it's always non-`null` when [_state] is [_State.APPLYING] or
+  /// [_State.NEEDS_APPLY], sometimes non-`null` when it's
+  /// [_State.NEEDS_DECLARE], and always `null` otherwise.
+  AggregateTransformController _applyController;
 
-    _phaseSubscription = phase.previous.onAsset.listen((node) {
+  TransformNode(this.phase, this.transformer, this.key, this._location) {
+    _forced = transformer is! DeclaringAggregateTransformer;
+
+    _phaseAssetSubscription = phase.previous.onAsset.listen((node) {
       if (!_missingInputs.contains(node.id)) return;
       if (_forced) node.force();
       _dirty();
     });
 
-    _declareOutputs().then((_) {
-      if (_forced || _canRunDeclaringEagerly) {
-        _apply();
-      } else {
-        _state = _State.DECLARED;
-        _streams.changeStatus(NodeStatus.IDLE);
-      }
+    _phaseStatusSubscription = phase.previous.onStatusChange.listen((status) {
+      if (status == NodeStatus.RUNNING) return;
+
+      _maybeFinishDeclareController();
+      _maybeFinishApplyController();
     });
+
+    _run();
   }
 
-  /// The [TransformInfo] describing this node.
-  ///
-  /// [TransformInfo] is the publicly-visible representation of a transform
-  /// node.
-  TransformInfo get info => new TransformInfo(transformer, primary.id);
+  /// Adds [input] as a primary input for this node.
+  void addPrimary(AssetNode input) {
+    _primaries.add(input);
+    if (_forced) input.force();
+
+    _primarySubscriptions[input.id] = input.onStateChange
+        .listen((_) => _onPrimaryStateChange(input));
+
+    if (_state == _State.DECLARING && !_declareController.isDone) {
+      // If we're running `declareOutputs` and its id stream isn't closed yet,
+      // pass this in as another id.
+      _declareController.addId(input.id);
+      _maybeFinishDeclareController();
+    } else if (_state == _State.APPLYING) {
+      // If we're running `apply`, we need to wait until [input] is available
+      // before we pass it into the stream. If it's available now, great; if
+      // not, [_onPrimaryStateChange] will handle it.
+      if (!input.state.isAvailable) return;
+      _onPrimaryStateChange(input);
+      _maybeFinishApplyController();
+    } else {
+      // Otherwise, a new input means we'll need to re-run `declareOutputs`.
+      _restartRun();
+    }
+  }
 
   /// Marks this transform as removed.
   ///
@@ -170,41 +215,58 @@
   /// valid even if its primary input still exists.
   void remove() {
     _streams.close();
-    _primarySubscription.cancel();
-    _phaseSubscription.cancel();
-    _clearInputSubscriptions();
+    _phaseAssetSubscription.cancel();
+    _phaseStatusSubscription.cancel();
+    if (_declareController != null) _declareController.cancel();
+    if (_applyController != null) _applyController.cancel();
+    _clearSecondarySubscriptions();
     _clearOutputs();
-    if (_passThroughController != null) {
-      _passThroughController.setRemoved();
-      _passThroughController = null;
+
+    for (var subscription in _primarySubscriptions.values) {
+      subscription.cancel();
     }
+    _primarySubscriptions.clear();
+
+    for (var controller in _passThroughControllers.values) {
+      controller.setRemoved();
+    }
+    _passThroughControllers.clear();
   }
 
   /// If [this] is deferred, ensures that its concrete outputs will be
   /// generated.
   void force() {
     if (_forced || _state == _State.APPLIED) return;
-    primary.force();
+    for (var input in _primaries) {
+      input.force();
+    }
+
     _forced = true;
-    if (_state == _State.DECLARED) _dirty();
+    if (_state == _State.DECLARED) _apply();
   }
 
   /// Marks this transform as dirty.
   ///
-  /// This causes all of the transform's outputs to be marked as dirty as well.
+  /// Specifically, this should be called when one of the transform's inputs'
+  /// contents change, or when a secondary input is removed. Primary inputs
+  /// being added or removed are handled by [addInput] and
+  /// [_onPrimaryStateChange].
   void _dirty() {
-    // If we're in the process of running [declareOutputs], we already know that
-    // [apply] needs to be run so there's nothing we need to mark as dirty.
-    if (_state == _State.DECLARING) return;
+    if (_state == _State.DECLARING || _state == _State.NEEDS_DECLARE ||
+        _state == _State.NEEDS_APPLY) {
+      // If we already know that [_apply] needs to be run, there's nothing to do
+      // here.
+      return;
+    }
 
     if (!_forced && !_canRunDeclaringEagerly) {
       // [forced] should only ever be false for a declaring transformer.
       assert(_declaring);
 
-      // If we've finished applying, transition to MATERIALIZING, indicating
-      // that we know what outputs [apply] will emit but we're waiting to emit
-      // them concretely until [force] is called. If we're still applying, we'll
-      // transition to MATERIALIZING once we finish.
+      // If we've finished applying, transition to DECLARED, indicating that we
+      // know what outputs [apply] will emit but we're waiting to emit them
+      // concretely until [force] is called. If we're still applying, we'll
+      // transition to DECLARED once we finish.
       if (_state == _State.APPLIED) _state = _State.DECLARED;
       for (var controller in _outputControllers.values) {
         controller.setLazy(force);
@@ -213,11 +275,6 @@
       return;
     }
 
-    if (_passThroughController != null) _passThroughController.setDirty();
-    for (var controller in _outputControllers.values) {
-      controller.setDirty();
-    }
-
     if (_state == _State.APPLIED) {
       if (_declaredOutputs != null) _emitDeclaredOutputs();
       _apply();
@@ -228,20 +285,136 @@
     }
   }
 
+  /// The callback called when [input]'s state changes.
+  void _onPrimaryStateChange(AssetNode input) {
+    if (input.state.isRemoved) {
+      _primarySubscriptions.remove(input.id);
+
+      if (_primaries.isEmpty) {
+        // If there are no more primary inputs, there's no more use for this
+        // node in the graph. It will be re-created by its
+        // [TransformerClassifier] if a new input with [key] is added.
+        remove();
+        return;
+      }
+
+      // Any change to the number of primary inputs requires that we re-run the
+      // transformation.
+      _restartRun();
+    } else if (input.state.isAvailable) {
+      if (_state == _State.DECLARED && _canRunDeclaringEagerly) {
+        // If [this] is fully declared but hasn't started applying, this input
+        // becoming available may mean that all inputs are available, in which
+        // case we can run apply eagerly.
+        _apply();
+        return;
+      }
+
+      // If we're not actively passing concrete assets to the transformer, the
+      // distinction between a dirty asset and an available one isn't relevant.
+      if (_state != _State.APPLYING) return;
+
+      if (_applyController.isDone) {
+        // If we get a new asset after we've closed the asset stream, we need to
+        // re-run declare and then apply.
+        _restartRun();
+      } else {
+        // If the new asset comes before the asset stream is done, we can just
+        // pass it to the stream.
+        _applyController.addInput(input.asset);
+        _maybeFinishApplyController();
+      }
+    } else {
+      if (_forced) input.force();
+      if (_state == _State.APPLYING && !_applyController.addedId(input.id)) {
+        // If the input hasn't yet been added to the transform's input stream,
+        // there's no need to consider the transformation dirty.
+        return;
+      }
+      _dirty();
+    }
+  }
+
+  /// Run the entire transformation, including both `declareOutputs` (if
+  /// applicable) and `apply`.
+  void _run() {
+    assert(_state != _State.DECLARING);
+    assert(_state != _State.APPLYING);
+
+    _markOutputsDirty();
+    _declareOutputs(() {
+      if (_forced || _canRunDeclaringEagerly) {
+        _apply();
+      } else {
+        _state = _State.DECLARED;
+        _streams.changeStatus(NodeStatus.IDLE);
+      }
+    });
+  }
+
+  /// Restart the entire transformation, including `declareOutputs` if
+  /// applicable.
+  void _restartRun() {
+    if (_state == _State.DECLARED || _state == _State.APPLIED) {
+      // If we're currently idle, we can restart the transformation immediately.
+      _run();
+      return;
+    }
+
+    // If we're actively running `declareOutputs` or `apply`, cancel the
+    // transforms and transition to `NEEDS_DECLARE`. Once the transformer's
+    // method returns, we'll transition to `DECLARING`.
+    if (_declareController != null) _declareController.cancel();
+    if (_applyController != null) _applyController.cancel();
+    _state = _State.NEEDS_DECLARE;
+  }
+
   /// Runs [transform.declareOutputs] and emits the resulting assets as dirty
   /// assets.
-  Future _declareOutputs() {
-    if (transformer is! DeclaringTransformer) return new Future.value();
+  ///
+  /// Calls [callback] when it's finished. This doesn't return a future so that
+  /// [callback] is called synchronously if there are no outputs to declare. If
+  /// [this] is removed while inputs are being declared, [callback] will not be
+  /// called.
+  void _declareOutputs(void callback()) {
+    if (transformer is! DeclaringAggregateTransformer) {
+      callback();
+      return;
+    }
 
-    var controller = new DeclaringTransformController(this);
-    return syncFuture(() {
-      return (transformer as DeclaringTransformer)
+    _state = _State.DECLARING;
+    var controller = new DeclaringAggregateTransformController(this);
+    _declareController = controller;
+    _streams.onLogPool.add(controller.onLog);
+    for (var primary in _primaries) {
+      controller.addId(primary.id);
+    }
+
+    syncFuture(() {
+      return (transformer as DeclaringAggregateTransformer)
           .declareOutputs(controller.transform);
+    }).whenComplete(() {
+      // Cancel the controller here even if `declareOutputs` wasn't interrupted.
+      // Since the declaration is finished, we want to close out the
+      // controller's streams.
+      controller.cancel();
+      _declareController = null;
     }).then((_) {
       if (_isRemoved) return;
-      if (controller.loggedError) return;
+      if (_state == _State.NEEDS_DECLARE) {
+        _declareOutputs(callback);
+        return;
+      }
 
-      _consumePrimary = controller.consumePrimary;
+      if (controller.loggedError) {
+        // If `declareOutputs` fails, fall back to treating a declaring
+        // transformer as though it were eager.
+        if (transformer is! LazyAggregateTransformer) _forced = true;
+        callback();
+        return;
+      }
+
+      _consumedPrimaries = controller.consumedPrimaries;
       _declaredOutputs = controller.outputIds;
       var invalidIds = _declaredOutputs
           .where((id) => id.package != phase.cascade.package).toSet();
@@ -251,12 +424,17 @@
         phase.cascade.reportError(new InvalidOutputException(info, id));
       }
 
-      if (!_declaredOutputs.contains(primary.id)) _emitPassThrough();
+      for (var primary in _primaries) {
+        if (_declaredOutputs.contains(primary.id)) continue;
+        _passThrough(primary.id);
+      }
       _emitDeclaredOutputs();
+      callback();
     }).catchError((error, stackTrace) {
       if (_isRemoved) return;
-      if (transformer is! LazyTransformer) _forced = true;
+      if (transformer is! LazyAggregateTransformer) _forced = true;
       phase.cascade.reportError(_wrapException(error, stackTrace));
+      callback();
     });
   }
 
@@ -278,13 +456,26 @@
     }
   }
 
+  //// Mark all emitted and passed-through outputs of this transform as dirty.
+  void _markOutputsDirty() {
+    for (var controller in _passThroughControllers.values) {
+      controller.setDirty();
+    }
+    for (var controller in _outputControllers.values) {
+      if (_forced) {
+        controller.setDirty();
+      } else {
+        controller.setLazy(force);
+      }
+    }
+  }
+
   /// Applies this transform.
   void _apply() {
     assert(!_isRemoved);
 
-    // Clear input subscriptions here as well as in [_process] because [_apply]
-    // may be restarted independently if only a secondary input changes.
-    _clearInputSubscriptions();
+    _markOutputsDirty();
+    _clearSecondarySubscriptions();
     _state = _State.APPLYING;
     _streams.changeStatus(status);
     _runApply().then((hadError) {
@@ -292,8 +483,19 @@
 
       if (_state == _State.DECLARED) return;
 
+      if (_state == _State.NEEDS_DECLARE) {
+        _run();
+        return;
+      }
+
+      // If an input's contents changed while running `apply`, retry unless the
+      // transformer is deferred and hasn't been forced.
       if (_state == _State.NEEDS_APPLY) {
-        _apply();
+        if (_forced || _canRunDeclaringEagerly) {
+          _apply();
+        } else {
+          _state = _State.DECLARED;
+        }
         return;
       }
 
@@ -303,14 +505,18 @@
       if (hadError) {
         _clearOutputs();
         // If the transformer threw an error, we don't want to emit the
-        // pass-through asset in case it will be overwritten by the transformer.
-        // However, if the transformer declared that it wouldn't overwrite or
-        // consume the pass-through asset, we can safely emit it.
-        if (_declaredOutputs != null && !_consumePrimary &&
-            !_declaredOutputs.contains(primary.id)) {
-          _emitPassThrough();
-        } else {
-          _dontEmitPassThrough();
+        // pass-through assets in case they'll be overwritten by the
+        // transformer. However, if the transformer declared that it wouldn't
+        // overwrite or consume a pass-through asset, we can safely emit it.
+        if (_declaredOutputs != null) {
+          for (var input in _primaries) {
+            if (_consumedPrimaries.contains(input.id) ||
+                _declaredOutputs.contains(input.id)) {
+              _consumePrimary(input.id);
+            } else {
+              _passThrough(input.id);
+            }
+          }
         }
       }
 
@@ -332,27 +538,39 @@
         throw new AssetNotFoundException(id);
       }
 
-      _inputSubscriptions.putIfAbsent(node.id, () {
-        return node.onStateChange.listen((state) => _dirty());
+      _secondarySubscriptions.putIfAbsent(node.id, () {
+        return node.onStateChange.listen((_) => _dirty());
       });
 
       return node.asset;
     });
   }
 
-  /// Run [Transformer.apply] as soon as [primary] is available.
+  /// Run [AggregateTransformer.apply].
   ///
   /// Returns whether or not an error occurred while running the transformer.
   Future<bool> _runApply() {
-    var transformController = new TransformController(this);
-    _streams.onLogPool.add(transformController.onLog);
+    var controller = new AggregateTransformController(this);
+    _applyController = controller;
+    _streams.onLogPool.add(controller.onLog);
+    for (var primary in _primaries) {
+      if (!primary.state.isAvailable) continue;
+      controller.addInput(primary.asset);
+    }
 
-    return primary.whenAvailable((_) {
-      if (_isRemoved) return null;
-      _state = _State.APPLYING;
-      return syncFuture(() => transformer.apply(transformController.transform));
+    return syncFuture(() {
+      return transformer.apply(controller.transform);
+    }).whenComplete(() {
+      // 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();
+      _applyController = null;
     }).then((_) {
-      if (!_forced && !primary.state.isAvailable) {
+      assert(_state != _State.DECLARED);
+      assert(_state != _State.DECLARING);
+      assert(_state != _State.APPLIED);
+
+      if (!_forced && _primaries.any((node) => !node.state.isAvailable)) {
         _state = _State.DECLARED;
         _streams.changeStatus(NodeStatus.IDLE);
         return false;
@@ -360,9 +578,9 @@
 
       if (_isRemoved) return false;
       if (_state == _State.NEEDS_APPLY) return false;
-      if (_state == _State.DECLARING) return false;
-      if (transformController.loggedError) return true;
-      _handleApplyResults(transformController);
+      if (_state == _State.NEEDS_DECLARE) return false;
+      if (controller.loggedError) return true;
+      _handleApplyResults(controller);
       return false;
     }).catchError((error, stackTrace) {
       // If the transform became dirty while processing, ignore any errors from
@@ -378,12 +596,12 @@
 
   /// Handle the results of running [Transformer.apply].
   ///
-  /// [transformController] should be the controller for the [Transform] passed
-  /// to [Transformer.apply].
-  void _handleApplyResults(TransformController transformController) {
-    _consumePrimary = transformController.consumePrimary;
+  /// [controller] should be the controller for the [AggegateTransform] passed
+  /// to [AggregateTransformer.apply].
+  void _handleApplyResults(AggregateTransformController controller) {
+    _consumedPrimaries = controller.consumedPrimaries;
 
-    var newOutputs = transformController.outputs;
+    var newOutputs = controller.outputs;
     // Any ids that are for a different package are invalid.
     var invalidIds = newOutputs
         .map((asset) => asset.id)
@@ -401,12 +619,14 @@
       _outputControllers.remove(id).setRemoved();
     }
 
-    // Emit or stop emitting the pass-through asset between removing and
-    // adding outputs to ensure there are no collisions.
-    if (!_consumePrimary && !newOutputs.containsId(primary.id)) {
-      _emitPassThrough();
-    } else {
-      _dontEmitPassThrough();
+    // Emit or stop emitting pass-through assets between removing and adding
+    // outputs to ensure there are no collisions.
+    for (var id in _primaries.map((node) => node.id)) {
+      if (_consumedPrimaries.contains(id) || newOutputs.containsId(id)) {
+        _consumePrimary(id);
+      } else {
+        _passThrough(id);
+      }
     }
 
     // Store any new outputs or new contents for existing outputs.
@@ -423,12 +643,12 @@
   }
 
   /// Cancels all subscriptions to secondary input nodes.
-  void _clearInputSubscriptions() {
+  void _clearSecondarySubscriptions() {
     _missingInputs.clear();
-    for (var subscription in _inputSubscriptions.values) {
+    for (var subscription in _secondarySubscriptions.values) {
       subscription.cancel();
     }
-    _inputSubscriptions.clear();
+    _secondarySubscriptions.clear();
   }
 
   /// Removes all output assets.
@@ -440,26 +660,49 @@
     _outputControllers.clear();
   }
 
-  /// Emit the pass-through asset if it's not being emitted already.
-  void _emitPassThrough() {
-    assert(!_outputControllers.containsKey(primary.id));
+  /// Emit the pass-through node for the primary input [id] if it's not being
+  /// emitted already.
+  void _passThrough(AssetId id) {
+    assert(!_outputControllers.containsKey(id));
 
-    if (_consumePrimary) return;
-    if (_passThroughController == null) {
-      _passThroughController = new AssetNodeController.from(primary);
-      _streams.onAssetController.add(_passThroughController.node);
+    if (_consumedPrimaries.contains(id)) return;
+    var controller = _passThroughControllers[id];
+    var primary = _primaries[id];
+    if (controller == null) {
+      controller = new AssetNodeController.from(primary);
+      _passThroughControllers[id] = controller;
+      _streams.onAssetController.add(controller.node);
     } else if (primary.state.isDirty) {
-      _passThroughController.setDirty();
-    } else if (!_passThroughController.node.state.isAvailable) {
-      _passThroughController.setAvailable(primary.asset);
+      controller.setDirty();
+    } else if (!controller.node.state.isAvailable) {
+      controller.setAvailable(primary.asset);
     }
   }
 
-  /// Stop emitting the pass-through asset if it's being emitted already.
-  void _dontEmitPassThrough() {
-    if (_passThroughController == null) return;
-    _passThroughController.setRemoved();
-    _passThroughController = null;
+  /// Stops emitting the pass-through node for the primary input [id] if it's
+  /// being emitted.
+  void _consumePrimary(AssetId id) {
+    var controller = _passThroughControllers.remove(id);
+    if (controller == null) return;
+    controller.setRemoved();
+  }
+
+  /// If `declareOutputs` is running and all previous phases have declared their
+  /// outputs, mark [_declareController] as done.
+  void _maybeFinishDeclareController() {
+    if (_declareController == null) return;
+    if (phase.previous.status == NodeStatus.RUNNING) return;
+    _declareController.done();
+  }
+
+  /// If `apply` is running, all previous phases have declared their outputs,
+  /// and all primary inputs are available and thus have been passed to the
+  /// transformer, mark [_applyController] as done.
+  void _maybeFinishApplyController() {
+    if (_applyController == null) return;
+    if (_primaries.any((input) => !input.state.isAvailable)) return;
+    if (phase.previous.status == NodeStatus.RUNNING) return;
+    _applyController.done();
   }
 
   BarbackException _wrapException(error, StackTrace stackTrace) {
@@ -470,62 +713,67 @@
     }
   }
 
-  /// Emit a warning about the transformer on [id].
-  void _warn(String message) {
-    _streams.onLogController.add(
-        new LogEntry(info, primary.id, LogLevel.WARNING, message, null));
-  }
-
   String toString() =>
-      "transform node in $_location for $transformer on $primary ($_state, "
-      "$status, ${_forced ? '' : 'un'}forced)";
+      "transform node in $_location for $transformer on ${info.primaryId} "
+      "($_state, $status, ${_forced ? '' : 'un'}forced)";
 }
 
 /// The enum of states that [TransformNode] can be in.
 class _State {
-  /// The transform is running [DeclaringTransformer.declareOutputs].
+  /// The transform is running [DeclaringAggregateTransformer.declareOutputs].
   ///
-  /// This is the initial state of the transformer, and it will only occur once
-  /// since [DeclaringTransformer.declareOutputs] is independent of the contents
-  /// of the primary input. Once the method finishes running, this will
-  /// transition to [APPLYING] if the transform is non-lazy and the input is
+  /// If the set of primary inputs changes while in this state, it will
+  /// transition to [NEEDS_DECLARE]. If the [TransformNode] is still in this
+  /// state when `declareOutputs` finishes running, it will transition to
+  /// [APPLYING] if the transform is non-lazy and all of its primary inputs are
   /// available, and [DECLARED] otherwise.
   ///
   /// Non-declaring transformers will transition out of this state and into
   /// [APPLYING] immediately.
-  static final DECLARING = const _State._("declaring outputs");
+  static const DECLARING = const _State._("declaring outputs");
+
+  /// The transform is running [AggregateTransformer.declareOutputs] or
+  /// [AggregateTransform.apply], but a primary input was added or removed after
+  /// it started, so it will need to re-run `declareOutputs`.
+  ///
+  /// The [TransformNode] will transition to [DECLARING] once `declareOutputs`
+  /// or `apply` finishes running.
+  static const NEEDS_DECLARE = const _State._("needs declare");
 
   /// The transform is deferred and has run
-  /// [DeclaringTransformer.declareOutputs] but hasn't yet been forced.
+  /// [DeclaringAggregateTransformer.declareOutputs] but hasn't yet been forced.
   ///
-  /// This will transition to [APPLYING] when one of the outputs has been
-  /// forced.
-  static final DECLARED = const _State._("declared");
+  /// The [TransformNode] will transition to [APPLYING] when one of the outputs
+  /// has been forced or if the transformer is non-lazy and all of its primary
+  /// inputs become available.
+  static const DECLARED = const _State._("declared");
 
-  /// The transform is running [Transformer.apply].
+  /// The transform is running [AggregateTransformer.apply].
   ///
-  /// If an input changes while in this state, it will transition to
-  /// [NEEDS_APPLY]. If the [TransformNode] is still in this state when
-  /// [Transformer.apply] finishes running, it will transition to [APPLIED].
-  static final APPLYING = const _State._("applying");
+  /// If an input's contents change or a secondary input is added or removed
+  /// while in this state, the [TransformNode] will transition to [NEEDS_APPLY].
+  /// If a primary input is added or removed, it will transition to
+  /// [NEEDS_DECLARE]. If it's still in this state when `apply` finishes
+  /// running, it will transition to [APPLIED].
+  static const APPLYING = const _State._("applying");
 
-  /// The transform is running [Transformer.apply], but an input changed after
-  /// it started, so it will need to re-run [Transformer.apply].
+  /// The transform is running [AggregateTransformer.apply], but an input's
+  /// contents changed or a secondary input was added or removed after it
+  /// started, so it will need to re-run `apply`.
   ///
-  /// This will transition to [APPLYING] once [Transformer.apply] finishes
-  /// running.
-  static final NEEDS_APPLY = const _State._("needs apply");
+  /// If a primary input is added or removed while in this state, the
+  /// [TranformNode] will transition to [NEEDS_DECLARE]. If it's still in this
+  /// state when `apply` finishes running, it will transition to [APPLYING].
+  static const NEEDS_APPLY = const _State._("needs apply");
 
-  /// The transform has finished running [Transformer.apply], whether or not it
-  /// emitted an error.
+  /// The transform has finished running [AggregateTransformer.apply], whether
+  /// or not it emitted an error.
   ///
-  /// If the transformer is deferred, the [TransformNode] can also be in this
-  /// state when [Transformer.declareOutputs] has been run but
-  /// [Transformer.apply] has not.
-  ///
-  /// If an input changes, this will transition to [DECLARED] if the transform
-  /// is deferred and [APPLYING] otherwise.
-  static final APPLIED = const _State._("applied");
+  /// If an input's contents change or a secondary input is added or removed,
+  /// the [TransformNode] will transition to [DECLARED] if the transform is
+  /// declaring and [APPLYING] otherwise. If a primary input is added or
+  /// removed, this will transition to [DECLARING].
+  static const APPLIED = const _State._("applied");
 
   final String name;
 
diff --git a/pkg/barback/lib/src/graph/transformer_classifier.dart b/pkg/barback/lib/src/graph/transformer_classifier.dart
index 6ba2480..9a59f57 100644
--- a/pkg/barback/lib/src/graph/transformer_classifier.dart
+++ b/pkg/barback/lib/src/graph/transformer_classifier.dart
@@ -10,7 +10,8 @@
 import '../asset/asset_node.dart';
 import '../errors.dart';
 import '../log.dart';
-import '../transformer/transformer.dart';
+import '../transformer/aggregate_transformer.dart';
+import '../transformer/wrapping_aggregate_transformer.dart';
 import '../utils.dart';
 import 'node_status.dart';
 import 'node_streams.dart';
@@ -18,17 +19,17 @@
 import 'transform_node.dart';
 
 /// A class for classifying the primary inputs for a transformer according to
-/// its `classifyPrimary` method.
+/// its [AggregateTransformer.classifyPrimary] method.
 ///
-/// This is used for non-aggregate transformers; they're modeled as aggregate
-/// transformers that return the primary path if `isPrimary` is true and `null`
-/// if `isPrimary` is `null`.
+/// This is also used for non-aggregate transformers; they're modeled as
+/// aggregate transformers that return the primary path if `isPrimary` is true
+/// and `null` if `isPrimary` is `null`.
 class TransformerClassifier {
   /// The containing [Phase].
   final Phase _phase;
 
-  /// The [Transformer] to use to classify the inputs.
-  final Transformer transformer;
+  /// The [AggregateTransformer] used to classify the inputs.
+  final AggregateTransformer transformer;
 
   /// A string describing the location of [this] in the transformer graph.
   final String _location;
@@ -45,24 +46,26 @@
   Stream<AssetNode> get onAsset => _streams.onAsset;
   Stream<LogEntry> get onLog => _streams.onLog;
 
-  /// The number of currently-active calls to [transformer.isPrimary].
+  /// The number of currently-active calls to [transformer.classifyPrimary].
   ///
   /// This is used to determine whether [this] is dirty.
-  var _activeIsPrimaries = 0;
+  var _activeClassifications = 0;
 
   /// How far along [this] is in processing its assets.
   NodeStatus get status {
-    if (_activeIsPrimaries > 0) return NodeStatus.RUNNING;
+    if (_activeClassifications > 0) return NodeStatus.RUNNING;
     return NodeStatus.dirtiest(
         _transforms.values.map((transform) => transform.status));
   }
 
-  TransformerClassifier(this._phase, this.transformer, this._location);
+  TransformerClassifier(this._phase, transformer, this._location)
+      : transformer = transformer is AggregateTransformer ?
+            transformer : new WrappingAggregateTransformer(transformer);
 
   /// Adds a new asset as an input for this transformer.
   void addInput(AssetNode input) {
-    _activeIsPrimaries++;
-    syncFuture(() => transformer.isPrimary(input.id)).catchError(
+    _activeClassifications++;
+    syncFuture(() => transformer.classifyPrimary(input.id)).catchError(
         (error, stackTrace) {
       if (input.state.isRemoved) return false;
 
@@ -77,18 +80,19 @@
       _phase.cascade.reportError(error);
 
       return false;
-    }).then((isPrimary) {
+    }).then((key) {
       if (input.state.isRemoved) return;
-      if (!isPrimary) {
+      if (key == null) {
         var forwarder = new AssetForwarder(input);
         _passThroughForwarders.add(forwarder);
         forwarder.node.whenRemoved(
             () => _passThroughForwarders.remove(forwarder));
         _streams.onAssetController.add(forwarder.node);
+      } else if (_transforms.containsKey(key)) {
+        _transforms[key].addPrimary(input);
       } else {
-        var transform = new TransformNode(
-            _phase, transformer, input, _location);
-        _transforms[input.id.path] = transform;
+        var transform = new TransformNode(_phase, transformer, key, _location);
+        _transforms[key] = transform;
 
         transform.onStatusChange.listen(
             (_) => _streams.changeStatus(status),
@@ -96,9 +100,10 @@
 
         _streams.onAssetPool.add(transform.onAsset);
         _streams.onLogPool.add(transform.onLog);
+        transform.addPrimary(input);
       }
     }).whenComplete(() {
-      _activeIsPrimaries--;
+      _activeClassifications--;
       if (!_streams.isClosed) _streams.changeStatus(status);
     });
   }
diff --git a/pkg/barback/lib/src/transformer/aggregate_transform.dart b/pkg/barback/lib/src/transformer/aggregate_transform.dart
new file mode 100644
index 0000000..27491fb
--- /dev/null
+++ b/pkg/barback/lib/src/transformer/aggregate_transform.dart
@@ -0,0 +1,152 @@
+// 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 barback.transformer.aggregate_transform;
+
+import 'dart:async';
+import 'dart:convert';
+
+import '../asset/asset.dart';
+import '../asset/asset_id.dart';
+import '../asset/asset_set.dart';
+import '../errors.dart';
+import '../graph/transform_node.dart';
+import '../utils.dart';
+import 'base_transform.dart';
+
+/// A transform for [AggregateTransformer]s that provides access to all of their
+/// primary inputs.
+class AggregateTransform extends BaseTransform {
+  final TransformNode _node;
+
+  /// The set of outputs emitted by the transformer.
+  final _outputs = new AssetSet();
+
+  /// The transform key.
+  ///
+  /// This is the key returned by [AggregateTransformer.classifyPrimary] for all
+  /// the assets in this transform.
+  String get key => _node.key;
+
+  /// The stream of primary inputs that will be processed by this transform.
+  ///
+  /// This is exposed as a stream so that the transformer can start working
+  /// before all its inputs are available. The stream is closed not just when
+  /// all inputs are provided, but when barback is confident no more inputs will
+  /// be forthcoming.
+  ///
+  /// A transformer may complete its `apply` method before this stream is
+  /// closed. For example, it may know that each key will only have two inputs
+  /// associated with it, and so use `transform.primaryInputs.take(2)` to access
+  /// only those inputs.
+  Stream<Asset> get primaryInputs => _primaryInputs;
+  Stream<Asset> _primaryInputs;
+
+  /// The controller for [primaryInputs].
+  ///
+  /// This is a broadcast controller so that the transform can keep
+  /// [_emittedPrimaryInputs] up to date.
+  final _inputController = new StreamController<Asset>.broadcast();
+
+  /// The set of all primary inputs that have been emitted by [primaryInputs].
+  final _emittedPrimaryInputs = new AssetSet();
+
+  AggregateTransform._(TransformNode node)
+      : _node = node,
+        super(node) {
+    _inputController.stream.listen(_emittedPrimaryInputs.add);
+    // [primaryInputs] should be a non-broadcast stream.
+    _primaryInputs = broadcastToSingleSubscription(_inputController.stream);
+  }
+
+  /// Gets the asset for an input [id].
+  ///
+  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
+  Future<Asset> getInput(AssetId id) {
+    if (_emittedPrimaryInputs.containsId(id)) {
+      return syncFuture(() => _emittedPrimaryInputs[id]);
+    } else {
+      return _node.getInput(id);
+    }
+  }
+
+  /// A convenience method to the contents of the input with [id] as a string.
+  ///
+  /// This is equivalent to calling [getInput] followed by [Asset.readAsString].
+  ///
+  /// If the asset was created from a [String] the original string is always
+  /// returned and [encoding] is ignored. Otherwise, the binary data of the
+  /// asset is decoded using [encoding], which defaults to [UTF8].
+  ///
+  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
+  Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
+    if (encoding == null) encoding = UTF8;
+    return getInput(id).then((input) => input.readAsString(encoding: encoding));
+  }
+
+  /// A convenience method to the contents of the input with [id].
+  ///
+  /// This is equivalent to calling [getInput] followed by [Asset.read].
+  ///
+  /// If the asset was created from a [String], this returns its UTF-8 encoding.
+  ///
+  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
+  Stream<List<int>> readInput(AssetId id) =>
+      futureStream(getInput(id).then((input) => input.read()));
+
+  /// A convenience method to return whether or not an asset exists.
+  ///
+  /// This is equivalent to calling [getInput] and catching an
+  /// [AssetNotFoundException].
+  Future<bool> hasInput(AssetId id) {
+    return getInput(id).then((_) => true).catchError((error) {
+      if (error is AssetNotFoundException && error.id == id) return false;
+      throw error;
+    });
+  }
+
+  /// Stores [output] as the output created by this transformation.
+  ///
+  /// A transformation can output as many assets as it wants.
+  void addOutput(Asset output) {
+    // TODO(rnystrom): This should immediately throw if an output with that ID
+    // has already been created by this transformer.
+    _outputs.add(output);
+  }
+
+  void consumePrimary(AssetId id) {
+    if (!_emittedPrimaryInputs.containsId(id)) {
+      throw new StateError(
+          "$id can't be consumed because it's not a primary input.");
+    }
+
+    super.consumePrimary(id);
+  }
+}
+
+/// The controller for [AggregateTransform].
+class AggregateTransformController extends BaseTransformController {
+  AggregateTransform get transform => super.transform;
+
+  /// The set of assets that the transformer has emitted.
+  AssetSet get outputs => transform._outputs;
+
+  bool get isDone => transform._inputController.isClosed;
+
+  AggregateTransformController(TransformNode node)
+      : super(new AggregateTransform._(node));
+
+  /// Adds a primary input asset to the [AggregateTransform.primaryInputs]
+  /// stream.
+  void addInput(Asset input) => transform._inputController.add(input);
+
+  /// Returns whether an input with the given [id] was added via [addInput].
+  bool addedId(AssetId id) {
+    return transform._emittedPrimaryInputs.ids.contains(id);
+  }
+
+  void done() {
+    transform._inputController.close();
+  }
+}
diff --git a/pkg/barback/lib/src/transformer/aggregate_transformer.dart b/pkg/barback/lib/src/transformer/aggregate_transformer.dart
new file mode 100644
index 0000000..6873e99
--- /dev/null
+++ b/pkg/barback/lib/src/transformer/aggregate_transformer.dart
@@ -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.
+
+library barback.transformer.aggregate_transformer;
+
+import '../asset/asset_id.dart';
+import 'aggregate_transform.dart';
+
+/// An alternate interface for transformers that want to perform aggregate
+/// transformations on multiple inputs without any individual one of them being
+/// considered "primary".
+///
+/// This is useful for transformers like image spriting, where all the images in
+/// a directory need to be combined into a single image. A normal [Transformer]
+/// can't do this gracefully since when it's running on a single image, it has
+/// no way of knowing what other images exist to request as secondary inputs.
+///
+/// Aggregate transformers work by classifying assets into different groups
+/// based on their ids in [classifyPrimary]. Then [apply] is run once for each
+/// group. For example, a spriting transformer might put each image asset into a
+/// group identified by its directory name. All images in a given directory will
+/// end up in the same group, and they'll all be passed to one [apply] call.
+///
+/// If possible, aggregate transformers should implement
+/// [DeclaringAggregateTransformer] as well to help barback optimize the package
+/// graph.
+abstract class AggregateTransformer {
+  /// Classifies an asset id by returning a key identifying which group the
+  /// asset should be placed in.
+  ///
+  /// All assets for which [classifyPrimary] returns the same key are passed
+  /// together to the same [apply] call.
+  ///
+  /// This may return [Future<String>] or, if it's entirely synchronous,
+  /// [String]. Any string can be used to classify an asset. If possible,
+  /// though, this should return a path-like string to aid in logging.
+  ///
+  /// A return value of `null` indicates that the transformer is not interested
+  /// in an asset. Assets with a key of `null` will not be passed to any [apply]
+  /// call; this is equivalent to [Transformer.isPrimary] returning `false`.
+  classifyPrimary(AssetId id);
+
+  /// Runs this transformer on a group of primary inputs specified by
+  /// [transform].
+  ///
+  /// If this does asynchronous work, it should return a [Future] that completes
+  /// once it's finished.
+  ///
+  /// This may complete before [AggregateTransform.primarInputs] is closed. For
+  /// example, it may know that each key will only have two inputs associated
+  /// with it, and so use `transform.primaryInputs.take(2)` to access only those
+  /// inputs.
+  apply(AggregateTransform transform);
+
+  String toString() => runtimeType.toString().replaceAll("Transformer", "");
+}
diff --git a/pkg/barback/lib/src/transformer/base_transform.dart b/pkg/barback/lib/src/transformer/base_transform.dart
index 0672047..f76a6a4 100644
--- a/pkg/barback/lib/src/transformer/base_transform.dart
+++ b/pkg/barback/lib/src/transformer/base_transform.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async';
 
+import '../asset/asset_id.dart';
 import '../graph/transform_node.dart';
 import '../log.dart';
 import 'transform_logger.dart';
@@ -18,10 +19,10 @@
 abstract class BaseTransform {
   final TransformNode _node;
 
-  /// Whether the primary input should be consumed.
+  /// The ids of primary inputs that should be consumed.
   ///
-  /// This is exposed via [BaseTransformController].
-  bool _consumePrimary = false;
+  /// This is exposed by [BaseTransformController].
+  final _consumedPrimaries = new Set<AssetId>();
 
   /// Whether the transformer logged an error.
   ///
@@ -46,21 +47,23 @@
       if (level == LogLevel.ERROR) _loggedError = true;
 
       // If the log isn't already associated with an asset, use the primary.
-      if (asset == null) asset = _node.primary.id;
+      if (asset == null) asset = _node.info.primaryId;
       var entry = new LogEntry(_node.info, asset, level, message, span);
       _onLogController.add(entry);
     });
   }
 
-  /// Consume the primary input so that it doesn't get processed by future
+  /// Consume a primary input so that it doesn't get processed by future
   /// phases or emitted once processing has finished.
   ///
-  /// Normally the primary input will automatically be forwarded unless the
+  /// Normally each primary input will automatically be forwarded unless the
   /// transformer overwrites it by emitting an input with the same id. This
-  /// allows the transformer to tell barback not to forward the primary input
+  /// allows the transformer to tell barback not to forward a primary input
   /// even if it's not overwritten.
-  void consumePrimary() {
-    _consumePrimary = true;
+  void consumePrimary(AssetId id) {
+    // TODO(nweiz): throw an error if an id is consumed that wasn't listed as a
+    // primary input.
+    _consumedPrimaries.add(id);
   }
 }
 
@@ -72,8 +75,8 @@
   /// The [BaseTransform] controlled by this controller.
   final BaseTransform transform;
 
-  /// Whether the primary input should be consumed.
-  bool get consumePrimary => transform._consumePrimary;
+  /// The ids of primary inputs that should be consumed.
+  Set<AssetId> get consumedPrimaries => transform._consumedPrimaries;
 
   /// Whether the transform logged an error.
   bool get loggedError => transform._loggedError;
@@ -81,14 +84,29 @@
   /// The stream of log entries emitted by the transformer during a run.
   Stream<LogEntry> get onLog => transform._onLogController.stream;
 
+  /// Whether the transform's input or id stream has been closed.
+  ///
+  /// See also [done].
+  bool get isDone;
+
   BaseTransformController(this.transform);
 
-  /// Notifies the [BaseTransform] that the transformation has finished being
-  /// applied.
+  /// Mark this transform as finished emitting new inputs or input ids.
+  ///
+  /// This is distinct from [cancel] in that it *doesn't* indicate that the
+  /// transform is finished being used entirely. The transformer may still log
+  /// messages and load secondary inputs. This just indicates that all the
+  /// primary inputs are accounted for.
+  void done();
+
+  /// Mark this transform as canceled.
   ///
   /// This will close any streams and release any resources that were allocated
-  /// for the duration of the transformation.
-  void close() {
+  /// for the duration of the transformation. Unlike [done], this indicates that
+  /// the transformation is no longer relevant; either it has returned, or
+  /// something external has preemptively invalidated its results.
+  void cancel() {
+    done();
     transform._onLogController.close();
   }
 }
diff --git a/pkg/barback/lib/src/transformer/declaring_aggregate_transform.dart b/pkg/barback/lib/src/transformer/declaring_aggregate_transform.dart
new file mode 100644
index 0000000..5eada09
--- /dev/null
+++ b/pkg/barback/lib/src/transformer/declaring_aggregate_transform.dart
@@ -0,0 +1,101 @@
+// 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 barback.transformer.declaring_aggregate_transform;
+
+import 'dart:async';
+
+import '../asset/asset_id.dart';
+import '../graph/transform_node.dart';
+import '../utils.dart';
+import 'base_transform.dart';
+
+/// A transform for [DeclaringAggregateTransformer]s that allows them to declare
+/// the ids of the outputs they'll generate without generating the concrete
+/// bodies of those outputs.
+class DeclaringAggregateTransform extends BaseTransform {
+  /// The set of output ids declared by the transformer.
+  final _outputIds = new Set<AssetId>();
+
+  /// The transform key.
+  ///
+  /// This is the key returned by [AggregateTransformer.classifyPrimary] for all
+  /// the assets in this transform.
+  final String key;
+
+  /// The stream of primary input ids that have been aggregated for this
+  /// transform.
+  ///
+  /// This is exposed as a stream so that the transformer can start working
+  /// before all its input ids are available. The stream is closed not just when
+  /// all inputs are provided, but when barback is confident no more inputs will
+  /// be forthcoming.
+  ///
+  /// A transformer may complete its `declareOutputs` method before this stream
+  /// is closed. For example, it may know that each key will only have two
+  /// inputs associated with it, and so use `transform.primaryIds.take(2)` to
+  /// access only those inputs' ids.
+  Stream<AssetId> get primaryIds => _primaryIds;
+  Stream<AssetId> _primaryIds;
+
+  /// The controller for [primaryIds].
+  ///
+  /// This is a broadcast controller so that the transform can keep
+  /// [_emittedPrimaryIds] up to date.
+  final _idController = new StreamController<AssetId>.broadcast();
+
+  /// The set of all primary input ids that have been emitted by [primaryIds].
+  final _emittedPrimaryIds = new Set<AssetId>();
+
+  DeclaringAggregateTransform._(TransformNode node)
+      : key = node.key,
+        super(node) {
+    _idController.stream.listen(_emittedPrimaryIds.add);
+    // [primaryIds] should be a non-broadcast stream.
+    _primaryIds = broadcastToSingleSubscription(_idController.stream);
+  }
+
+  /// Stores [id] as the id of an output that will be created by this
+  /// transformation when it's run.
+  ///
+  /// A transformation can declare as many assets as it wants. If
+  /// [DeclaringTransformer.declareOutputs] declares a given asset id for a
+  /// given input, [Transformer.apply] should emit the corresponding asset as
+  /// well.
+  void declareOutput(AssetId id) {
+    // TODO(nweiz): This should immediately throw if an output with that ID
+    // has already been declared by this transformer.
+    _outputIds.add(id);
+  }
+
+  void consumePrimary(AssetId id) {
+    if (!_emittedPrimaryIds.contains(id)) {
+      throw new StateError(
+          "$id can't be consumed because it's not a primary input.");
+    }
+
+    super.consumePrimary(id);
+  }
+}
+
+/// The controller for [DeclaringAggregateTransform].
+class DeclaringAggregateTransformController extends BaseTransformController {
+  DeclaringAggregateTransform get transform => super.transform;
+
+  /// The set of ids that the transformer declares it will emit.
+  Set<AssetId> get outputIds => transform._outputIds;
+
+  bool get isDone => transform._idController.isClosed;
+
+  DeclaringAggregateTransformController(TransformNode node)
+      : super(new DeclaringAggregateTransform._(node));
+
+  /// Adds a primary input id to the [DeclaringAggregateTransform.primaryIds]
+  /// stream.
+  void addId(AssetId id) => transform._idController.add(id);
+
+  void done() {
+    transform._idController.close();
+  }
+}
diff --git a/pkg/barback/lib/src/transformer/declaring_aggregate_transformer.dart b/pkg/barback/lib/src/transformer/declaring_aggregate_transformer.dart
new file mode 100644
index 0000000..cef8711
--- /dev/null
+++ b/pkg/barback/lib/src/transformer/declaring_aggregate_transformer.dart
@@ -0,0 +1,31 @@
+// 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 barback.transformer.declaring_aggregate_transformer;
+
+import 'declaring_aggregate_transform.dart';
+
+/// An interface for [Transformer]s that can cheaply figure out which assets
+/// they'll emit without doing the work of actually creating those assets.
+///
+/// If a transformer implements this interface, that allows barback to perform
+/// optimizations to make the asset graph work more smoothly.
+abstract class DeclaringAggregateTransformer {
+  /// Declare which assets would be emitted for the primary input ids specified
+  /// by [transform].
+  ///
+  /// This works a little like [AggregateTransformer.apply], with two main
+  /// differences. First, instead of having access to the primary inputs'
+  /// contents, it only has access to their ids. Second, instead of emitting
+  /// [Asset]s, it just emits [AssetId]s through [transform.addOutputId].
+  ///
+  /// If this does asynchronous work, it should return a [Future] that completes
+  /// once it's finished.
+  ///
+  /// This may complete before [DeclaringAggregateTransform.primaryIds] stream
+  /// is closed. For example, it may know that each key will only have two
+  /// inputs associated with it, and so use `transform.primaryIds.take(2)` to
+  /// access only those inputs' ids.
+  declareOutputs(DeclaringAggregateTransform transform);
+}
diff --git a/pkg/barback/lib/src/transformer/declaring_transform.dart b/pkg/barback/lib/src/transformer/declaring_transform.dart
index e15082f..7dff33a 100644
--- a/pkg/barback/lib/src/transformer/declaring_transform.dart
+++ b/pkg/barback/lib/src/transformer/declaring_transform.dart
@@ -4,21 +4,45 @@
 
 library barback.transformer.declaring_transform;
 
-import '../asset/asset_id.dart';
-import '../graph/transform_node.dart';
-import 'base_transform.dart';
+import 'dart:async';
 
-/// A transform for [DeclaringTransform]ers that allows them to declare the ids
+import '../asset/asset_id.dart';
+import 'declaring_aggregate_transform.dart';
+import 'transform_logger.dart';
+
+/// Creates a new [DeclaringTransform] wrapping an
+/// [AggregateDeclaringTransform].
+///
+/// Although barback internally works in terms of
+/// [DeclaringAggregateTransformer]s, most transformers only work on individual
+/// primary inputs in isolation. We want to allow those transformers to
+/// implement the more user-friendly [DeclaringTransformer] interface which
+/// takes the more user-friendly [DeclaringTransform] object. This method wraps
+/// the more general [DeclaringAggregateTransform] to return a
+/// [DeclaringTransform] instead.
+Future<DeclaringTransform> newDeclaringTransform(
+    DeclaringAggregateTransform aggregate) {
+  // A wrapped [Transformer] will assign each primary input a unique transform
+  // key, so we can safely get the first asset emitted. We don't want to wait
+  // for the stream to close, since that requires barback to prove that no more
+  // new assets will be generated.
+  return aggregate.primaryIds.first.then((primaryId) => 
+      new DeclaringTransform._(aggregate, primaryId));
+}
+
+/// A transform for [DeclaringTransformer]s that allows them to declare the ids
 /// of the outputs they'll generate without generating the concrete bodies of
 /// those outputs.
-class DeclaringTransform extends BaseTransform {
-  final _outputIds = new Set<AssetId>();
+class DeclaringTransform {
+  /// The underlying aggregate transform.
+  final DeclaringAggregateTransform _aggregate;
 
   final AssetId primaryId;
 
-  DeclaringTransform._(TransformNode node)
-      : primaryId = node.primary.id,
-        super(node);
+  /// A logger so that the [Transformer] can report build details.
+  TransformLogger get logger => _aggregate.logger;
+
+  DeclaringTransform._(this._aggregate, this.primaryId);
 
   /// Stores [id] as the id of an output that will be created by this
   /// transformation when it's run.
@@ -27,21 +51,14 @@
   /// [DeclaringTransformer.declareOutputs] declareds a given asset id for a
   /// given input, [Transformer.apply] should emit the corresponding asset as
   /// well.
-  void declareOutput(AssetId id) {
-    // TODO(nweiz): This should immediately throw if an output with that ID
-    // has already been declared by this transformer.
-    _outputIds.add(id);
-  }
-}
+  void declareOutput(AssetId id) => _aggregate.declareOutput(id);
 
-/// The controller for [DeclaringTransform].
-class DeclaringTransformController extends BaseTransformController {
-  DeclaringTransform get transform => super.transform;
-
-  /// The set of ids that the transformer declares it will emit for the given
-  /// primary input.
-  Set<AssetId> get outputIds => transform._outputIds;
-
-  DeclaringTransformController(TransformNode node)
-      : super(new DeclaringTransform._(node));
+  /// Consume the primary input so that it doesn't get processed by future
+  /// phases or emitted once processing has finished.
+  ///
+  /// Normally the primary input will automatically be forwarded unless the
+  /// transformer overwrites it by emitting an input with the same id. This
+  /// allows the transformer to tell barback not to forward the primary input
+  /// even if it's not overwritten.
+  void consumePrimary() => _aggregate.consumePrimary(primaryId);
 }
diff --git a/pkg/barback/lib/src/transformer/lazy_aggregate_transformer.dart b/pkg/barback/lib/src/transformer/lazy_aggregate_transformer.dart
new file mode 100644
index 0000000..891fc1e
--- /dev/null
+++ b/pkg/barback/lib/src/transformer/lazy_aggregate_transformer.dart
@@ -0,0 +1,16 @@
+// 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 barback.transformer.lazy_aggregate_transformer;
+
+import 'declaring_aggregate_transformer.dart';
+
+/// An interface for [AggregateTransformer]s that indicates that the
+/// transformer's outputs shouldn't be generated until requested.
+///
+/// The [declareOutputs] method is used to figure out which assets should be
+/// treated as "lazy." Lazy assets will only be forced to be generated if
+/// they're requested by the user or if they're used by a non-declaring
+/// transformer.
+abstract class LazyAggregateTransformer extends DeclaringAggregateTransformer {}
diff --git a/pkg/barback/lib/src/transformer/transform.dart b/pkg/barback/lib/src/transformer/transform.dart
index 809cd12..7991a82 100644
--- a/pkg/barback/lib/src/transformer/transform.dart
+++ b/pkg/barback/lib/src/transformer/transform.dart
@@ -9,11 +9,25 @@
 
 import '../asset/asset.dart';
 import '../asset/asset_id.dart';
-import '../asset/asset_set.dart';
 import '../errors.dart';
-import '../graph/transform_node.dart';
-import '../utils.dart';
-import 'base_transform.dart';
+import 'aggregate_transform.dart';
+import 'transform_logger.dart';
+
+/// Creates a new [Transform] wrapping an [AggregateTransform].
+///
+/// Although barback internally works in terms of [AggregateTransformer]s, most
+/// transformers only work on individual primary inputs in isolation. We want to
+/// allow those transformers to implement the more user-friendly [Transformer]
+/// interface which takes the more user-friendly [Transform] object. This method
+/// wraps the more general [AggregateTransform] to return a [Transform] instead.
+Future<Transform> newTransform(AggregateTransform aggregate) {
+  // A wrapped [Transformer] will assign each primary input a unique transform
+  // key, so we can safely get the first asset emitted. We don't want to wait
+  // for the stream to close, since that requires barback to prove that no more
+  // new assets will be generated.
+  return aggregate.primaryInputs.first.then((primaryInput) =>
+      new Transform._(aggregate, primaryInput));
+}
 
 /// While a [Transformer] represents a *kind* of transformation, this defines
 /// one specific usage of it on a set of files.
@@ -22,10 +36,9 @@
 /// facilitate communication between the [Transformer] and the code hosting
 /// the transformation. It lets the [Transformer] access inputs and generate
 /// outputs.
-class Transform extends BaseTransform {
-  final TransformNode _node;
-
-  final _outputs = new AssetSet();
+class Transform {
+  /// The underlying aggregate transform.
+  final AggregateTransform _aggregate;
 
   /// Gets the primary input asset.
   ///
@@ -36,31 +49,17 @@
   /// For example, with a dart2js transform, the primary input would be the
   /// entrypoint Dart file. All of the other Dart files that that imports
   /// would be secondary inputs.
-  ///
-  /// This method may fail at runtime with an [AssetNotFoundException] if called
-  /// asynchronously after the transform begins running. The primary input may
-  /// become unavailable while this transformer is running due to asset changes
-  /// earlier in the graph. You can ignore the error if this happens: the
-  /// transformer will be re-run automatically for you.
-  Asset get primaryInput {
-    if (!_node.primary.state.isAvailable) {
-      throw new AssetNotFoundException(_node.primary.id);
-    }
+  final Asset primaryInput;
 
-    return _node.primary.asset;
-  }
+  /// A logger so that the [Transformer] can report build details.
+  TransformLogger get logger => _aggregate.logger;
 
-  Transform._(TransformNode node)
-    : _node = node,
-      super(node);
+  Transform._(this._aggregate, this.primaryInput);
 
   /// Gets the asset for an input [id].
   ///
   /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
-  Future<Asset> getInput(AssetId id) {
-    if (id == _node.primary.id) return syncFuture(() => primaryInput);
-    return _node.getInput(id);
-  }
+  Future<Asset> getInput(AssetId id) => _aggregate.getInput(id);
 
   /// A convenience method to the contents of the input with [id] as a string.
   ///
@@ -71,10 +70,8 @@
   /// asset is decoded using [encoding], which defaults to [UTF8].
   ///
   /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
-  Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
-    if (encoding == null) encoding = UTF8;
-    return getInput(id).then((input) => input.readAsString(encoding: encoding));
-  }
+  Future<String> readInputAsString(AssetId id, {Encoding encoding}) =>
+      _aggregate.readInputAsString(id, encoding: encoding);
 
   /// A convenience method to the contents of the input with [id].
   ///
@@ -83,37 +80,25 @@
   /// If the asset was created from a [String], this returns its UTF-8 encoding.
   ///
   /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
-  Stream<List<int>> readInput(AssetId id) =>
-      futureStream(getInput(id).then((input) => input.read()));
+  Stream<List<int>> readInput(AssetId id) => _aggregate.readInput(id);
 
   /// A convenience method to return whether or not an asset exists.
   ///
   /// This is equivalent to calling [getInput] and catching an
   /// [AssetNotFoundException].
-  Future<bool> hasInput(AssetId id) {
-    return getInput(id).then((_) => true).catchError((error) {
-      if (error is AssetNotFoundException && error.id == id) return false;
-      throw error;
-    });
-  }
+  Future<bool> hasInput(AssetId id) => _aggregate.hasInput(id);
 
   /// Stores [output] as the output created by this transformation.
   ///
   /// A transformation can output as many assets as it wants.
-  void addOutput(Asset output) {
-    // TODO(rnystrom): This should immediately throw if an output with that ID
-    // has already been created by this transformer.
-    _outputs.add(output);
-  }
-}
+  void addOutput(Asset output) => _aggregate.addOutput(output);
 
-/// The controller for [Transform].
-class TransformController extends BaseTransformController {
-  Transform get transform => super.transform;
-
-  /// The set of assets that the transformer has emitted.
-  AssetSet get outputs => transform._outputs;
-
-  TransformController(TransformNode node)
-      : super(new Transform._(node));
+  /// Consume the primary input so that it doesn't get processed by future
+  /// phases or emitted once processing has finished.
+  ///
+  /// Normally the primary input will automatically be forwarded unless the
+  /// transformer overwrites it by emitting an input with the same id. This
+  /// allows the transformer to tell barback not to forward the primary input
+  /// even if it's not overwritten.
+  void consumePrimary() => _aggregate.consumePrimary(primaryInput.id);
 }
diff --git a/pkg/barback/lib/src/transformer/transformer.dart b/pkg/barback/lib/src/transformer/transformer.dart
index efacf76..b40d61d 100644
--- a/pkg/barback/lib/src/transformer/transformer.dart
+++ b/pkg/barback/lib/src/transformer/transformer.dart
@@ -73,7 +73,7 @@
     return false;
   }
 
-  /// Run this transformer on on the primary input specified by [transform].
+  /// Run this transformer on the primary input specified by [transform].
   ///
   /// The [transform] is used by the [Transformer] for two purposes (in
   /// addition to accessing the primary input). It can call `getInput()` to
diff --git a/pkg/barback/lib/src/transformer/wrapping_aggregate_transformer.dart b/pkg/barback/lib/src/transformer/wrapping_aggregate_transformer.dart
new file mode 100644
index 0000000..f41d075
--- /dev/null
+++ b/pkg/barback/lib/src/transformer/wrapping_aggregate_transformer.dart
@@ -0,0 +1,84 @@
+// 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 barback.transformer.wrapping_aggregate_transformer;
+
+import 'dart:async';
+
+import '../asset/asset_id.dart';
+import '../utils.dart';
+import 'aggregate_transform.dart';
+import 'aggregate_transformer.dart';
+import 'declaring_aggregate_transform.dart';
+import 'declaring_aggregate_transformer.dart';
+import 'declaring_transform.dart';
+import 'declaring_transformer.dart';
+import 'lazy_aggregate_transformer.dart';
+import 'lazy_transformer.dart';
+import 'transform.dart';
+import 'transformer.dart';
+
+/// An [AggregateTransformer] that wraps a non-aggregate [Transformer].
+///
+/// Although barback internally works in terms of [AggregateTransformer]s, most
+/// transformers only work on individual primary inputs in isolation. We want to
+/// allow those transformers to implement the more user-friendly [Transformer]
+/// interface. This class makes that possible.
+class WrappingAggregateTransformer implements AggregateTransformer {
+  /// The wrapped transformer.
+  final Transformer transformer;
+
+  factory WrappingAggregateTransformer(Transformer transformer) {
+    if (transformer is LazyTransformer) {
+      return new _LazyWrappingAggregateTransformer(
+          transformer as LazyTransformer);
+    } else if (transformer is DeclaringTransformer) {
+      return new _DeclaringWrappingAggregateTransformer(
+          transformer as DeclaringTransformer);
+    } else {
+      return new WrappingAggregateTransformer._(transformer);
+    }
+  }
+
+  WrappingAggregateTransformer._(this.transformer);
+
+  Future<String> classifyPrimary(AssetId id) {
+    return syncFuture(() => transformer.isPrimary(id))
+        .then((isPrimary) => isPrimary ? id.path : null);
+  }
+
+  Future apply(AggregateTransform aggregateTransform) {
+    return newTransform(aggregateTransform)
+        .then((transform) => transformer.apply(transform));
+  }
+
+  String toString() => transformer.toString();
+}
+
+/// A wrapper for [DeclaringTransformer]s that implements
+/// [DeclaringAggregateTransformer].
+class _DeclaringWrappingAggregateTransformer
+    extends WrappingAggregateTransformer
+    implements DeclaringAggregateTransformer {
+  final DeclaringTransformer _declaring;
+
+  _DeclaringWrappingAggregateTransformer(DeclaringTransformer transformer)
+      : _declaring = transformer,
+        super._(transformer as Transformer);
+
+  Future declareOutputs(DeclaringAggregateTransform aggregateTransform) {
+    return newDeclaringTransform(aggregateTransform).then((transform) {
+      return (transformer as DeclaringTransformer).declareOutputs(transform);
+    });
+  }
+}
+
+/// A wrapper for [LazyTransformer]s that implements
+/// [LazyAggregateTransformer].
+class _LazyWrappingAggregateTransformer
+    extends _DeclaringWrappingAggregateTransformer
+    implements LazyAggregateTransformer {
+  _LazyWrappingAggregateTransformer(LazyTransformer transformer)
+      : super(transformer);
+}
diff --git a/pkg/barback/lib/src/utils.dart b/pkg/barback/lib/src/utils.dart
index d2ce049..d5a9fb62 100644
--- a/pkg/barback/lib/src/utils.dart
+++ b/pkg/barback/lib/src/utils.dart
@@ -308,3 +308,20 @@
       sync: true);
   return controller.stream;
 }
+
+/// Creates a single-subscription stream from a broadcast stream.
+///
+/// The returned stream will enqueue events from [broadcast] until a listener is
+/// attached, then pipe events to that listener.
+Stream broadcastToSingleSubscription(Stream broadcast) {
+  if (!broadcast.isBroadcast) return broadcast;
+
+  // TODO(nweiz): Implement this using a transformer when issues 18588 and 18586
+  // are fixed.
+  var subscription;
+  var controller = new StreamController(onCancel: () => subscription.cancel());
+  subscription = broadcast.listen(controller.add,
+      onError: controller.addError,
+      onDone: controller.close);
+  return controller.stream;
+}
diff --git a/pkg/barback/pubspec.yaml b/pkg/barback/pubspec.yaml
index 1776f83..1499cb8 100644
--- a/pkg/barback/pubspec.yaml
+++ b/pkg/barback/pubspec.yaml
@@ -5,10 +5,9 @@
 # to ensure users only select a version of barback that works with their current
 # version of pub.
 #
-# When the minor version of this is upgraded, you *must* update that version
-# number in pub to stay in sync with this. New patch versions are considered
-# backwards compatible, and pub will allow later patch versions automatically.
-version: 0.13.1-dev
+# 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.0+2
 
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
diff --git a/pkg/barback/test/asset_set_test.dart b/pkg/barback/test/asset_set_test.dart
index 3208329..f339d7e 100644
--- a/pkg/barback/test/asset_set_test.dart
+++ b/pkg/barback/test/asset_set_test.dart
@@ -146,4 +146,14 @@
       expect(set.removeId(barId), isNull);
     });
   });
+
+  group(".ids", () {
+    test("contains the ids of all the assets in the set", () {
+      var set = new AssetSet();
+      var foo = new Asset.fromString(fooId, "foo");
+      var bar = new Asset.fromString(barId, "bar");
+      set.addAll([foo, bar]);
+      expect(set.ids, unorderedEquals([fooId, barId]));
+    });
+  });
 }
diff --git a/pkg/barback/test/package_graph/declaring_transformer_test.dart b/pkg/barback/test/package_graph/declaring_transformer_test.dart
index dc180ae..9a8535f 100644
--- a/pkg/barback/test/package_graph/declaring_transformer_test.dart
+++ b/pkg/barback/test/package_graph/declaring_transformer_test.dart
@@ -191,14 +191,16 @@
       [declaring]
     ]});
 
-    // Start [declaring] running, because its input became available.
     declaring.pauseApply();
     updateSources(["app|foo.in"]);
     // Give the transformers time to declare their assets.
     schedule(pumpEventQueue);
 
+    // Start [declaring] running, because its input became available.
     expectAsset("app|out.one", "app|out.one");
-    expectAssetDoesNotComplete("app|out.three");
+
+    // Make sure we're blocking on [declaring.apply].
+    schedule(pumpEventQueue);
 
     // Now [declaring]'s input is dirty, so it shouldn't re-run without an
     // explicit request.
@@ -220,6 +222,42 @@
     expect(declaring.numRuns, completion(equals(2)));
   });
 
+  test("a declaring transformer following a lazy transformer does re-run if "
+      "its input becomes available, it's forced, and then its input becomes "
+      "unavailable", () {
+    var declaring = new DeclaringRewriteTransformer("two", "three");
+    initGraph(["app|foo.in"], {"app": [
+      [new LazyAssetsTransformer(["app|out.one", "app|out.two"])],
+      [declaring]
+    ]});
+
+    declaring.pauseApply();
+    updateSources(["app|foo.in"]);
+
+    // Give the transformers time to declare their assets.
+    schedule(pumpEventQueue);
+
+    // Start [declaring] running, because its input became available.
+    expectAsset("app|out.one", "app|out.one");
+
+    // This shouldn't complete because [declaring.apply] is paused, but it
+    // should force the transformer.
+    expectAssetDoesNotComplete("app|out.three");
+
+    // Make sure we're blocking on [declaring.apply]
+    schedule(pumpEventQueue);
+
+    // Now [declaring]'s input is dirty, so it shouldn't re-run without an
+    // explicit request.
+    updateSources(["app|foo.in"]);
+    declaring.resumeApply();
+    buildShouldSucceed();
+
+    // [declaring] should have run twice, once for its original input and once
+    // after the input changed because it was forced.
+    expect(declaring.numRuns, completion(equals(2)));
+  });
+
   group("with an error in declareOutputs", () {
     test("still runs apply", () {
       initGraph(["app|foo.txt"], {"app": [[
diff --git a/pkg/barback/test/package_graph/group_test.dart b/pkg/barback/test/package_graph/group_test.dart
index 468cb8c2..4e2cb44 100644
--- a/pkg/barback/test/package_graph/group_test.dart
+++ b/pkg/barback/test/package_graph/group_test.dart
@@ -449,4 +449,25 @@
     updateSources(["app|foo.a", "app|foo.x"]);
     buildShouldFail([isAssetCollisionException("app|foo.c")]);
   });
+
+  // Regression test for issue 18872.
+  test("a multi-phase group's outputs should be visible as secondary inputs "
+      "for a following group", () {
+    initGraph({
+      "app|foo.txt": "bar.c",
+      "app|bar.a": "bar"
+    }, {"app": [
+      [new TransformerGroup([
+        [new RewriteTransformer("a", "b")],
+        [new RewriteTransformer("b", "c")]
+      ])],
+      [new TransformerGroup([
+        [new ManyToOneTransformer("txt")]
+      ])]
+    ]});
+
+    updateSources(["app|foo.txt", "app|bar.a"]);
+    expectAsset("app|foo.out", "bar.b.c");
+    buildShouldSucceed();
+  });
 }
diff --git a/pkg/barback/test/package_graph/transform/concurrency_test.dart b/pkg/barback/test/package_graph/transform/concurrency_test.dart
index 3dd2da2..5b0d2e9 100644
--- a/pkg/barback/test/package_graph/transform/concurrency_test.dart
+++ b/pkg/barback/test/package_graph/transform/concurrency_test.dart
@@ -505,4 +505,38 @@
     expectAsset("app|foo.in", "foo");
     buildShouldSucceed();
   });
+
+  test("re-runs if the primary input is invalidated before accessing", () {
+    var transformer1 = new RewriteTransformer("txt", "mid");
+    var transformer2 = new RewriteTransformer("mid", "out");
+
+    initGraph([
+      "app|foo.txt"
+    ], {"app": [
+      [transformer1],
+      [transformer2]
+    ]});
+
+    transformer2.pausePrimaryInput();
+    updateSources(["app|foo.txt"]);
+
+    // Wait long enough to ensure that transformer1 has completed and
+    // transformer2 has started.
+    schedule(pumpEventQueue);
+
+    // Update the source again so that transformer1 invalidates the primary
+    // input of transformer2.
+    transformer1.pauseApply();
+    modifyAsset("app|foo.txt", "new foo");
+    updateSources(["app|foo.txt"]);
+
+    transformer2.resumePrimaryInput();
+    transformer1.resumeApply();
+
+    expectAsset("app|foo.out", "new foo.mid.out");
+    buildShouldSucceed();
+
+    expect(transformer1.numRuns, completion(equals(2)));
+    expect(transformer2.numRuns, completion(equals(2)));
+  });
 }
diff --git a/pkg/barback/test/package_graph/transform/cross_package_test.dart b/pkg/barback/test/package_graph/transform/cross_package_test.dart
index 6aaf585..b499604 100644
--- a/pkg/barback/test/package_graph/transform/cross_package_test.dart
+++ b/pkg/barback/test/package_graph/transform/cross_package_test.dart
@@ -190,37 +190,4 @@
     expectAsset("pkg1|a.out", "b");
     buildShouldSucceed();
   });
-
-  test("re-runs if the primary input is invalidated before accessing", () {
-    var transformer1 = new RewriteTransformer("txt", "mid");
-    var transformer2 = new RewriteTransformer("mid", "out");
-
-    initGraph([
-      "app|foo.txt"
-    ], {"app": [
-      [transformer1],
-      [transformer2]
-    ]});
-
-    transformer2.pausePrimaryInput();
-    updateSources(["app|foo.txt"]);
-
-    // Wait long enough to ensure that transformer1 has completed and
-    // transformer2 has started.
-    schedule(pumpEventQueue);
-
-    // Update the source again so that transformer1 invalidates the primary
-    // input of transformer2.
-    transformer1.pauseApply();
-    updateSources(["app|foo.txt"]);
-
-    transformer2.resumePrimaryInput();
-    transformer1.resumeApply();
-
-    expectAsset("app|foo.out", "foo.mid.out");
-    buildShouldSucceed();
-
-    expect(transformer1.numRuns, completion(equals(2)));
-    expect(transformer2.numRuns, completion(equals(2)));
-  });
 }
\ No newline at end of file
diff --git a/pkg/code_transformers/pubspec.yaml b/pkg/code_transformers/pubspec.yaml
index 497ff67..f8897b1 100644
--- a/pkg/code_transformers/pubspec.yaml
+++ b/pkg/code_transformers/pubspec.yaml
@@ -1,11 +1,11 @@
 name: code_transformers
-version: 0.1.3
+version: 0.1.3+1
 author: "Dart Team <misc@dartlang.org>"
 description: Collection of utilities related to creating barback transformers.
 homepage: http://www.dartlang.org
 dependencies:
   analyzer: ">=0.13.0 <0.14.0"
-  barback: ">=0.11.0 <0.14.0"
+  barback: ">=0.11.0 <0.15.0"
   path: ">=0.9.0 <2.0.0"
   source_maps: ">=0.9.0 <0.10.0"
 dev_dependencies:
diff --git a/pkg/csslib/lib/parser.dart b/pkg/csslib/lib/parser.dart
index 2539d94..272268b 100644
--- a/pkg/csslib/lib/parser.dart
+++ b/pkg/csslib/lib/parser.dart
@@ -30,6 +30,7 @@
       : super(tokenizer);
 }
 
+// TODO(jmesserly): this should not be global
 void _createMessages({List<Message> errors, List<String> options}) {
   if (errors == null) errors = [];
 
@@ -45,7 +46,7 @@
 
 // TODO(terry): Remove nested name parameter.
 /** Parse and analyze the CSS file. */
-StyleSheet compile(var input, {List<Message> errors, List<String> options,
+StyleSheet compile(input, {List<Message> errors, List<String> options,
     bool nested: true,
     bool polyfill: false,
     List<StyleSheet> includes: null}) {
@@ -85,13 +86,12 @@
  * or [List<int>] of bytes and returns a [StyleSheet] AST.  The optional
  * [errors] list will contain each error/warning as a [Message].
  */
-StyleSheet parse(var input, {List<Message> errors, List<String> options}) {
+StyleSheet parse(input, {List<Message> errors, List<String> options}) {
   var source = _inputAsString(input);
 
   _createMessages(errors: errors, options: options);
 
   var file = new SourceFile.text(null, source);
-
   return new _Parser(file, source).parse();
 }
 
@@ -100,17 +100,32 @@
  * or [List<int>] of bytes and returns a [StyleSheet] AST.  The optional
  * [errors] list will contain each error/warning as a [Message].
  */
-StyleSheet selector(var input, {List<Message> errors}) {
+// TODO(jmesserly): should rename "parseSelector" and return Selector
+StyleSheet selector(input, {List<Message> errors}) {
   var source = _inputAsString(input);
 
   _createMessages(errors: errors);
 
   var file = new SourceFile.text(null, source);
-
-  return new _Parser(file, source).parseSelector();
+  return (new _Parser(file, source)
+      ..tokenizer.inSelector = true)
+      .parseSelector();
 }
 
-String _inputAsString(var input) {
+SelectorGroup parseSelectorGroup(input, {List<Message> errors}) {
+  var source = _inputAsString(input);
+
+  _createMessages(errors: errors);
+
+  var file = new SourceFile.text(null, source);
+  return (new _Parser(file, source)
+      // TODO(jmesserly): this fix should be applied to the parser. It's tricky
+      // because by the time the flag is set one token has already been fetched.
+      ..tokenizer.inSelector = true)
+      .processSelectorGroup();
+}
+
+String _inputAsString(input) {
   String source;
 
   if (input is String) {
@@ -147,6 +162,7 @@
 class Parser {
   final _Parser _parser;
 
+  // TODO(jmesserly): having file and text is redundant.
   Parser(SourceFile file, String text, {int start: 0, String baseUrl}) :
     _parser = new _Parser(file, text, start: start, baseUrl: baseUrl);
 
@@ -1174,6 +1190,7 @@
   SelectorGroup processSelectorGroup() {
     List<Selector> selectors = [];
     int start = _peekToken.start;
+
     do {
       Selector selector = processSelector();
       if (selector != null) {
@@ -1413,18 +1430,32 @@
     }
 
     // Functional pseudo?
-    if (_maybeEat(TokenKind.LPAREN)) {
+
+    if (_peekToken.kind == TokenKind.LPAREN) {
+
       if (!pseudoElement && pseudoName.name.toLowerCase() == 'not') {
+        _eat(TokenKind.LPAREN);
+
         // Negation :   ':NOT(' S* negation_arg S* ')'
         var negArg = simpleSelector();
 
         _eat(TokenKind.RPAREN);
         return new NegationSelector(negArg, _makeSpan(start));
       } else {
+        // Special parsing for expressions in pseudo functions.  Minus is used
+        // as operator not identifier.
+        // TODO(jmesserly): we need to flip this before we eat the "(" as the
+        // next token will be fetched when we do that. I think we should try to
+        // refactor so we don't need this boolean; it seems fragile.
+        tokenizer.inSelectorExpression = true;
+        _eat(TokenKind.LPAREN);
+
         // Handle function expression.
         var span = _makeSpan(start);
         var expr = processSelectorExpression();
 
+        tokenizer.inSelectorExpression = false;
+
         // Used during selector look-a-head if not a SelectorExpression is
         // bad.
         if (expr is! SelectorExpression) {
@@ -1463,27 +1494,23 @@
   processSelectorExpression() {
     var start = _peekToken.start;
 
-    var expression = new SelectorExpression(_makeSpan(start));
+    var expressions = [];
 
     Token termToken;
     var value;
 
-    // Special parsing for expressions in pseudo functions.  Minus is used as
-    // operator not identifier.
-    tokenizer.selectorExpression = true;
-
     var keepParsing = true;
     while (keepParsing) {
       switch (_peek()) {
         case TokenKind.PLUS:
           start = _peekToken.start;
           termToken = _next();
-          expression.add(new OperatorPlus(_makeSpan(start)));
+          expressions.add(new OperatorPlus(_makeSpan(start)));
           break;
         case TokenKind.MINUS:
           start = _peekToken.start;
           termToken = _next();
-          expression.add(new OperatorMinus(_makeSpan(start)));
+          expressions.add(new OperatorMinus(_makeSpan(start)));
           break;
         case TokenKind.INTEGER:
           termToken = _next();
@@ -1517,15 +1544,13 @@
         if (unitTerm == null) {
           unitTerm = new LiteralTerm(value, value.name, _makeSpan(start));
         }
-        expression.add(unitTerm);
+        expressions.add(unitTerm);
 
         value = null;
       }
     }
 
-    tokenizer.selectorExpression = false;
-
-    return expression;
+    return new SelectorExpression(expressions, _makeSpan(start));
   }
 
   //  Attribute grammar:
@@ -2343,6 +2368,12 @@
 
     // URI term sucks up everything inside of quotes(' or ") or between parens
     var stopToken = urlString ? TokenKind.RPAREN : -1;
+
+    // Note: disable skipping whitespace tokens inside a string.
+    // TODO(jmesserly): the layering here feels wrong.
+    var skipWhitespace = tokenizer._skipWhitespace;
+    tokenizer._skipWhitespace = false;
+
     switch (_peek()) {
     case TokenKind.SINGLE_QUOTE:
       stopToken = TokenKind.SINGLE_QUOTE;
@@ -2369,20 +2400,20 @@
 
     // Gobble up everything until we hit our stop token.
     var runningStart = _peekToken.start;
+
+    var stringValue = new StringBuffer();
     while (_peek() != stopToken && _peek() != TokenKind.END_OF_FILE) {
-      var tok = _next();
+      stringValue.write(_next().text);
     }
 
-    // All characters between quotes is the string.
-    var end = _peekToken.end;
-    var stringValue = (_peekToken.span as FileSpan).file.getText(start,
-        end - 1);
+    tokenizer._skipWhitespace = skipWhitespace;
 
+    // All characters between quotes is the string.
     if (stopToken != TokenKind.RPAREN) {
       _next();    // Skip the SINGLE_QUOTE or DOUBLE_QUOTE;
     }
 
-    return stringValue;
+    return stringValue.toString();
   }
 
   // TODO(terry): Should probably understand IE's non-standard filter syntax to
diff --git a/pkg/csslib/lib/src/token.dart b/pkg/csslib/lib/src/token.dart
index cf9e376..7e70f88 100644
--- a/pkg/csslib/lib/src/token.dart
+++ b/pkg/csslib/lib/src/token.dart
@@ -51,3 +51,16 @@
   String message;
   ErrorToken(int kind, Span span, this.message) : super(kind, span);
 }
+
+/**
+ * CSS ident-token.
+ *
+ * See <http://dev.w3.org/csswg/css-syntax/#typedef-ident-token> and
+ * <http://dev.w3.org/csswg/css-syntax/#ident-token-diagram>.
+ */
+class IdentifierToken extends Token {
+  final String text;
+
+  IdentifierToken(this.text, int kind, Span span)
+      : super(kind, span);
+}
diff --git a/pkg/csslib/lib/src/tokenizer.dart b/pkg/csslib/lib/src/tokenizer.dart
index e3cdfdc..8d929ab 100644
--- a/pkg/csslib/lib/src/tokenizer.dart
+++ b/pkg/csslib/lib/src/tokenizer.dart
@@ -41,7 +41,7 @@
 
           _startIndex = _index;
           ch = _nextChar();
-          Token ident = this.finishIdentifier(ch);
+          Token ident = finishIdentifier();
 
           // Is it a directive?
           int tokId = TokenKind.matchDirectives(_text, _startIndex,
@@ -101,7 +101,7 @@
         if (maybeEatDigit()) return finishNumber();
         return _finishToken(TokenKind.PLUS);
       case TokenChar.MINUS:
-        if (selectorExpression || unicodeRange) {
+        if (inSelectorExpression || unicodeRange) {
           // If parsing in pseudo function expression then minus is an operator
           // not part of identifier e.g., interval value range (e.g. U+400-4ff)
           // or minus operator in selector expression.
@@ -109,7 +109,7 @@
         } else if (maybeEatDigit()) {
           return finishNumber();
         } else if (TokenizerHelpers.isIdentifierStart(ch)) {
-          return this.finishIdentifier(ch);
+          return finishIdentifier();
         }
         return _finishToken(TokenKind.MINUS);
       case TokenChar.GREATER:
@@ -127,6 +127,9 @@
       case TokenChar.AMPERSAND:
         return _finishToken(TokenKind.AMPERSAND);
       case TokenChar.NAMESPACE:
+        if (_maybeEatChar(TokenChar.EQUALS)) {
+          return _finishToken(TokenKind.DASH_MATCH);      // |=
+        }
         return _finishToken(TokenKind.NAMESPACE);
       case TokenChar.COLON:
         return _finishToken(TokenKind.COLON);
@@ -162,11 +165,6 @@
         return _finishToken(TokenKind.LESS);
       case TokenChar.EQUALS:
         return _finishToken(TokenKind.EQUALS);
-      case TokenChar.OR:
-        if (_maybeEatChar(TokenChar.EQUALS)) {
-          return _finishToken(TokenKind.DASH_MATCH);      // |=
-        }
-        return _finishToken(TokenKind.OR);
       case TokenChar.CARET:
         if (_maybeEatChar(TokenChar.EQUALS)) {
           return _finishToken(TokenKind.PREFIX_MATCH);    // ^=
@@ -178,11 +176,16 @@
         }
         return _finishToken(TokenKind.DOLLAR);
       case TokenChar.BANG:
-        Token tok = finishIdentifier(ch);
+        Token tok = finishIdentifier();
         return (tok == null) ? _finishToken(TokenKind.BANG) : tok;
-      case TokenChar.BACKSLASH:
-        return _finishToken(TokenKind.BACKSLASH);
       default:
+        // TODO(jmesserly): this is used for IE8 detection; I'm not sure it's
+        // appropriate outside of a few specific places; certainly shouldn't
+        // be parsed in selectors.
+        if (!inSelector && ch == TokenChar.BACKSLASH) {
+          return _finishToken(TokenKind.BACKSLASH);
+        }
+
         if (unicodeRange) {
           // Three types of unicode ranges:
           //   - single code point (e.g. U+416)
@@ -212,7 +215,7 @@
         } else if (varUsage(ch)) {
           return _finishToken(TokenKind.VAR_USAGE);
         } else if (TokenizerHelpers.isIdentifierStart(ch)) {
-          return finishIdentifier(ch);
+          return finishIdentifier();
         } else if (TokenizerHelpers.isDigit(ch)) {
           return finishNumber();
         }
@@ -236,7 +239,12 @@
 
   int getIdentifierKind() {
     // Is the identifier a unit type?
-    int tokId = TokenKind.matchUnits(_text, _startIndex, _index - _startIndex);
+    int tokId = -1;
+
+    // Don't match units in selectors or selector expressions.
+    if (!inSelectorExpression && !inSelector) {
+      tokId = TokenKind.matchUnits(_text, _startIndex, _index - _startIndex);
+    }
     if (tokId == -1) {
       tokId = (_text.substring(_startIndex, _index) == '!important') ?
           TokenKind.IMPORTANT : -1;
@@ -245,31 +253,59 @@
     return tokId >= 0 ? tokId : TokenKind.IDENTIFIER;
   }
 
-  // Need to override so CSS version of isIdentifierPart is used.
-  Token finishIdentifier(int ch) {
+  Token finishIdentifier() {
+    // If we encounter an escape sequence, remember it so we can post-process
+    // to unescape.
+    bool hasEscapedChars = false;
+    var chars = [];
+
+    // backup so we can start with the first character
+    int validateFrom = _index;
+    _index = _startIndex;
     while (_index < _text.length) {
-      // If parsing in pseudo function expression then minus is an operator
-      // not part of identifier.
-      var isIdentifier = selectorExpression
-          ? TokenizerHelpers.isIdentifierPartExpr(_text.codeUnitAt(_index))
-          : TokenizerHelpers.isIdentifierPart(_text.codeUnitAt(_index));
-      if (!isIdentifier) {
-          break;
+      int ch = _text.codeUnitAt(_index);
+
+      // If the previous character was "\" we need to escape. T
+      // http://www.w3.org/TR/CSS21/syndata.html#characters
+      // if followed by hexadecimal digits, create the appropriate character.
+      // otherwise, include the character in the identifier and don't treat it
+      // specially.
+      if (ch == 92/*\*/) {
+        int startHex = ++_index;
+        eatHexDigits(startHex + 6);
+        if (_index != startHex) {
+          // Parse the hex digits and add that character.
+          chars.add(int.parse('0x' + _text.substring(startHex, _index)));
+
+          if (_index == _text.length) break;
+
+          // if we stopped the hex because of a whitespace char, skip it
+          ch = _text.codeUnitAt(_index);
+          if (_index - startHex != 6 &&
+              (ch == TokenChar.SPACE || ch == TokenChar.TAB ||
+              ch == TokenChar.RETURN || ch == TokenChar.NEWLINE)) {
+            _index++;
+          }
+        } else {
+          // not a digit, just add the next character literally
+          if (_index == _text.length) break;
+          chars.add(_text.codeUnitAt(_index++));
+        }
+      } else if (_index < validateFrom || (inSelectorExpression
+          ? TokenizerHelpers.isIdentifierPartExpr(ch)
+          : TokenizerHelpers.isIdentifierPart(ch))) {
+        chars.add(ch);
+        _index++;
       } else {
-        _index += 1;
+        // Not an identifier or escaped character.
+        break;
       }
     }
 
-    int kind = getIdentifierKind();
-    if (kind == TokenKind.IDENTIFIER) {
-      return _finishToken(TokenKind.IDENTIFIER);
-    } else {
-      return _finishToken(kind);
-    }
-  }
+    var span = _file.span(_startIndex, _index);
+    var text = new String.fromCharCodes(chars);
 
-  Token finishImportant() {
-
+    return new IdentifierToken(text, getIdentifierKind(), span);
   }
 
   Token finishNumber() {
@@ -299,12 +335,13 @@
   }
 
   Token finishHexNumber() {
-    eatHexDigits();
+    eatHexDigits(_text.length);
     return _finishToken(TokenKind.HEX_INTEGER);
   }
 
-  void eatHexDigits() {
-    while (_index < _text.length) {
+  void eatHexDigits(int end) {
+    end = math.min(end, _text.length);
+    while (_index < end) {
      if (TokenizerHelpers.isHexDigit(_text.codeUnitAt(_index))) {
        _index += 1;
      } else {
@@ -399,7 +436,11 @@
   /** Pseudo function expressions identifiers can't have a minus sign. */
   static bool isIdentifierStartExpr(int c) {
     return ((c >= 97/*a*/ && c <= 122/*z*/) || (c >= 65/*A*/ && c <= 90/*Z*/) ||
-        c == 95/*_*/);
+        // Note: Unicode 10646 chars U+00A0 or higher are allowed, see:
+        // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+        // http://www.w3.org/TR/CSS21/syndata.html#characters
+        // Also, escaped character should be allowed.
+        c == 95/*_*/ || c >= 0xA0 || c == 92/*\*/);
   }
 
   /** Pseudo function expressions identifiers can't have a minus sign. */
diff --git a/pkg/csslib/lib/src/tokenizer_base.dart b/pkg/csslib/lib/src/tokenizer_base.dart
index f33a362..07dee48 100644
--- a/pkg/csslib/lib/src/tokenizer_base.dart
+++ b/pkg/csslib/lib/src/tokenizer_base.dart
@@ -9,12 +9,14 @@
 class TokenizerState {
   final int index;
   final int startIndex;
-  final bool selectorExpression;
+  final bool inSelectorExpression;
+  final bool inSelector;
 
   TokenizerState(TokenizerBase base) :
-      this.index = base._index,
-      this.startIndex = base._startIndex,
-      this.selectorExpression = base.selectorExpression;
+      index = base._index,
+      startIndex = base._startIndex,
+      inSelectorExpression = base.inSelectorExpression,
+      inSelector = base.inSelector;
 }
 
 /**
@@ -23,14 +25,32 @@
  */
 abstract class TokenizerBase {
   final SourceFile _file;
-  final bool _skipWhitespace;
   final String _text;
 
+  bool _skipWhitespace;
+
   /**
    * Changes tokenization when in a pseudo function expression.  If true then
    * minus signs are handled as operators instead of identifiers.
    */
-  bool selectorExpression = false;
+  bool inSelectorExpression = false;
+
+  /**
+   * Changes tokenization when in selectors. If true, it prevents identifiers
+   * from being treated as units. This would break things like ":lang(fr)" or
+   * the HTML (unknown) tag name "px", which is legal to use in a selector.
+   */
+  // TODO(jmesserly): is this a problem elsewhere? "fr" for example will be
+  // processed as a "fraction" unit token, preventing it from working in
+  // places where an identifier is expected. This was breaking selectors like:
+  //     :lang(fr)
+  // The assumption that "fr" always means fraction (and similar issue with
+  // other units) doesn't seem valid. We probably should defer this
+  // analysis until we reach places in the parser where units are expected.
+  // I'm not sure this is tokenizing as described in the specs:
+  //     http://dev.w3.org/csswg/css-syntax/
+  //     http://dev.w3.org/csswg/selectors4/
+  bool inSelector = false;
 
   int _index;
   int _startIndex;
@@ -51,7 +71,8 @@
   void restore(TokenizerState markedData) {
     _index = markedData.index;
     _startIndex = markedData.startIndex;
-    selectorExpression = markedData.selectorExpression;
+    inSelectorExpression = markedData.inSelectorExpression;
+    inSelector = markedData.inSelector;
   }
 
   int _nextChar() {
@@ -125,19 +146,6 @@
     return _finishToken(TokenKind.END_OF_FILE);
   }
 
-  Token finishSingleLineComment() {
-    while (true) {
-      int ch = _nextChar();
-      if (ch == 0 || ch == TokenChar.NEWLINE || ch == TokenChar.RETURN) {
-        if (_skipWhitespace) {
-          return next();
-        } else {
-          return _finishToken(TokenKind.COMMENT);
-        }
-      }
-    }
-  }
-
   Token finishMultiLineComment() {
     int nesting = 1;
     do {
@@ -426,20 +434,5 @@
       return _finishToken(TokenKind.DOT);
     }
   }
-
-  Token finishIdentifier(int ch) {
-    while (_index < _text.length) {
-      if (!TokenizerHelpers.isIdentifierPart(_text.codeUnitAt(_index++))) {
-        _index--;
-        break;
-      }
-    }
-    int kind = getIdentifierKind();
-    if (kind == TokenKind.IDENTIFIER) {
-      return _finishToken(TokenKind.IDENTIFIER);
-    } else {
-      return _finishToken(kind);
-    }
-  }
 }
 
diff --git a/pkg/csslib/lib/src/tokenkind.dart b/pkg/csslib/lib/src/tokenkind.dart
index 091bdb7..67bce33 100644
--- a/pkg/csslib/lib/src/tokenkind.dart
+++ b/pkg/csslib/lib/src/tokenkind.dart
@@ -39,7 +39,6 @@
   static const int DOUBLE_QUOTE = 26;           // "
   static const int SLASH = 27;                  // /
   static const int EQUALS = 28;                 // =
-  static const int OR = 29;                     // |
   static const int CARET = 30;                  // ^
   static const int DOLLAR = 31;                 // $
   static const int LESS = 32;                   // <
@@ -664,7 +663,6 @@
       case TokenKind.DOUBLE_QUOTE: return "\"";
       case TokenKind.SLASH: return "/";
       case TokenKind.EQUALS: return '=';
-      case TokenKind.OR: return '|';
       case TokenKind.CARET: return '^';
       case TokenKind.DOLLAR: return '\$';
       case TokenKind.LESS: return '<';
diff --git a/pkg/csslib/lib/src/tree.dart b/pkg/csslib/lib/src/tree.dart
index f3c71eb..c5275fd 100644
--- a/pkg/csslib/lib/src/tree.dart
+++ b/pkg/csslib/lib/src/tree.dart
@@ -15,7 +15,7 @@
 
   Identifier clone() => new Identifier(name, span);
 
-  void visit(VisitorBase visitor) => visitor.visitIdentifier(this);
+  visit(VisitorBase visitor) => visitor.visitIdentifier(this);
 
   String toString() => name;
 }
@@ -23,7 +23,7 @@
 class Wildcard extends TreeNode {
   Wildcard(Span span): super(span);
   Wildcard clone() => new Wildcard(span);
-  void visit(VisitorBase visitor) => visitor.visitWildcard(this);
+  visit(VisitorBase visitor) => visitor.visitWildcard(this);
 
   String get name => '*';
 }
@@ -31,7 +31,7 @@
 class ThisOperator extends TreeNode {
   ThisOperator(Span span): super(span);
   ThisOperator clone() => new ThisOperator(span);
-  void visit(VisitorBase visitor) => visitor.visitThisOperator(this);
+  visit(VisitorBase visitor) => visitor.visitThisOperator(this);
 
   String get name => '&';
 }
@@ -39,7 +39,7 @@
 class Negation extends TreeNode {
   Negation(Span span): super(span);
   Negation clone() => new Negation(span);
-  void visit(VisitorBase visitor) => visitor.visitNegation(this);
+  visit(VisitorBase visitor) => visitor.visitNegation(this);
 
   String get name => 'not';
 }
@@ -50,14 +50,14 @@
 
   CssComment(this.comment, Span span): super(span);
   CssComment clone() => new CssComment(comment, span);
-  void visit(VisitorBase visitor) => visitor.visitCssComment(this);
+  visit(VisitorBase visitor) => visitor.visitCssComment(this);
 }
 
 // CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->).
 class CommentDefinition extends CssComment {
   CommentDefinition(String comment, Span span): super(comment, span);
   CommentDefinition clone() => new CommentDefinition(comment, span);
-  void visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
+  visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
 }
 
 class SelectorGroup extends TreeNode {
@@ -67,7 +67,7 @@
 
   SelectorGroup clone() => new SelectorGroup(selectors, span);
 
-  void visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
+  visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
 }
 
 class Selector extends TreeNode {
@@ -87,7 +87,7 @@
     return new Selector(simpleSequences, span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitSelector(this);
+  visit(VisitorBase visitor) => visitor.visitSelector(this);
 }
 
 class SimpleSelectorSequence extends TreeNode {
@@ -115,7 +115,7 @@
   SimpleSelectorSequence clone() =>
       new SimpleSelectorSequence(simpleSelector, span, combinator);
 
-  void visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this);
+  visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this);
 
   String toString() => simpleSelector.name;
 }
@@ -134,13 +134,13 @@
 
   bool get isThis => _name is ThisOperator;
 
-  void visit(VisitorBase visitor) => visitor.visitSimpleSelector(this);
+  visit(VisitorBase visitor) => visitor.visitSimpleSelector(this);
 }
 
 // element name
 class ElementSelector extends SimpleSelector {
   ElementSelector(name, Span span) : super(name, span);
-  void visit(VisitorBase visitor) => visitor.visitElementSelector(this);
+  visit(VisitorBase visitor) => visitor.visitElementSelector(this);
 
   ElementSelector clone() => new ElementSelector(_name, span);
 
@@ -162,7 +162,7 @@
 
   NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span);
 
-  void visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this);
+  visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this);
 
   String toString() => "$namespace|${nameAsSimpleSelector.name}";
 }
@@ -175,6 +175,10 @@
   AttributeSelector(Identifier name, this._op, this._value,
       Span span) : super(name, span);
 
+  int get operatorKind => _op;
+
+  get value => _value;
+
   String matchOperator() {
     switch (_op) {
     case TokenKind.EQUALS:
@@ -226,7 +230,7 @@
 
   AttributeSelector clone() => new AttributeSelector(_name, _op, _value, span);
 
-  void visit(VisitorBase visitor) => visitor.visitAttributeSelector(this);
+  visit(VisitorBase visitor) => visitor.visitAttributeSelector(this);
 
   String toString() => "[$name${matchOperator()}${valueToString()}]";
 }
@@ -235,7 +239,7 @@
 class IdSelector extends SimpleSelector {
   IdSelector(Identifier name, Span span) : super(name, span);
   IdSelector clone() => new IdSelector(_name, span);
-  void visit(VisitorBase visitor) => visitor.visitIdSelector(this);
+  visit(VisitorBase visitor) => visitor.visitIdSelector(this);
 
   String toString() => "#$_name";
 }
@@ -244,7 +248,7 @@
 class ClassSelector extends SimpleSelector {
   ClassSelector(Identifier name, Span span) : super(name, span);
   ClassSelector clone() => new ClassSelector(_name, span);
-  void visit(VisitorBase visitor) => visitor.visitClassSelector(this);
+  visit(VisitorBase visitor) => visitor.visitClassSelector(this);
 
   String toString() => ".$_name";
 }
@@ -252,7 +256,7 @@
 // :pseudoClass
 class PseudoClassSelector extends SimpleSelector {
   PseudoClassSelector(Identifier name, Span span) : super(name, span);
-  void visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this);
+  visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this);
 
   PseudoClassSelector clone() => new PseudoClassSelector(_name, span);
 
@@ -262,7 +266,7 @@
 // ::pseudoElement
 class PseudoElementSelector extends SimpleSelector {
   PseudoElementSelector(Identifier name, Span span) : super(name, span);
-  void visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this);
+  visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this);
 
   PseudoElementSelector clone() => new PseudoElementSelector(_name, span);
 
@@ -279,7 +283,7 @@
   PseudoClassFunctionSelector clone() =>
       new PseudoClassFunctionSelector(_name, expression, span);
 
-  void visit(VisitorBase visitor) =>
+  visit(VisitorBase visitor) =>
       visitor.visitPseudoClassFunctionSelector(this);
 }
 
@@ -293,28 +297,21 @@
   PseudoElementFunctionSelector clone() =>
       new PseudoElementFunctionSelector(_name, expression, span);
 
-  void visit(VisitorBase visitor) =>
+  visit(VisitorBase visitor) =>
       visitor.visitPseudoElementFunctionSelector(this);
 }
 
 class SelectorExpression extends TreeNode {
-  final List<Expression> expressions = [];
+  final List<Expression> expressions;
 
-  SelectorExpression(Span span): super(span);
-
-  void add(Expression expression) {
-    expressions.add(expression);
-  }
+  SelectorExpression(this.expressions, Span span): super(span);
 
   SelectorExpression clone() {
-    var selectorExpr = new SelectorExpression(span);
-    for (var expr in expressions) {
-      selectorExpr.add(expr.clone());
-    }
-    return selectorExpr;
+    return new SelectorExpression(
+        expressions.map((e) => e.clone()).toList(), span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
+  visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
 }
 
 // :NOT(negation_arg)
@@ -326,7 +323,7 @@
 
   NegationSelector clone() => new NegationSelector(negationArg, span);
 
-  void visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
+  visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
 }
 
 class NoOp extends TreeNode {
@@ -334,7 +331,7 @@
 
   NoOp clone() => new NoOp();
 
-  void visit(VisitorBase visitor) => visitor.visitNoOp(this);
+  visit(VisitorBase visitor) => visitor.visitNoOp(this);
 }
 
 class StyleSheet extends TreeNode {
@@ -357,13 +354,13 @@
     return new StyleSheet(clonedTopLevels, span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
+  visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
 }
 
 class TopLevelProduction extends TreeNode {
   TopLevelProduction(Span span) : super(span);
   TopLevelProduction clone() => new TopLevelProduction(span);
-  void visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this);
+  visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this);
 }
 
 class RuleSet extends TopLevelProduction {
@@ -381,7 +378,7 @@
     return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitRuleSet(this);
+  visit(VisitorBase visitor) => visitor.visitRuleSet(this);
 }
 
 class Directive extends TreeNode {
@@ -391,7 +388,7 @@
   bool get isExtension => false;    // SCSS extension?
 
   Directive clone() => new Directive(span);
-  void visit(VisitorBase visitor) => visitor.visitDirective(this);
+  visit(VisitorBase visitor) => visitor.visitDirective(this);
 }
 
 class ImportDirective extends Directive {
@@ -411,7 +408,7 @@
     return new ImportDirective(import, cloneMediaQueries, span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitImportDirective(this);
+  visit(VisitorBase visitor) => visitor.visitImportDirective(this);
 }
 
 /**
@@ -433,7 +430,7 @@
     return new MediaExpression(andOperator, _mediaFeature, clonedExprs, span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitMediaExpression(this);
+  visit(VisitorBase visitor) => visitor.visitMediaExpression(this);
 }
 
 /**
@@ -470,7 +467,7 @@
     }
     return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span);
   }
-  void visit(VisitorBase visitor) => visitor.visitMediaQuery(this);
+  visit(VisitorBase visitor) => visitor.visitMediaQuery(this);
 }
 
 class MediaDirective extends Directive {
@@ -491,7 +488,7 @@
     return new MediaDirective(cloneQueries, cloneRulesets, span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitMediaDirective(this);
+  visit(VisitorBase visitor) => visitor.visitMediaDirective(this);
 }
 
 class HostDirective extends Directive {
@@ -507,7 +504,7 @@
     return new HostDirective(cloneRulesets, span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitHostDirective(this);
+  visit(VisitorBase visitor) => visitor.visitHostDirective(this);
 }
 
 class PageDirective extends Directive {
@@ -526,7 +523,7 @@
     return new PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitPageDirective(this);
+  visit(VisitorBase visitor) => visitor.visitPageDirective(this);
 
   bool get hasIdent => _ident != null && _ident.length > 0;
   bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.length > 0;
@@ -537,7 +534,7 @@
 
   CharsetDirective(this.charEncoding, Span span) : super(span);
   CharsetDirective clone() => new CharsetDirective(charEncoding, span);
-  void visit(VisitorBase visitor) => visitor.visitCharsetDirective(this);
+  visit(VisitorBase visitor) => visitor.visitCharsetDirective(this);
 }
 
 class KeyFrameDirective extends Directive {
@@ -573,7 +570,7 @@
     }
     return new KeyFrameDirective(_keyframeName, cloneBlocks, span);
   }
-  void visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this);
+  visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this);
 }
 
 class KeyFrameBlock extends Expression {
@@ -585,7 +582,7 @@
 
   KeyFrameBlock clone() =>
       new KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span);
-  void visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this);
+  visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this);
 }
 
 class FontFaceDirective extends Directive {
@@ -595,7 +592,7 @@
 
   FontFaceDirective clone() =>
       new FontFaceDirective(_declarations.clone(), span);
-  void visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
+  visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
 }
 
 class StyletDirective extends Directive {
@@ -615,7 +612,7 @@
     return new StyletDirective(dartClassName, cloneRulesets, span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
+  visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
 }
 
 class NamespaceDirective extends Directive {
@@ -629,7 +626,7 @@
 
   NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span);
 
-  void visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
+  visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
 
   String get prefix => _prefix.length > 0 ? '$_prefix ' : '';
 }
@@ -643,7 +640,7 @@
   VarDefinitionDirective clone() =>
       new VarDefinitionDirective(def.clone(), span);
 
-  void visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this);
+  visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this);
 }
 
 class MixinDefinition extends Directive {
@@ -662,7 +659,7 @@
     return new MixinDefinition(name, cloneDefinedArgs, varArgs, span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
+  visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
 }
 
 /** Support a Sass @mixin. See http://sass-lang.com for description. */
@@ -686,7 +683,7 @@
         span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
+  visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
 }
 
 class MixinDeclarationDirective extends MixinDefinition {
@@ -705,7 +702,7 @@
         declarations.clone(), span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this);
+  visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this);
 }
 
 /** To support consuming a SASS mixin @include. */
@@ -725,14 +722,14 @@
     return new IncludeDirective(name, cloneArgs, span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitIncludeDirective(this);
+  visit(VisitorBase visitor) => visitor.visitIncludeDirective(this);
 }
 
 /** To support SASS @content. */
 class ContentDirective extends Directive {
   ContentDirective(Span span) : super(span);
 
-  void visit(VisitorBase visitor) => visitor.visitContentDirective(this);
+  visit(VisitorBase visitor) => visitor.visitContentDirective(this);
 }
 
 class Declaration extends TreeNode {
@@ -765,7 +762,7 @@
       new Declaration(_property.clone(), _expression.clone(), dartStyle, span,
       important: important);
 
-  void visit(VisitorBase visitor) => visitor.visitDeclaration(this);
+  visit(VisitorBase visitor) => visitor.visitDeclaration(this);
 }
 
 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and
@@ -786,7 +783,7 @@
       new VarDefinition(_property.clone(),
       expression != null ? expression.clone() : null, span);
 
-  void visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
+  visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
 }
 
 /**
@@ -805,7 +802,7 @@
   IncludeMixinAtDeclaration clone() =>
       new IncludeMixinAtDeclaration(include.clone(), span);
 
-  void visit(VisitorBase visitor) =>
+  visit(VisitorBase visitor) =>
       visitor.visitIncludeMixinAtDeclaration(this);
 }
 
@@ -820,7 +817,7 @@
     return new ExtendDeclaration(newSelector, span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
+  visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
 }
 
 class DeclarationGroup extends TreeNode {
@@ -834,7 +831,7 @@
     return new DeclarationGroup(clonedDecls, span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
+  visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
 }
 
 class MarginGroup extends DeclarationGroup {
@@ -844,7 +841,7 @@
       : super(decls, span);
   MarginGroup clone() =>
     new MarginGroup(margin_sym, super.clone() as dynamic, span);
-  void visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
+  visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
 }
 
 class VarUsage extends Expression {
@@ -861,31 +858,31 @@
     return new VarUsage(name, clonedValues, span);
   }
 
-  void visit(VisitorBase visitor) => visitor.visitVarUsage(this);
+  visit(VisitorBase visitor) => visitor.visitVarUsage(this);
 }
 
 class OperatorSlash extends Expression {
   OperatorSlash(Span span) : super(span);
   OperatorSlash clone() => new OperatorSlash(span);
-  void visit(VisitorBase visitor) => visitor.visitOperatorSlash(this);
+  visit(VisitorBase visitor) => visitor.visitOperatorSlash(this);
 }
 
 class OperatorComma extends Expression {
   OperatorComma(Span span) : super(span);
   OperatorComma clone() => new OperatorComma(span);
-  void visit(VisitorBase visitor) => visitor.visitOperatorComma(this);
+  visit(VisitorBase visitor) => visitor.visitOperatorComma(this);
 }
 
 class OperatorPlus extends Expression {
   OperatorPlus(Span span) : super(span);
   OperatorPlus clone() => new OperatorPlus(span);
-  void visit(VisitorBase visitor) => visitor.visitOperatorPlus(this);
+  visit(VisitorBase visitor) => visitor.visitOperatorPlus(this);
 }
 
 class OperatorMinus extends Expression {
   OperatorMinus(Span span) : super(span);
   OperatorMinus clone() => new OperatorMinus(span);
-  void visit(VisitorBase visitor) => visitor.visitOperatorMinus(this);
+  visit(VisitorBase visitor) => visitor.visitOperatorMinus(this);
 }
 
 class UnicodeRangeTerm extends Expression {
@@ -898,7 +895,7 @@
 
   UnicodeRangeTerm clone() => new UnicodeRangeTerm(first, second, span);
 
-  void visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this);
+  visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this);
 }
 
 class LiteralTerm extends Expression {
@@ -912,13 +909,13 @@
 
   LiteralTerm clone() => new LiteralTerm(value, text, span);
 
-  void visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
+  visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
 }
 
 class NumberTerm extends LiteralTerm {
   NumberTerm(value, String t, Span span) : super(value, t, span);
   NumberTerm clone() => new NumberTerm(value, text, span);
-  void visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
+  visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
 }
 
 class UnitTerm extends LiteralTerm {
@@ -928,7 +925,7 @@
 
   UnitTerm clone() => new UnitTerm(value, text, span, unit);
 
-  void visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
+  visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
 
   String unitToString() => TokenKind.unitToString(unit);
 
@@ -946,25 +943,25 @@
         this.unit == TokenKind.UNIT_LENGTH_PC);
   }
   LengthTerm clone() => new LengthTerm(value, text, span, unit);
-  void visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
+  visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
 }
 
 class PercentageTerm extends LiteralTerm {
   PercentageTerm(value, String t, Span span) : super(value, t, span);
   PercentageTerm clone() => new PercentageTerm(value, text, span);
-  void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
+  visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
 }
 
 class EmTerm extends LiteralTerm {
   EmTerm(value, String t, Span span) : super(value, t, span);
   EmTerm clone() => new EmTerm(value, text, span);
-  void visit(VisitorBase visitor) => visitor.visitEmTerm(this);
+  visit(VisitorBase visitor) => visitor.visitEmTerm(this);
 }
 
 class ExTerm extends LiteralTerm {
   ExTerm(value, String t, Span span) : super(value, t, span);
   ExTerm clone() => new ExTerm(value, text, span);
-  void visit(VisitorBase visitor) => visitor.visitExTerm(this);
+  visit(VisitorBase visitor) => visitor.visitExTerm(this);
 }
 
 class AngleTerm extends UnitTerm {
@@ -977,7 +974,7 @@
   }
 
   AngleTerm clone() => new AngleTerm(value, text, span, unit);
-  void visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
+  visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
 }
 
 class TimeTerm extends UnitTerm {
@@ -989,7 +986,7 @@
   }
 
   TimeTerm clone() => new TimeTerm(value, text, span, unit);
-  void visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
+  visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
 }
 
 class FreqTerm extends UnitTerm {
@@ -999,21 +996,21 @@
   }
 
   FreqTerm clone() => new FreqTerm(value, text, span, unit);
-  void visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
+  visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
 }
 
 class FractionTerm extends LiteralTerm {
   FractionTerm(var value, String t, Span span) : super(value, t, span);
 
   FractionTerm clone() => new FractionTerm(value, text, span);
-  void visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
+  visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
 }
 
 class UriTerm extends LiteralTerm {
   UriTerm(String value, Span span) : super(value, value, span);
 
   UriTerm clone() => new UriTerm(value, span);
-  void visit(VisitorBase visitor) => visitor.visitUriTerm(this);
+  visit(VisitorBase visitor) => visitor.visitUriTerm(this);
 }
 
 class ResolutionTerm extends UnitTerm {
@@ -1025,7 +1022,7 @@
   }
 
   ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit);
-  void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
+  visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
 }
 
 class ChTerm extends UnitTerm {
@@ -1035,7 +1032,7 @@
   }
 
   ChTerm clone() => new ChTerm(value, text, span, unit);
-  void visit(VisitorBase visitor) => visitor.visitChTerm(this);
+  visit(VisitorBase visitor) => visitor.visitChTerm(this);
 }
 
 class RemTerm extends UnitTerm {
@@ -1045,7 +1042,7 @@
   }
 
   RemTerm clone() => new RemTerm(value, text, span, unit);
-  void visit(VisitorBase visitor) => visitor.visitRemTerm(this);
+  visit(VisitorBase visitor) => visitor.visitRemTerm(this);
 }
 
 class ViewportTerm extends UnitTerm {
@@ -1058,7 +1055,7 @@
   }
 
   ViewportTerm clone() => new ViewportTerm(value, text, span, unit);
-  void visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
+  visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
 }
 
 /** Type to signal a bad hex value for HexColorTerm.value. */
@@ -1068,7 +1065,7 @@
   HexColorTerm(var value, String t, Span span) : super(value, t, span);
 
   HexColorTerm clone() => new HexColorTerm(value, text, span);
-  void visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
+  visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
 }
 
 class FunctionTerm extends LiteralTerm {
@@ -1078,7 +1075,7 @@
       : super(value, t, span);
 
   FunctionTerm clone() => new FunctionTerm(value, text, _params.clone(), span);
-  void visit(VisitorBase visitor) => visitor.visitFunctionTerm(this);
+  visit(VisitorBase visitor) => visitor.visitFunctionTerm(this);
 }
 
 /**
@@ -1089,7 +1086,7 @@
 class IE8Term extends LiteralTerm {
   IE8Term(Span span) : super('\\9', '\\9', span);
   IE8Term clone() => new IE8Term(span);
-  void visit(VisitorBase visitor) => visitor.visitIE8Term(this);
+  visit(VisitorBase visitor) => visitor.visitIE8Term(this);
 }
 
 class GroupTerm extends Expression {
@@ -1102,14 +1099,14 @@
   }
 
   GroupTerm clone() => new GroupTerm(span);
-  void visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
+  visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
 }
 
 class ItemTerm extends NumberTerm {
   ItemTerm(var value, String t, Span span) : super(value, t, span);
 
   ItemTerm clone() => new ItemTerm(value, text, span);
-  void visit(VisitorBase visitor) => visitor.visitItemTerm(this);
+  visit(VisitorBase visitor) => visitor.visitItemTerm(this);
 }
 
 class Expressions extends Expression {
@@ -1128,7 +1125,7 @@
     }
     return clonedExprs;
   }
-  void visit(VisitorBase visitor) => visitor.visitExpressions(this);
+  visit(VisitorBase visitor) => visitor.visitExpressions(this);
 }
 
 class BinaryExpression extends Expression {
@@ -1140,7 +1137,7 @@
 
   BinaryExpression clone() =>
       new BinaryExpression(op, x.clone(), y.clone(), span);
-  void visit(VisitorBase visitor) => visitor.visitBinaryExpression(this);
+  visit(VisitorBase visitor) => visitor.visitBinaryExpression(this);
 }
 
 class UnaryExpression extends Expression {
@@ -1150,7 +1147,7 @@
   UnaryExpression(this.op, this.self, Span span): super(span);
 
   UnaryExpression clone() => new UnaryExpression(op, self.clone(), span);
-  void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
+  visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
 }
 
 abstract class DartStyleExpression extends TreeNode {
@@ -1185,7 +1182,7 @@
 
   bool isSame(DartStyleExpression other) => this._styleType == other._styleType;
 
-  void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
+  visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
 }
 
 class FontExpression extends DartStyleExpression {
@@ -1225,7 +1222,7 @@
         weight: font.weight, style: font.style, variant: font.variant,
         lineHeight: font.lineHeight);
 
-  void visit(VisitorBase visitor) => visitor.visitFontExpression(this);
+  visit(VisitorBase visitor) => visitor.visitFontExpression(this);
 }
 
 abstract class BoxExpression extends DartStyleExpression {
@@ -1241,7 +1238,7 @@
    */
   merged(BoxExpression newDartExpr);
 
-  void visit(VisitorBase visitor) => visitor.visitBoxExpression(this);
+  visit(VisitorBase visitor) => visitor.visitBoxExpression(this);
 
   String get formattedBoxEdge {
     if (box.top == box.left && box.top == box.bottom &&
@@ -1289,7 +1286,7 @@
       new MarginExpression(span, top: box.top, right: box.right,
       bottom: box.bottom, left: box.left);
 
-  void visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
+  visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
 }
 
 class BorderExpression extends BoxExpression {
@@ -1325,7 +1322,7 @@
       new BorderExpression(span, top: box.top, right: box.right,
       bottom: box.bottom, left: box.left);
 
-  void visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
+  visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
 }
 
 class HeightExpression extends DartStyleExpression {
@@ -1343,7 +1340,7 @@
   }
 
   HeightExpression clone() => new HeightExpression(span, height);
-  void visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
+  visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
 }
 
 class WidthExpression extends DartStyleExpression {
@@ -1361,7 +1358,7 @@
   }
 
   WidthExpression clone() => new WidthExpression(span, width);
-  void visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
+  visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
 }
 
 class PaddingExpression extends BoxExpression {
@@ -1395,5 +1392,5 @@
   PaddingExpression clone() =>
       new PaddingExpression(span, top: box.top, right: box.right,
       bottom: box.bottom, left: box.left);
-  void visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
+  visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
 }
diff --git a/pkg/csslib/lib/visitor.dart b/pkg/csslib/lib/visitor.dart
index 6c009ff..8174af9 100644
--- a/pkg/csslib/lib/visitor.dart
+++ b/pkg/csslib/lib/visitor.dart
@@ -262,45 +262,16 @@
   }
 
   void visitSimpleSelectorSequence(SimpleSelectorSequence node) {
-    var selector = node.simpleSelector;
-    if (selector is NamespaceSelector) {
-      visitNamespaceSelector(selector);
-    } else if (selector is ElementSelector) {
-      visitElementSelector(selector);
-    } else if (selector is IdSelector) {
-      visitIdSelector(selector);
-    } else if (selector is ClassSelector) {
-      visitClassSelector(selector);
-    } else if (selector is PseudoClassFunctionSelector) {
-      visitPseudoClassFunctionSelector(selector);
-    } else if (selector is PseudoElementFunctionSelector) {
-      visitPseudoElementFunctionSelector(selector);
-    } else if (selector is PseudoClassSelector) {
-      visitPseudoClassSelector(selector);
-    } else if (selector is PseudoElementSelector) {
-      visitPseudoElementSelector(selector);
-    } else if (selector is NegationSelector) {
-      visitNegationSelector(selector);
-    } else if (selector is SelectorExpression) {
-      visitSelectorExpression(selector);
-    } else if (selector is AttributeSelector) {
-      visitAttributeSelector(selector);
-    } else {
-      visitSimpleSelector(selector);
-    }
+    node.simpleSelector.visit(this);
   }
 
   void visitSimpleSelector(SimpleSelector node) => node._name.visit(this);
 
   void visitNamespaceSelector(NamespaceSelector node) {
-    var namespace = node._namespace;
-    if (namespace is Identifier) {
-      visitIdentifier(namespace);
-    } else if (namespace is Wildcard) {
-      visitWildcard(namespace);
+    if (node._namespace != null) node._namespace.visit(this);
+    if (node.nameAsSimpleSelector != null) {
+      node.nameAsSimpleSelector.visit(this);
     }
-
-    visitSimpleSelector(node.nameAsSimpleSelector);
   }
 
   void visitElementSelector(ElementSelector node) => visitSimpleSelector(node);
diff --git a/pkg/csslib/pubspec.yaml b/pkg/csslib/pubspec.yaml
index 81ddfd9..509771d 100644
--- a/pkg/csslib/pubspec.yaml
+++ b/pkg/csslib/pubspec.yaml
@@ -1,5 +1,5 @@
 name: csslib
-version: 0.9.3-dev
+version: 0.10.0-dev
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: A library for parsing CSS.
 homepage: https://www.dartlang.org
diff --git a/pkg/docgen/lib/src/generator.dart b/pkg/docgen/lib/src/generator.dart
index aba0551..0531869 100644
--- a/pkg/docgen/lib/src/generator.dart
+++ b/pkg/docgen/lib/src/generator.dart
@@ -136,8 +136,15 @@
   var parentDir = new Directory(path.dirname(filePath));
   if (!parentDir.existsSync()) parentDir.createSync(recursive: true);
 
-  new File(filePath)
-      .writeAsStringSync(text, mode: FileMode.WRITE);
+  try {
+    new File(filePath)
+        .writeAsStringSync(text, mode: FileMode.WRITE);
+  } on FileSystemException catch (e) {
+    print('Failed to write to the path $filePath. Do you have write '
+        'permissions to that directory? If not, please specify a different '
+        'output directory using the --out option.');
+    exit(1);
+  }
 }
 
 /// Resolve all the links in the introductory comments for a given library or
diff --git a/pkg/docgen/lib/src/viewer.dart b/pkg/docgen/lib/src/viewer.dart
index 1093a6d..b76bd9e 100644
--- a/pkg/docgen/lib/src/viewer.dart
+++ b/pkg/docgen/lib/src/viewer.dart
@@ -128,7 +128,7 @@
 
   if (webDocsDir.existsSync()) {
     // Compile the code to JavaScript so we can run on any browser.
-    print('Compile app to JavaScript for viewing.');
+    print('Compiling the app to JavaScript.');
     var processResult = Process.runSync(gen.dartBinary, ['deploy.dart'],
         workingDirectory: path.join(_dartdocViewerDir.path, 'client'),
         runInShell: true);
@@ -141,7 +141,7 @@
 void _compile() {
   if (_webDocsDir.existsSync()) {
     // Compile the code to JavaScript so we can run on any browser.
-    print('Compile app to JavaScript for viewing.');
+    print('Compiling the app to JavaScript.');
     var processResult = Process.runSync(gen.dartBinary, ['deploy.dart'],
         workingDirectory: _viewerCodePath, runInShell: true);
     print('process output: ${processResult.stdout}');
diff --git a/pkg/http/CHANGELOG.md b/pkg/http/CHANGELOG.md
index d6fdd44..ac6a0cf 100644
--- a/pkg/http/CHANGELOG.md
+++ b/pkg/http/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.11.1
+
+* Expose the `IOClient` class which wraps a `dart:io` `HttpClient`.
+
 ## 0.11.0+1
 
 * Fix a bug in handling errors in decoding XMLHttpRequest responses for
diff --git a/pkg/http/lib/http.dart b/pkg/http/lib/http.dart
index d93a1a5..5b9b1f9 100644
--- a/pkg/http/lib/http.dart
+++ b/pkg/http/lib/http.dart
@@ -18,6 +18,7 @@
 export 'src/byte_stream.dart';
 export 'src/client.dart';
 export 'src/exception.dart';
+export 'src/io_client.dart';
 export 'src/multipart_file.dart';
 export 'src/multipart_request.dart';
 export 'src/request.dart';
diff --git a/pkg/http/lib/src/io.dart b/pkg/http/lib/src/io.dart
index 1730706..767dda0 100644
--- a/pkg/http/lib/src/io.dart
+++ b/pkg/http/lib/src/io.dart
@@ -43,6 +43,9 @@
 /// Returns whether [error] is a `dart:io` HttpException.
 bool isHttpException(error) => reflect(error).type.isSubtypeOf(_httpException);
 
+/// Returns whether [client] is a `dart:io` HttpClient.
+bool isHttpClient(client) => reflect(client).type.isSubtypeOf(_httpClient);
+
 /// Tries to load `dart:io` and returns `null` if it fails.
 LibraryMirror _getLibrary() {
   try {
diff --git a/pkg/http/lib/src/io_client.dart b/pkg/http/lib/src/io_client.dart
index 9fd81ac..1114180 100644
--- a/pkg/http/lib/src/io_client.dart
+++ b/pkg/http/lib/src/io_client.dart
@@ -14,15 +14,27 @@
 import 'io.dart' as io;
 import 'streamed_response.dart';
 
-/// A `dart:io`-based HTTP client. This is the default client.
+/// A `dart:io`-based HTTP client.
+///
+/// This is the default client when running on the command line.
 class IOClient extends BaseClient {
   /// The underlying `dart:io` HTTP client.
   var _inner;
 
   /// Creates a new HTTP client.
-  IOClient() {
+  ///
+  /// [innerClient] must be a `dart:io` HTTP client. If it's not passed, a
+  /// default one will be instantiated.
+  IOClient([innerClient]) {
     io.assertSupported("IOClient");
-    _inner = io.newHttpClient();
+    if (innerClient != null) {
+      // TODO(nweiz): remove this assert when we can type [innerClient]
+      // properly.
+      assert(io.isHttpClient(innerClient));
+      _inner = innerClient;
+    } else {
+      _inner = io.newHttpClient();
+    }
   }
 
   /// Sends an HTTP request and asynchronously returns the response.
diff --git a/pkg/http/pubspec.yaml b/pkg/http/pubspec.yaml
index b02477e..077d277 100644
--- a/pkg/http/pubspec.yaml
+++ b/pkg/http/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http
-version: 0.11.0+1
+version: 0.11.1
 author: "Dart Team <misc@dartlang.org>"
 homepage: https://pub.dartlang.org/packages/http
 description: A composable, Future-based API for making HTTP requests.
diff --git a/pkg/http/test/io/client_test.dart b/pkg/http/test/io/client_test.dart
index b9cc5fa..a9d7694 100644
--- a/pkg/http/test/io/client_test.dart
+++ b/pkg/http/test/io/client_test.dart
@@ -48,6 +48,41 @@
     }), completes);
   });
 
+  test('#send a StreamedRequest with a custom client', () {
+    expect(startServer().then((_) {
+      var ioClient = new HttpClient();
+      var client = new http.IOClient(ioClient);
+      var request = new http.StreamedRequest("POST", serverUrl);
+      request.headers[HttpHeaders.CONTENT_TYPE] =
+        'application/json; charset=utf-8';
+      request.headers[HttpHeaders.USER_AGENT] = 'Dart';
+
+      expect(client.send(request).then((response) {
+        expect(response.request, equals(request));
+        expect(response.statusCode, equals(200));
+        expect(response.headers['single'], equals('value'));
+        // dart:io internally normalizes outgoing headers so that they never
+        // have multiple headers with the same name, so there's no way to test
+        // whether we handle that case correctly.
+
+        return response.stream.bytesToString();
+      }).whenComplete(client.close), completion(parse(equals({
+        'method': 'POST',
+        'path': '/',
+        'headers': {
+          'content-type': ['application/json; charset=utf-8'],
+          'accept-encoding': ['gzip'],
+          'user-agent': ['Dart'],
+          'transfer-encoding': ['chunked']
+        },
+        'body': '{"hello": "world"}'
+      }))));
+
+      request.sink.add('{"hello": "world"}'.codeUnits);
+      request.sink.close();
+    }), completes);
+  });
+
   test('#send with an invalid URL', () {
     expect(startServer().then((_) {
       var client = new http.Client();
diff --git a/pkg/http_parser/CHANGELOG.md b/pkg/http_parser/CHANGELOG.md
index 4ef72b0..48073a4 100644
--- a/pkg/http_parser/CHANGELOG.md
+++ b/pkg/http_parser/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 0.0.2+2
+
+* Fixes for HTTP date formatting.
+
+## 0.0.2+1
+
+* Minor code refactoring.
+
 ## 0.0.2
 
 * Added `CompatibleWebSocket`, for platform- and API-independent support for the
diff --git a/pkg/http_parser/lib/http_parser.dart b/pkg/http_parser/lib/http_parser.dart
index f9d8b8f..0aa9cea 100644
--- a/pkg/http_parser/lib/http_parser.dart
+++ b/pkg/http_parser/lib/http_parser.dart
@@ -4,153 +4,6 @@
 
 library http_parser;
 
-import 'package:string_scanner/string_scanner.dart';
-
+export 'src/http_date.dart';
 export 'src/media_type.dart';
 export 'src/web_socket.dart';
-
-const _WEEKDAYS = const ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
-const _MONTHS = const ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
-    "Sep", "Oct", "Nov", "Dec"];
-
-final _shortWeekdayRegExp = new RegExp(r"Mon|Tue|Wed|Thu|Fri|Sat|Sun");
-final _longWeekdayRegExp =
-    new RegExp(r"Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday");
-final _monthRegExp =
-    new RegExp(r"Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec");
-final _digitRegExp = new RegExp(r"\d+");
-
-// TODO(nweiz): Move this into an http_parser package.
-/// Return a HTTP-formatted string representation of [date].
-///
-/// This follows [RFC 822](http://tools.ietf.org/html/rfc822) as updated by [RFC
-/// 1123](http://tools.ietf.org/html/rfc1123).
-String formatHttpDate(DateTime date) {
-  date = date.toUtc();
-  var buffer = new StringBuffer()
-      ..write(_WEEKDAYS[date.weekday - 1])
-      ..write(", ")
-      ..write(date.day.toString())
-      ..write(" ")
-      ..write(_MONTHS[date.month - 1])
-      ..write(" ")
-      ..write(date.year.toString())
-      ..write(date.hour < 9 ? " 0" : " ")
-      ..write(date.hour.toString())
-      ..write(date.minute < 9 ? ":0" : ":")
-      ..write(date.minute.toString())
-      ..write(date.second < 9 ? ":0" : ":")
-      ..write(date.second.toString())
-      ..write(" GMT");
-  return buffer.toString();
-}
-
-// TODO(nweiz): Move this into an http_parser package.
-/// Parses an HTTP-formatted date into a UTC [DateTime].
-///
-/// This follows [RFC
-/// 2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3). It will
-/// throw a [FormatException] if [date] is invalid.
-DateTime parseHttpDate(String date) {
-  try {
-    var scanner = new StringScanner(date);
-
-    if (scanner.scan(_longWeekdayRegExp)) {
-      // RFC 850 starts with a long weekday.
-      scanner.expect(", ");
-      var day = _parseInt(scanner, 2);
-      scanner.expect("-");
-      var month = _parseMonth(scanner);
-      scanner.expect("-");
-      var year = 1900 + _parseInt(scanner, 2);
-      scanner.expect(" ");
-      var time = _parseTime(scanner);
-      scanner.expect(" GMT");
-      scanner.expectDone();
-
-      return _makeDateTime(year, month, day, time);
-    }
-
-    // RFC 1123 and asctime both start with a short weekday.
-    scanner.expect(_shortWeekdayRegExp);
-    if (scanner.scan(", ")) {
-      // RFC 1123 follows the weekday with a comma.
-      var day = _parseInt(scanner, 2);
-      scanner.expect(" ");
-      var month = _parseMonth(scanner);
-      scanner.expect(" ");
-      var year = _parseInt(scanner, 4);
-      scanner.expect(" ");
-      var time = _parseTime(scanner);
-      scanner.expect(" GMT");
-      scanner.expectDone();
-
-      return _makeDateTime(year, month, day, time);
-    }
-
-    // asctime follows the weekday with a space.
-    scanner.expect(" ");
-    var month = _parseMonth(scanner);
-    scanner.expect(" ");
-    var day = scanner.scan(" ") ?
-        _parseInt(scanner, 1) :
-        _parseInt(scanner, 2);
-    scanner.expect(" ");
-    var time = _parseTime(scanner);
-    scanner.expect(" ");
-    var year = _parseInt(scanner, 4);
-    scanner.expectDone();
-
-    return _makeDateTime(year, month, day, time);
-  } on FormatException catch (error) {
-    throw new FormatException('Invalid HTTP date "$date": ${error.message}');
-  }
-}
-
-/// Parses a short-form month name to a form accepted by [DateTime].
-int _parseMonth(StringScanner scanner) {
-  scanner.expect(_monthRegExp);
-  // DateTime uses 1-indexed months.
-  return _MONTHS.indexOf(scanner.lastMatch[0]) + 1;
-}
-
-/// Parses an int an enforces that it has exactly [digits] digits.
-int _parseInt(StringScanner scanner, int digits) {
-  scanner.expect(_digitRegExp);
-  if (scanner.lastMatch[0].length != digits) {
-    scanner.error("expected a $digits-digit number.");
-  }
-
-  return int.parse(scanner.lastMatch[0]);
-}
-
-/// Parses an timestamp of the form "HH:MM:SS" on a 24-hour clock.
-DateTime _parseTime(StringScanner scanner) {
-  var hours = _parseInt(scanner, 2);
-  if (hours >= 24) scanner.error("hours may not be greater than 24.");
-  scanner.expect(':');
-
-  var minutes = _parseInt(scanner, 2);
-  if (minutes >= 60) scanner.error("minutes may not be greater than 60.");
-  scanner.expect(':');
-
-  var seconds = _parseInt(scanner, 2);
-  if (seconds >= 60) scanner.error("seconds may not be greater than 60.");
-
-  return new DateTime(1, 1, 1, hours, minutes, seconds);
-}
-
-/// Returns a UTC [DateTime] from the given components.
-///
-/// Validates that [day] is a valid day for [month]. If it's not, throws a
-/// [FormatException].
-DateTime _makeDateTime(int year, int month, int day, DateTime time) {
-  var dateTime = new DateTime.utc(
-      year, month, day, time.hour, time.minute, time.second);
-
-  // If [day] was too large, it will cause [month] to overflow.
-  if (dateTime.month != month) {
-    throw new FormatException("invalid day '$day' for month '$month'.");
-  }
-  return dateTime;
-}
diff --git a/pkg/http_parser/lib/src/http_date.dart b/pkg/http_parser/lib/src/http_date.dart
new file mode 100644
index 0000000..ff7c710
--- /dev/null
+++ b/pkg/http_parser/lib/src/http_date.dart
@@ -0,0 +1,152 @@
+// 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 http_parser;
+
+import 'package:string_scanner/string_scanner.dart';
+
+const _WEEKDAYS = const ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
+const _MONTHS = const ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
+    "Sep", "Oct", "Nov", "Dec"];
+
+final _shortWeekdayRegExp = new RegExp(r"Mon|Tue|Wed|Thu|Fri|Sat|Sun");
+final _longWeekdayRegExp =
+    new RegExp(r"Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday");
+final _monthRegExp =
+    new RegExp(r"Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec");
+final _digitRegExp = new RegExp(r"\d+");
+
+/// Return a HTTP-formatted string representation of [date].
+///
+/// This follows [RFC 822](http://tools.ietf.org/html/rfc822) as updated by [RFC
+/// 1123](http://tools.ietf.org/html/rfc1123).
+String formatHttpDate(DateTime date) {
+  date = date.toUtc();
+  var buffer = new StringBuffer()
+      ..write(_WEEKDAYS[date.weekday - 1])
+      ..write(", ")
+      ..write(date.day <= 9 ? "0" : "")
+      ..write(date.day.toString())
+      ..write(" ")
+      ..write(_MONTHS[date.month - 1])
+      ..write(" ")
+      ..write(date.year.toString())
+      ..write(date.hour <= 9 ? " 0" : " ")
+      ..write(date.hour.toString())
+      ..write(date.minute <= 9 ? ":0" : ":")
+      ..write(date.minute.toString())
+      ..write(date.second <= 9 ? ":0" : ":")
+      ..write(date.second.toString())
+      ..write(" GMT");
+  return buffer.toString();
+}
+
+/// Parses an HTTP-formatted date into a UTC [DateTime].
+///
+/// This follows [RFC
+/// 2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3). It will
+/// throw a [FormatException] if [date] is invalid.
+DateTime parseHttpDate(String date) {
+  try {
+    var scanner = new StringScanner(date);
+
+    if (scanner.scan(_longWeekdayRegExp)) {
+      // RFC 850 starts with a long weekday.
+      scanner.expect(", ");
+      var day = _parseInt(scanner, 2);
+      scanner.expect("-");
+      var month = _parseMonth(scanner);
+      scanner.expect("-");
+      var year = 1900 + _parseInt(scanner, 2);
+      scanner.expect(" ");
+      var time = _parseTime(scanner);
+      scanner.expect(" GMT");
+      scanner.expectDone();
+
+      return _makeDateTime(year, month, day, time);
+    }
+
+    // RFC 1123 and asctime both start with a short weekday.
+    scanner.expect(_shortWeekdayRegExp);
+    if (scanner.scan(", ")) {
+      // RFC 1123 follows the weekday with a comma.
+      var day = _parseInt(scanner, 2);
+      scanner.expect(" ");
+      var month = _parseMonth(scanner);
+      scanner.expect(" ");
+      var year = _parseInt(scanner, 4);
+      scanner.expect(" ");
+      var time = _parseTime(scanner);
+      scanner.expect(" GMT");
+      scanner.expectDone();
+
+      return _makeDateTime(year, month, day, time);
+    }
+
+    // asctime follows the weekday with a space.
+    scanner.expect(" ");
+    var month = _parseMonth(scanner);
+    scanner.expect(" ");
+    var day = scanner.scan(" ") ?
+        _parseInt(scanner, 1) :
+        _parseInt(scanner, 2);
+    scanner.expect(" ");
+    var time = _parseTime(scanner);
+    scanner.expect(" ");
+    var year = _parseInt(scanner, 4);
+    scanner.expectDone();
+
+    return _makeDateTime(year, month, day, time);
+  } on FormatException catch (error) {
+    throw new FormatException('Invalid HTTP date "$date": ${error.message}');
+  }
+}
+
+/// Parses a short-form month name to a form accepted by [DateTime].
+int _parseMonth(StringScanner scanner) {
+  scanner.expect(_monthRegExp);
+  // DateTime uses 1-indexed months.
+  return _MONTHS.indexOf(scanner.lastMatch[0]) + 1;
+}
+
+/// Parses an int an enforces that it has exactly [digits] digits.
+int _parseInt(StringScanner scanner, int digits) {
+  scanner.expect(_digitRegExp);
+  if (scanner.lastMatch[0].length != digits) {
+    scanner.error("expected a $digits-digit number.");
+  }
+
+  return int.parse(scanner.lastMatch[0]);
+}
+
+/// Parses an timestamp of the form "HH:MM:SS" on a 24-hour clock.
+DateTime _parseTime(StringScanner scanner) {
+  var hours = _parseInt(scanner, 2);
+  if (hours >= 24) scanner.error("hours may not be greater than 24.");
+  scanner.expect(':');
+
+  var minutes = _parseInt(scanner, 2);
+  if (minutes >= 60) scanner.error("minutes may not be greater than 60.");
+  scanner.expect(':');
+
+  var seconds = _parseInt(scanner, 2);
+  if (seconds >= 60) scanner.error("seconds may not be greater than 60.");
+
+  return new DateTime(1, 1, 1, hours, minutes, seconds);
+}
+
+/// Returns a UTC [DateTime] from the given components.
+///
+/// Validates that [day] is a valid day for [month]. If it's not, throws a
+/// [FormatException].
+DateTime _makeDateTime(int year, int month, int day, DateTime time) {
+  var dateTime = new DateTime.utc(
+      year, month, day, time.hour, time.minute, time.second);
+
+  // If [day] was too large, it will cause [month] to overflow.
+  if (dateTime.month != month) {
+    throw new FormatException("invalid day '$day' for month '$month'.");
+  }
+  return dateTime;
+}
diff --git a/pkg/http_parser/pubspec.yaml b/pkg/http_parser/pubspec.yaml
index 2c9b5d6..d473759 100644
--- a/pkg/http_parser/pubspec.yaml
+++ b/pkg/http_parser/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http_parser
-version: 0.0.2
+version: 0.0.2+2
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
diff --git a/pkg/http_parser/test/http_date_test.dart b/pkg/http_parser/test/http_date_test.dart
index 680147a..303d6d7 100644
--- a/pkg/http_parser/test/http_date_test.dart
+++ b/pkg/http_parser/test/http_date_test.dart
@@ -8,6 +8,38 @@
 import 'package:unittest/unittest.dart';
 
 void main() {
+  group('format', () {
+    test('many values with 9', () {
+      var date = new DateTime.utc(2014, 9, 9, 9, 9, 9);
+      var formatted = formatHttpDate(date);
+
+      expect(formatted, 'Tue, 09 Sep 2014 09:09:09 GMT');
+      var parsed = parseHttpDate(formatted);
+
+      expect(parsed, date);
+    });
+
+    test('end of year', () {
+      var date = new DateTime.utc(1999, 12, 31, 23, 59, 59);
+      var formatted = formatHttpDate(date);
+
+      expect(formatted, 'Fri, 31 Dec 1999 23:59:59 GMT');
+      var parsed = parseHttpDate(formatted);
+
+      expect(parsed, date);
+    });
+
+    test('start of year', () {
+      var date = new DateTime.utc(2000, 1, 1, 0, 0, 0);
+      var formatted = formatHttpDate(date);
+
+      expect(formatted, 'Sat, 01 Jan 2000 00:00:00 GMT');
+      var parsed = parseHttpDate(formatted);
+
+      expect(parsed, date);
+    });
+  });
+
   group("parse", () {
     group("RFC 1123", () {
       test("parses the example date", () {
diff --git a/pkg/intl/CHANGELOG.md b/pkg/intl/CHANGELOG.md
index 8baf4c7..d83fb73 100644
--- a/pkg/intl/CHANGELOG.md
+++ b/pkg/intl/CHANGELOG.md
@@ -1,3 +1,17 @@
+## 0.9.9
+
+* Add NumberFormat.parse()
+
+* Allow NumberFormat constructor to take an optional currency name/symbol, so
+  you can format for a particular locale without it dictating the currency, and
+  also supply the currency symbols which we don't have yet.
+
+* Canonicalize locales more consistently, avoiding a number of problems if you 
+  use a non-canonical form.
+
+* For locales whose length is longer than 6 change "-" to "_" in position 3 when
+  canonicalizing. Previously anything of length > 6 was left completely alone.
+
 ## 0.9.8
 
 * Add a "meaning" optional parameter for Intl.message to distinguish between
diff --git a/pkg/intl/lib/generate_localized.dart b/pkg/intl/lib/generate_localized.dart
index 457f7c7..9b8051d 100644
--- a/pkg/intl/lib/generate_localized.dart
+++ b/pkg/intl/lib/generate_localized.dart
@@ -13,6 +13,7 @@
  */
 library generate_localized;
 
+import 'intl.dart';
 import 'src/intl_message.dart';
 import 'dart:io';
 import 'package:path/path.dart' as path;
@@ -100,10 +101,11 @@
  * Generate a file <[generated_file_prefix]>_messages_<[locale]>.dart
  * for the [translations] in [locale] and put it in [targetDir].
  */
-void generateIndividualMessageFile(String locale,
+void generateIndividualMessageFile(String basicLocale,
     Iterable<TranslatedMessage> translations, String targetDir) {
   var result = new StringBuffer();
-  locale = new MainMessage().escapeAndValidateString(locale);
+  var locale = new MainMessage().escapeAndValidateString(
+      Intl.canonicalizedLocale(basicLocale));
   result.write(prologue(locale));
   // Exclude messages with no translation and translations with no matching
   // original message (e.g. if we're using some messages from a larger catalog)
@@ -133,8 +135,11 @@
       ..write(entries.join(",\n"))
       ..write("\n  };\n}");
 
-  new File(path.join(targetDir,"${generatedFilePrefix}messages_$locale.dart"))
-      ..writeAsStringSync(result.toString());
+  // To preserve compatibility, we don't use the canonical version of the locale
+  // in the file name.
+  var filename =
+      path.join(targetDir,"${generatedFilePrefix}messages_$basicLocale.dart");
+  new File(filename).writeAsStringSync(result.toString());
 }
 
 /**
@@ -174,26 +179,19 @@
   for (var locale in allLocales) {
     var baseFile = '${generatedFilePrefix}messages_$locale.dart';
     var file = importForGeneratedFile(baseFile);
-    // TODO(alanknight): Restore this once deferred loading works in dartj2s.
-    // Issue 12824
-    //    output.write("@${_deferredName(locale)}\n");
-    output.write("import '$file' as ${_libraryName(locale)};\n");
+    output.write("import '$file' deferred as ${_libraryName(locale)};\n");
   }
   output.write("\n");
-  // Issue 12824
-  //for (var locale in allLocales) {
-  //  output.write("const ${_deferredName(locale)} = const DeferredLibrary");
-  //  output.write("('${_libraryName(locale)}');\n");
-  //}
-  //output.write("\nconst deferredLibraries = const {\n");
-  //for (var locale in allLocales) {
-  //  output.write("  '$locale' : ${_deferredName(locale)},\n");
-  //}
-  //output.write("};\n");
+  output.write("\nMap<String, Function> _deferredLibraries = {\n");
+  for (var locale in allLocales) {
+    output.write("  '$locale' : () => ${_libraryName(locale)}.loadLibrary(),\n");
+  }
+  output.write("};\n");
   output.write(
     "\nMessageLookupByLibrary _findExact(localeName) {\n"
     "  switch (localeName) {\n");
-  for (var locale in allLocales) {
+  for (var rawLocale in allLocales) {
+    var locale = Intl.canonicalizedLocale(rawLocale);
     output.write(
         "    case '$locale' : return ${_libraryName(locale)}.messages;\n");
   }
@@ -232,11 +230,10 @@
 /** User programs should call this before using [localeName] for messages.*/
 Future initializeMessages(String localeName) {
   initializeInternalMessageLookup(() => new CompositeMessageLookup());
-  messageLookup.addLocale(localeName, _findGeneratedMessagesFor);
-  // TODO(alanknight): Restore once Issue 12824 is fixed.
-  // var lib = deferredLibraries[localeName];
-  // return lib == null ? new Future.value(false) : lib.load();
-  return new Future.value(true);
+  var lib = _deferredLibraries[Intl.canonicalizedLocale(localeName)];
+  var load = lib == null ? new Future.value(false) : lib();
+  return load.then((_) => 
+      messageLookup.addLocale(localeName, _findGeneratedMessagesFor));
 }
 
 MessageLookupByLibrary _findGeneratedMessagesFor(locale) {
diff --git a/pkg/intl/lib/intl.dart b/pkg/intl/lib/intl.dart
index 2e0cab52..ba2e83a 100644
--- a/pkg/intl/lib/intl.dart
+++ b/pkg/intl/lib/intl.dart
@@ -230,18 +230,21 @@
    */
   static String canonicalizedLocale(String aLocale) {
     // Locales of length < 5 are presumably two-letter forms, or else malformed.
-    // Locales of length > 6 are likely to be malformed. In either case we
-    // return them unmodified and if correct they will be found.
+    // We return them unmodified and if correct they will be found.
+    // Locales longer than 6 might be malformed, but also do occur. Do as
+    // little as possible to them, but make the '-' be an '_' if it's there.
     // We treat C as a special case, and assume it wants en_ISO for formatting.
     // TODO(alanknight): en_ISO is probably not quite right for the C/Posix
     // locale for formatting. Consider adding C to the formats database.
     if (aLocale == null) return getCurrentLocale();
     if (aLocale == "C") return "en_ISO";
-    if ((aLocale.length < 5) || (aLocale.length > 6)) return aLocale;
+    if (aLocale.length < 5) return aLocale;
     if (aLocale[2] != '-' && (aLocale[2] != '_')) return aLocale;
-    var lastRegionLetter = aLocale.length == 5 ? "" : aLocale[5].toUpperCase();
-    return '${aLocale[0]}${aLocale[1]}_${aLocale[3].toUpperCase()}'
-           '${aLocale[4].toUpperCase()}$lastRegionLetter';
+    var region = aLocale.substring(3);
+    // If it's longer than three it's something odd, so don't touch it.
+    if (region.length <= 3) region = region.toUpperCase();
+    return
+        '${aLocale[0]}${aLocale[1]}_$region';
   }
 
   /**
@@ -355,7 +358,7 @@
     // but must be a static variable in order to be visible to the Intl.message
     // invocation.
     var oldLocale = getCurrentLocale();
-    defaultLocale = locale;
+    defaultLocale = Intl.canonicalizedLocale(locale);
     var result = message_function();
     defaultLocale = oldLocale;
     return result;
diff --git a/pkg/intl/lib/message_lookup_by_library.dart b/pkg/intl/lib/message_lookup_by_library.dart
index 839b92c..62e8255 100644
--- a/pkg/intl/lib/message_lookup_by_library.dart
+++ b/pkg/intl/lib/message_lookup_by_library.dart
@@ -56,9 +56,11 @@
    */
   addLocale(String localeName, Function findLocale) {
     if (localeExists(localeName)) return;
-    var newLocale = findLocale(localeName);
+    var canonical = Intl.canonicalizedLocale(localeName);
+    var newLocale = findLocale(canonical);
     if (newLocale != null) {
       availableMessages[localeName] = newLocale;
+      availableMessages[canonical] = newLocale;
     }
   }
 }
diff --git a/pkg/intl/pubspec.yaml b/pkg/intl/pubspec.yaml
index de44ae6..82dce33 100644
--- a/pkg/intl/pubspec.yaml
+++ b/pkg/intl/pubspec.yaml
@@ -1,10 +1,10 @@
 name: intl
-version: 0.9.8
+version: 0.9.10-dev.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
 environment:
-  sdk: '>=1.0.0 <2.0.0'
+  sdk: '>=1.4.0-dev.6.6 <2.0.0'
 documentation: http://api.dartlang.org/docs/pkg/intl
 dependencies:
   analyzer: '>=0.13.2 <0.14.0'
diff --git a/pkg/intl/test/message_extraction/message_extraction_test.dart b/pkg/intl/test/message_extraction/message_extraction_test.dart
index 90574d1..ec6c73f 100644
--- a/pkg/intl/test/message_extraction/message_extraction_test.dart
+++ b/pkg/intl/test/message_extraction/message_extraction_test.dart
@@ -16,8 +16,18 @@
 /** The VM arguments we were given, most important package-root. */
 final vmArgs = Platform.executableArguments;
 
-var tempDir = Directory.systemTemp.createTempSync('message_extraction_test'
-    ).path;
+/**
+ * For testing we move the files into a temporary directory so as not to leave
+ * generated files around after a failed test. For debugging, we omit that
+ * step if [useLocalDirectory] is true. The place we move them to is saved as
+ * [tempDir].
+ */
+String get tempDir => _tempDir == null ? _tempDir = _createTempDir() : _tempDir;
+var _tempDir;
+_createTempDir() => useLocalDirectory ? '.' :
+  Directory.systemTemp.createTempSync('message_extraction_test').path;
+
+var useLocalDirectory = false;
 
 /**
  * Translate a relative file path into this test directory. This is
@@ -41,22 +51,34 @@
   return path.join(tempDir, s);
 }
 
-main() {
+main(arguments) {
+  // If debugging, use --local to avoid copying everything to temporary
+  // directories to make it even harder to debug. Note that this will also
+  // not delete the generated files, so may require manual cleanup.
+  if (arguments.contains("--local")) {
+    print("Testing using local directory for generated files");
+    useLocalDirectory = true;
+  }
+  setUp(copyFilesToTempDirectory);
   test("Test round trip message extraction, translation, code generation, "
       "and printing", () {
-    copyFilesToTempDirectory();
+    var makeSureWeVerify = expectAsync(runAndVerify);
     return extractMessages(null).then((result) {
       return generateTranslationFiles(result);
     }).then((result) {
       return generateCodeFromTranslation(result);
-    }).then((result) => runAndVerify(result));
+    }).then(makeSureWeVerify).then(checkResult);
   });
+  tearDown(deleteGeneratedFiles);
 }
 
 void copyFilesToTempDirectory() {
-  var files = [asTestDirPath('sample_with_messages.dart'), asTestDirPath(
-      'part_of_sample_with_messages.dart'), asTestDirPath('verify_messages.dart'),
-      asTestDirPath('run_and_verify.dart')];
+  if (useLocalDirectory) return;
+  var files = [asTestDirPath('sample_with_messages.dart'),
+      asTestDirPath('part_of_sample_with_messages.dart'),
+      asTestDirPath('verify_messages.dart'),
+      asTestDirPath('run_and_verify.dart'),
+      asTestDirPath('print_to_list.dart')];
   for (var filename in files) {
     var file = new File(filename);
     file.copySync(path.join(tempDir, path.basename(filename)));
@@ -64,6 +86,7 @@
 }
 
 void deleteGeneratedFiles() {
+  if (useLocalDirectory) return;
   try {
     var dir = new Directory(tempDir);
     dir.listSync().forEach((x) => x.deleteSync());
@@ -82,14 +105,7 @@
 Future<ProcessResult> run(ProcessResult previousResult, List<String> filenames)
     {
   // If there's a failure in one of the sub-programs, print its output.
-  if (previousResult != null) {
-    if (previousResult.exitCode != 0) {
-      print("Error running sub-program:");
-    }
-    print(previousResult.stdout);
-    print(previousResult.stderr);
-    print("exitCode=${previousResult.exitCode}");
-  }
+  checkResult(previousResult);
   var filesInTheRightDirectory = filenames.map((x) => asTempDirPath(x)).toList(
       );
   // Inject the script argument --output-dir in between the script and its
@@ -104,6 +120,19 @@
   return result;
 }
 
+void checkResult(ProcessResult previousResult) {
+  if (previousResult != null) {
+    if (previousResult.exitCode != 0) {
+      print("Error running sub-program:");
+    }
+    print(previousResult.stdout);
+    print(previousResult.stderr);
+    print("exitCode=${previousResult.exitCode}");
+    // Fail the test.
+    expect(previousResult.exitCode, 0);
+  }
+}
+
 Future<ProcessResult> extractMessages(ProcessResult previousResult) => run(
     previousResult, [asTestDirPath('extract_to_json.dart'),
     '--suppress-warnings', 'sample_with_messages.dart',
diff --git a/pkg/intl/test/message_extraction/sample_with_messages.dart b/pkg/intl/test/message_extraction/sample_with_messages.dart
index 2dbdf77..64bff65 100644
--- a/pkg/intl/test/message_extraction/sample_with_messages.dart
+++ b/pkg/intl/test/message_extraction/sample_with_messages.dart
@@ -13,6 +13,7 @@
 import "foo_messages_all.dart";
 import "print_to_list.dart";
 import "dart:async";
+import "package:unittest/unittest.dart";
 
 part 'part_of_sample_with_messages.dart';
 
@@ -223,8 +224,17 @@
   var de = new Intl("de_DE");
   // Throw in an initialize of a null locale to make sure it doesn't throw.
   initializeMessages(null);
-  var f1 = initializeMessages(fr.locale).then((_) => printStuff(fr));
-  var f2 = initializeMessages(de.locale).then((_) => printStuff(de));
-  printStuff(english);
+
+  // Verify that a translated message isn't initially present.
+  var messageInGerman = Intl.withLocale('de_DE', message1);
+  test("Locales don't work before they're initialized", ()
+      => expect(messageInGerman, "This is a message"));
+
+  var f1 = initializeMessages(fr.locale)
+      // Since English has the one message which is always translated, we
+      // can't print it until French is ready.
+      .then((_) => printStuff(english))
+      .then((_) => printStuff(fr));
+  var f2 = initializeMessages('de-de').then((_) => printStuff(de));
   return Future.wait([f1, f2]);
 }
diff --git a/pkg/intl/test/message_extraction/verify_messages.dart b/pkg/intl/test/message_extraction/verify_messages.dart
index 1458284..1b3944c 100644
--- a/pkg/intl/test/message_extraction/verify_messages.dart
+++ b/pkg/intl/test/message_extraction/verify_messages.dart
@@ -4,6 +4,9 @@
 import "package:unittest/unittest.dart";
 
 verifyResult(ignored) {
+  test("Verify message translation output", actuallyVerifyResult);
+}
+actuallyVerifyResult() {
   var lineIterator;
   verify(String s) {
     lineIterator.moveNext();
diff --git a/pkg/mime/lib/mime.dart b/pkg/mime/lib/mime.dart
index d1372d4..11b2ca9 100644
--- a/pkg/mime/lib/mime.dart
+++ b/pkg/mime/lib/mime.dart
@@ -14,11 +14,5 @@
  */
 library mime;
 
-import 'dart:async';
-import 'dart:convert';
-import 'dart:typed_data';
-
-part 'src/mime_type.dart';
-part 'src/extension_map.dart';
-part 'src/magic_number.dart';
-part 'src/mime_multipart_transformer.dart';
+export 'src/mime_multipart_transformer.dart';
+export 'src/mime_type.dart';
diff --git a/pkg/mime/lib/src/extension_map.dart b/pkg/mime/lib/src/default_extension_map.dart
similarity index 99%
rename from pkg/mime/lib/src/extension_map.dart
rename to pkg/mime/lib/src/default_extension_map.dart
index 745556b..7e74648 100644
--- a/pkg/mime/lib/src/extension_map.dart
+++ b/pkg/mime/lib/src/default_extension_map.dart
@@ -2,11 +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.
 
-part of mime;
-
+library mime.extension_map;
 
 // TODO(ajohnsen): Use sorted list and binary search?
-const Map<String, String> _DEFAULT_EXTENSION_MAP = const <String, String>{
+const Map<String, String> DEFAULT_EXTENSION_MAP = const <String, String>{
 '123':'application/vnd.lotus-1-2-3',
 '3dml':'text/vnd.in3d.3dml',
 '3ds':'image/x-3ds',
diff --git a/pkg/mime/lib/src/magic_number.dart b/pkg/mime/lib/src/magic_number.dart
index 1229b6d..6c554aa 100644
--- a/pkg/mime/lib/src/magic_number.dart
+++ b/pkg/mime/lib/src/magic_number.dart
@@ -2,15 +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.
 
-part of mime;
+library mime.magic_number;
 
-
-class _MagicNumber {
+class MagicNumber {
   final String mimeType;
   final List<int> numbers;
   final List<int> mask;
 
-  const _MagicNumber(this.mimeType, this.numbers, {this.mask});
+  const MagicNumber(this.mimeType, this.numbers, {this.mask});
 
   bool matches(List<int> header) {
     if (header.length < numbers.length) return false;
@@ -28,19 +27,17 @@
 
 }
 
-const int _DEFAULT_MAGIC_NUMBERS_MAX_LENGTH = 16;
-
-const List<_MagicNumber> _DEFAULT_MAGIC_NUMBERS = const [
-  const _MagicNumber('application/pdf', const [0x25, 0x50, 0x44, 0x46]),
-  const _MagicNumber('application/postscript', const [0x25, 0x51]),
-  const _MagicNumber('image/gif', const [0x47, 0x49, 0x46, 0x38, 0x37, 0x61]),
-  const _MagicNumber('image/gif', const [0x47, 0x49, 0x46, 0x38, 0x39, 0x61]),
-  const _MagicNumber('image/jpeg', const [0xFF, 0xD8]),
-  const _MagicNumber('image/png',
+const List<MagicNumber> DEFAULT_MAGIC_NUMBERS = const [
+  const MagicNumber('application/pdf', const [0x25, 0x50, 0x44, 0x46]),
+  const MagicNumber('application/postscript', const [0x25, 0x51]),
+  const MagicNumber('image/gif', const [0x47, 0x49, 0x46, 0x38, 0x37, 0x61]),
+  const MagicNumber('image/gif', const [0x47, 0x49, 0x46, 0x38, 0x39, 0x61]),
+  const MagicNumber('image/jpeg', const [0xFF, 0xD8]),
+  const MagicNumber('image/png',
       const [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]),
-  const _MagicNumber('image/tiff', const [0x49, 0x49, 0x2A, 0x00]),
-  const _MagicNumber('image/tiff', const [0x4D, 0x4D, 0x00, 0x2A]),
-  const _MagicNumber(
+  const MagicNumber('image/tiff', const [0x49, 0x49, 0x2A, 0x00]),
+  const MagicNumber('image/tiff', const [0x4D, 0x4D, 0x00, 0x2A]),
+  const MagicNumber(
       'video/mp4',
       const [0x00, 0x00, 0x00, 0x00, 0x66, 0x74,
              0x79, 0x70, 0x33, 0x67, 0x70, 0x35],
diff --git a/pkg/mime/lib/src/mime_multipart_transformer.dart b/pkg/mime/lib/src/mime_multipart_transformer.dart
index a35b491..75d10ff 100644
--- a/pkg/mime/lib/src/mime_multipart_transformer.dart
+++ b/pkg/mime/lib/src/mime_multipart_transformer.dart
@@ -2,8 +2,11 @@
 // 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 mime;
+library mime.multipart_transformer;
 
+import 'dart:async';
+import 'dart:convert';
+import 'dart:typed_data';
 
 /**
  * A Mime Multipart class representing each part parsed by
@@ -30,12 +33,6 @@
   }
 }
 
-class _Const {
-  // Bytes for '()<>@,;:\\"/[]?={} \t'.
-  static const SEPARATORS = const [40, 41, 60, 62, 64, 44, 59, 58, 92, 34, 47,
-                                   91, 93, 63, 61, 123, 125, 32, 9];
-}
-
 class _CharCode {
   static const int HT = 9;
   static const int LF = 10;
@@ -71,6 +68,10 @@
   static const int _DONE = 14;
   static const int _FAILURE = 15;
 
+  // Bytes for '()<>@,;:\\"/[]?={} \t'.
+  static const _SEPARATORS = const [40, 41, 60, 62, 64, 44, 59, 58, 92, 34, 47,
+                                   91, 93, 63, 61, 123, 125, 32, 9];
+
   StreamController _controller;
   StreamSubscription _subscription;
 
@@ -387,7 +388,7 @@
   }
 
   bool _isTokenChar(int byte) {
-    return byte > 31 && byte < 128 && _Const.SEPARATORS.indexOf(byte) == -1;
+    return byte > 31 && byte < 128 && _SEPARATORS.indexOf(byte) == -1;
   }
 
   int _toLowerCase(int byte) {
@@ -412,7 +413,9 @@
 
 
 class MimeMultipartException implements Exception {
-  const MimeMultipartException([String this.message = ""]);
-  String toString() => "MimeMultipartException: $message";
   final String message;
+
+  const MimeMultipartException([String this.message = ""]);
+
+  String toString() => "MimeMultipartException: $message";
 }
diff --git a/pkg/mime/lib/src/mime_type.dart b/pkg/mime/lib/src/mime_type.dart
index c9daa2b..ca4d6c5 100644
--- a/pkg/mime/lib/src/mime_type.dart
+++ b/pkg/mime/lib/src/mime_type.dart
@@ -2,15 +2,18 @@
 // 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 mime;
+library mime.mime_type;
 
+import 'default_extension_map.dart';
+import 'magic_number.dart';
 
 final MimeTypeResolver _globalResolver = new MimeTypeResolver();
 
 /**
  * The maximum number of bytes needed, to match all default magic-numbers.
  */
-int get defaultMagicNumbersMaxLength => _DEFAULT_MAGIC_NUMBERS_MAX_LENGTH;
+// NOTE: this is not formatted AS_A_CONST to avoid a breaking change
+const int defaultMagicNumbersMaxLength = 12;
 
 /**
  * Extract the extension from [path] and use that for MIME-type lookup, using
@@ -32,7 +35,7 @@
  */
 class MimeTypeResolver {
   final Map<String, String> _extensionMap = {};
-  final List<_MagicNumber> _magicNumbers = [];
+  final List<MagicNumber> _magicNumbers = [];
   final bool _useDefault;
   int _magicNumbersMaxLength;
 
@@ -46,7 +49,7 @@
    */
   MimeTypeResolver() :
       _useDefault = true,
-      _magicNumbersMaxLength = _DEFAULT_MAGIC_NUMBERS_MAX_LENGTH;
+      _magicNumbersMaxLength = defaultMagicNumbersMaxLength;
 
   /**
    * Get the maximum number of bytes required to match all magic numbers, when
@@ -71,7 +74,7 @@
       result = _matchMagic(headerBytes, _magicNumbers);
       if (result != null) return result;
       if (_useDefault) {
-        result = _matchMagic(headerBytes, _DEFAULT_MAGIC_NUMBERS);
+        result = _matchMagic(headerBytes, DEFAULT_MAGIC_NUMBERS);
         if (result != null) return result;
       }
     }
@@ -79,7 +82,7 @@
     result = _extensionMap[ext];
     if (result != null) return result;
     if (_useDefault) {
-      result = _DEFAULT_EXTENSION_MAP[ext];
+      result = DEFAULT_EXTENSION_MAP[ext];
       if (result != null) return result;
     }
     return null;
@@ -106,11 +109,11 @@
     if (bytes.length > _magicNumbersMaxLength) {
       _magicNumbersMaxLength = bytes.length;
     }
-    _magicNumbers.add(new _MagicNumber(mimeType, bytes, mask: mask));
+    _magicNumbers.add(new MagicNumber(mimeType, bytes, mask: mask));
   }
 
   static String _matchMagic(List<int> headerBytes,
-                            List<_MagicNumber> magicNumbers) {
+                            List<MagicNumber> magicNumbers) {
     for (var mn in magicNumbers) {
       if (mn.matches(headerBytes)) return mn.mimeType;
     }
diff --git a/pkg/mime/pubspec.yaml b/pkg/mime/pubspec.yaml
index 0ce9b2a..b44361b 100644
--- a/pkg/mime/pubspec.yaml
+++ b/pkg/mime/pubspec.yaml
@@ -1,9 +1,9 @@
 name: mime
-version: 0.9.0
+version: 0.9.0+1
 author: Dart Team <misc@dartlang.org>
 description: Helper-package for working with MIME.
 homepage: http://www.dartlang.org
-dev_dependencies:
-  unittest: ">=0.9.0 <0.10.0"
 environment:
-  sdk: ">=0.8.10+6 <2.0.0"
+  sdk: '>=1.0.0 <2.0.0'
+dev_dependencies:
+  unittest: '>=0.9.0 <0.11.0'
diff --git a/pkg/mime/test/mime_multipart_transformer_test.dart b/pkg/mime/test/mime_multipart_transformer_test.dart
index 7d7baca..7bc2d7d 100644
--- a/pkg/mime/test/mime_multipart_transformer_test.dart
+++ b/pkg/mime/test/mime_multipart_transformer_test.dart
@@ -2,12 +2,13 @@
 // 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:unittest/unittest.dart";
-import "package:mime/mime.dart";
 import 'dart:async';
 import 'dart:math';
 
-void testParse(String message,
+import "package:unittest/unittest.dart";
+import "package:mime/mime.dart";
+
+void _testParse(String message,
                String boundary,
                [List<Map> expectedHeaders,
                 List expectedParts,
@@ -67,20 +68,9 @@
   });
 }
 
-void testParseValid() {
-  String message;
-  Map headers;
-  Map headers1;
-  Map headers2;
-  Map headers3;
-  Map headers4;
-  String body1;
-  String body2;
-  String body3;
-  String body4;
-
+void _testParseValid() {
   // Sample from Wikipedia.
-  message = """
+  var message = """
 This is a message with multiple parts in MIME format.\r
 --frontier\r
 Content-Type: text/plain\r
@@ -93,14 +83,14 @@
 PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
 Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=\r
 --frontier--\r\n""";
-  headers1 = <String, String>{"content-type": "text/plain"};
-  headers2 = <String, String>{"content-type": "application/octet-stream",
+  var headers1 = <String, String>{"content-type": "text/plain"};
+  var headers2 = <String, String>{"content-type": "application/octet-stream",
                               "content-transfer-encoding": "base64"};
-  body1 = "This is the body of the message.";
-  body2 = """
+  var body1 = "This is the body of the message.";
+  var body2 = """
 PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
 Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=""";
-  testParse(message, "frontier", [headers1, headers2], [body1, body2]);
+  _testParse(message, "frontier", [headers1, headers2], [body1, body2]);
 
   // Sample from HTML 4.01 Specification.
   message = """
@@ -122,7 +112,7 @@
   };
   body1 = "Larry";
   body2 = "... contents of file1.txt ...";
-  testParse(message, "AaB03x", [headers1, headers2], [body1, body2]);
+  _testParse(message, "AaB03x", [headers1, headers2], [body1, body2]);
 
   // Longer form from submitting the following from Chrome.
   //
@@ -164,15 +154,15 @@
       "content-disposition": "form-data; name=\"text_input\""};
   headers2 = <String, String>{
       "content-disposition": "form-data; name=\"password_input\""};
-  headers3 = <String, String>{
+  var headers3 = <String, String>{
       "content-disposition": "form-data; name=\"checkbox_input\""};
-  headers4 = <String, String>{
+  var headers4 = <String, String>{
       "content-disposition": "form-data; name=\"radio_input\""};
   body1 = "text";
   body2 = "password";
-  body3 = "on";
-  body4 = "on";
-  testParse(message,
+  var body3 = "on";
+  var body4 = "on";
+  _testParse(message,
             "----WebKitFormBoundaryQ3cgYAmGRF8yOeYB",
             [headers1, headers2, headers3, headers4],
             [body1, body2, body3, body4]);
@@ -196,7 +186,7 @@
 \r
 on\r
 -----------------------------52284550912143824192005403738--\r\n""";
-  testParse(message,
+  _testParse(message,
             "---------------------------52284550912143824192005403738",
             [headers1, headers2, headers3, headers4],
             [body1, body2, body3, body4]);
@@ -220,7 +210,7 @@
 \r
 on\r
 -----------------------------7dc8f38c60326--\r\n""";
-  testParse(message,
+  _testParse(message,
             "---------------------------7dc8f38c60326",
             [headers1, headers2, headers3, headers4],
             [body1, body2, body3, body4]);
@@ -261,7 +251,7 @@
 --\r\r\r
 -\r\r
 --boundary--\r\n""";
-  headers = <String, String>{"content-type": "text/plain"};
+  var headers = <String, String>{"content-type": "text/plain"};
   body1 = """
 -\r
 --\r
@@ -282,7 +272,7 @@
 --b\r\r\r\r
 --\r\r\r
 -\r""";
-  testParse(message, "boundary", [headers, headers], [body1, body2]);
+  _testParse(message, "boundary", [headers, headers], [body1, body2]);
 
   // Without initial CRLF.
   message = """
@@ -295,14 +285,12 @@
 \r
 Body2\r
 --xxx--\r\n""";
-  testParse(message, "xxx", null, ["\r\nBody 1", "\r\nBody2"]);
+  _testParse(message, "xxx", null, ["\r\nBody 1", "\r\nBody2"]);
 }
 
-void testParseInvalid() {
-  String message;
-
+void _testParseInvalid() {
   // Missing end boundary.
-  message = """
+  var message = """
 \r
 --xxx\r
 \r
@@ -313,10 +301,10 @@
 \r
 Body2\r
 --xxx\r\n""";
-  testParse(message, "xxx", null, [null, null], true);
+  _testParse(message, "xxx", null, [null, null], true);
 }
 
 void main() {
-  testParseValid();
-  testParseInvalid();
+  _testParseValid();
+  _testParseInvalid();
 }
diff --git a/pkg/mime/test/mime_type_test.dart b/pkg/mime/test/mime_type_test.dart
index 36c728d..23cc10e 100644
--- a/pkg/mime/test/mime_type_test.dart
+++ b/pkg/mime/test/mime_type_test.dart
@@ -2,10 +2,13 @@
 // 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:unittest/unittest.dart";
-import 'package:mime/mime.dart';
+import 'dart:math' as math;
 
-void expectMimeType(String path,
+import 'package:unittest/unittest.dart';
+import 'package:mime/mime.dart';
+import 'package:mime/src/magic_number.dart';
+
+void _expectMimeType(String path,
                     String expectedMimeType,
                     {List<int> headerBytes,
                      MimeTypeResolver resolver}) {
@@ -16,51 +19,49 @@
     mimeType = resolver.lookup(path, headerBytes: headerBytes);
   }
 
-  if (mimeType != expectedMimeType) {
-    throw "Expect '$expectedMimeType' but got '$mimeType'";
-  }
+  expect(mimeType, expectedMimeType);
 }
 
 void main() {
   group('global-lookup', () {
     test('by-path', () {
-      expectMimeType('file.dart', 'application/dart');
+      _expectMimeType('file.dart', 'application/dart');
       // Test mixed-case
-      expectMimeType('file.DaRT', 'application/dart');
-      expectMimeType('file.html', 'text/html');
-      expectMimeType('file.xhtml', 'application/xhtml+xml');
-      expectMimeType('file.jpeg', 'image/jpeg');
-      expectMimeType('file.jpg', 'image/jpeg');
-      expectMimeType('file.png', 'image/png');
-      expectMimeType('file.gif', 'image/gif');
-      expectMimeType('file.cc', 'text/x-c');
-      expectMimeType('file.c', 'text/x-c');
-      expectMimeType('file.css', 'text/css');
-      expectMimeType('file.js', 'application/javascript');
-      expectMimeType('file.ps', 'application/postscript');
-      expectMimeType('file.pdf', 'application/pdf');
-      expectMimeType('file.tiff', 'image/tiff');
-      expectMimeType('file.tif', 'image/tiff');
+      _expectMimeType('file.DaRT', 'application/dart');
+      _expectMimeType('file.html', 'text/html');
+      _expectMimeType('file.xhtml', 'application/xhtml+xml');
+      _expectMimeType('file.jpeg', 'image/jpeg');
+      _expectMimeType('file.jpg', 'image/jpeg');
+      _expectMimeType('file.png', 'image/png');
+      _expectMimeType('file.gif', 'image/gif');
+      _expectMimeType('file.cc', 'text/x-c');
+      _expectMimeType('file.c', 'text/x-c');
+      _expectMimeType('file.css', 'text/css');
+      _expectMimeType('file.js', 'application/javascript');
+      _expectMimeType('file.ps', 'application/postscript');
+      _expectMimeType('file.pdf', 'application/pdf');
+      _expectMimeType('file.tiff', 'image/tiff');
+      _expectMimeType('file.tif', 'image/tiff');
     });
 
     test('unknown-mime-type', () {
-      expectMimeType('file.unsupported-extension', null);
+      _expectMimeType('file.unsupported-extension', null);
     });
 
     test('by-header-bytes', () {
-      expectMimeType('file.jpg',
+      _expectMimeType('file.jpg',
                      'image/png',
                      headerBytes: [0x89, 0x50, 0x4E, 0x47,
                                    0x0D, 0x0A, 0x1A, 0x0A]);
-      expectMimeType('file.jpg',
+      _expectMimeType('file.jpg',
                      'image/gif',
                      headerBytes: [0x47, 0x49, 0x46, 0x38, 0x39,
                                    0x61, 0x0D, 0x0A, 0x1A, 0x0A]);
-      expectMimeType('file.gif',
+      _expectMimeType('file.gif',
                      'image/jpeg',
                      headerBytes: [0xFF, 0xD8, 0x46, 0x38, 0x39,
                                    0x61, 0x0D, 0x0A, 0x1A, 0x0A]);
-      expectMimeType('file.mp4',
+      _expectMimeType('file.mp4',
                      'video/mp4',
                      headerBytes: [0x00, 0x00, 0x00, 0x04, 0x66, 0x74,
                                    0x79, 0x70, 0x33, 0x67, 0x70, 0x35]);
@@ -71,13 +72,13 @@
     test('override-extension', () {
       var resolver = new MimeTypeResolver();
       resolver.addExtension('jpg', 'my-mime-type');
-      expectMimeType('file.jpg', 'my-mime-type', resolver: resolver);
+      _expectMimeType('file.jpg', 'my-mime-type', resolver: resolver);
     });
 
     test('fallthrough-extension', () {
       var resolver = new MimeTypeResolver();
       resolver.addExtension('jpg2', 'my-mime-type');
-      expectMimeType('file.jpg', 'image/jpeg', resolver: resolver);
+      _expectMimeType('file.jpg', 'image/jpeg', resolver: resolver);
     });
 
     test('with-mask', () {
@@ -85,19 +86,26 @@
       resolver.addMagicNumber([0x01, 0x02, 0x03],
                               'my-mime-type',
                               mask: [0x01, 0xFF, 0xFE]);
-      expectMimeType('file',
+      _expectMimeType('file',
                      'my-mime-type',
                      headerBytes: [0x01, 0x02, 0x03],
                      resolver: resolver);
-      expectMimeType('file',
+      _expectMimeType('file',
                      null,
                      headerBytes: [0x01, 0x03, 0x03],
                      resolver: resolver);
-      expectMimeType('file',
+      _expectMimeType('file',
                      'my-mime-type',
                      headerBytes: [0xFF, 0x02, 0x02],
                      resolver: resolver);
     });
   });
-}
 
+  test('default magic number', () {
+    var actualMaxBytes = DEFAULT_MAGIC_NUMBERS.fold(0, (previous, magic) {
+      return math.max(previous, magic.numbers.length);
+    });
+
+    expect(defaultMagicNumbersMaxLength, actualMaxBytes);
+  });
+}
diff --git a/pkg/mock/CHANGELOG.md b/pkg/mock/CHANGELOG.md
new file mode 100644
index 0000000..6fa4e03
--- /dev/null
+++ b/pkg/mock/CHANGELOG.md
@@ -0,0 +1,4 @@
+##0.11.0
+
+ * Removed deprecated `sharedLog`
+ * Improved support for calling arbitrary methods via a proxy
diff --git a/pkg/mock/lib/mock.dart b/pkg/mock/lib/mock.dart
index 768cae2..0732cb4 100644
--- a/pkg/mock/lib/mock.dart
+++ b/pkg/mock/lib/mock.dart
@@ -115,11 +115,3 @@
 export 'src/result_matcher.dart';
 export 'src/result_set_matcher.dart';
 export 'src/times_matcher.dart';
-
-import 'src/log_entry_list.dart';
-
-/**
- * [sharedLog] is not used in this library and is deprecated.
- */
-@deprecated
-LogEntryList sharedLog = null;
diff --git a/pkg/mock/lib/src/behavior.dart b/pkg/mock/lib/src/behavior.dart
index b43f699..7385a13 100644
--- a/pkg/mock/lib/src/behavior.dart
+++ b/pkg/mock/lib/src/behavior.dart
@@ -17,7 +17,7 @@
   List<Responder> actions; // The values to return/throw or proxies to call.
   bool logging = true;
 
-  Behavior (this.matcher) {
+  Behavior(this.matcher) {
     actions = new List<Responder>();
   }
 
diff --git a/pkg/mock/lib/src/log_entry_list.dart b/pkg/mock/lib/src/log_entry_list.dart
index 6c612ba..b96baab 100644
--- a/pkg/mock/lib/src/log_entry_list.dart
+++ b/pkg/mock/lib/src/log_entry_list.dart
@@ -101,7 +101,7 @@
       _mockFailureHandler =
           new _MockFailureHandler(getOrCreateExpectFailureHandler());
     }
-    expect(logs, matcher, reason:filter, failureHandler: _mockFailureHandler);
+    expect(logs, matcher, reason: filter, failureHandler: _mockFailureHandler);
     return this;
   }
 
diff --git a/pkg/mock/lib/src/mock.dart b/pkg/mock/lib/src/mock.dart
index 29598b8..bdbb8f3 100644
--- a/pkg/mock/lib/src/mock.dart
+++ b/pkg/mock/lib/src/mock.dart
@@ -25,7 +25,7 @@
   final String name;
 
   /** The set of [Behavior]s supported. */
-  final LinkedHashMap<String,Behavior> _behaviors;
+  final LinkedHashMap<String, Behavior> _behaviors;
 
   /** How to handle unknown method calls - swallow or throw. */
   final bool _throwIfNoBehavior;
@@ -85,8 +85,8 @@
    * later.
    */
   Mock.spy(this._realObject, {this.name, this.log})
-    : _behaviors = null,
-     _throwIfNoBehavior = true {
+      : _behaviors = null,
+        _throwIfNoBehavior = true {
     logging = true;
   }
 
@@ -125,7 +125,7 @@
     } else if (invocation.isSetter) {
       method = 'set $method';
       // Remove the trailing '='.
-      if (method[method.length-1] == '=') {
+      if (method[method.length - 1] == '=') {
         method = method.substring(0, method.length - 1);
       }
     }
@@ -175,54 +175,9 @@
           }
           throw value;
         } else if (action == Action.PROXY) {
-          // TODO(gram): Replace all this with:
-          //     var rtn = reflect(value).apply(invocation.positionalArguments,
-          //         invocation.namedArguments);
-          // once that is supported.
-          var rtn;
-          switch (args.length) {
-            case 0:
-              rtn = value();
-              break;
-            case 1:
-              rtn = value(args[0]);
-              break;
-            case 2:
-              rtn = value(args[0], args[1]);
-              break;
-            case 3:
-              rtn = value(args[0], args[1], args[2]);
-              break;
-            case 4:
-              rtn = value(args[0], args[1], args[2], args[3]);
-              break;
-            case 5:
-              rtn = value(args[0], args[1], args[2], args[3], args[4]);
-              break;
-            case 6:
-              rtn = value(args[0], args[1], args[2], args[3],
-                  args[4], args[5]);
-              break;
-            case 7:
-              rtn = value(args[0], args[1], args[2], args[3],
-                  args[4], args[5], args[6]);
-              break;
-            case 8:
-              rtn = value(args[0], args[1], args[2], args[3],
-                  args[4], args[5], args[6], args[7]);
-              break;
-            case 9:
-              rtn = value(args[0], args[1], args[2], args[3],
-                  args[4], args[5], args[6], args[7], args[8]);
-              break;
-            case 9:
-              rtn = value(args[0], args[1], args[2], args[3],
-                  args[4], args[5], args[6], args[7], args[8], args[9]);
-              break;
-            default:
-              throw new Exception(
-                  "Cannot proxy calls with more than 10 parameters.");
-          }
+          var mir = reflect(value) as ClosureMirror;
+          var rtn = mir.invoke(#call, invocation.positionalArguments,
+              invocation.namedArguments).reflectee;
           if (_logging && b.logging) {
             log.add(new LogEntry(name, method, args, action, rtn));
           }
diff --git a/pkg/mock/lib/src/result_matcher.dart b/pkg/mock/lib/src/result_matcher.dart
index 08f89d6..aaf5806 100644
--- a/pkg/mock/lib/src/result_matcher.dart
+++ b/pkg/mock/lib/src/result_matcher.dart
@@ -21,7 +21,7 @@
 
   bool matches(item, Map matchState) {
     if (item is! LogEntry) {
-     return false;
+      return false;
     }
     // normalize the action; _PROXY is like _RETURN.
     Action eaction = item.action;
@@ -33,10 +33,11 @@
 
   Description describe(Description description) {
     description.add(' to ');
-    if (action == Action.RETURN || action == Action.PROXY)
+    if (action == Action.RETURN || action == Action.PROXY) {
       description.add('return ');
-    else
+    } else {
       description.add('throw ');
+    }
     return description.addDescriptionOf(value);
   }
 
diff --git a/pkg/mock/lib/src/result_set_matcher.dart b/pkg/mock/lib/src/result_set_matcher.dart
index 103ce78..d4c2177 100644
--- a/pkg/mock/lib/src/result_set_matcher.dart
+++ b/pkg/mock/lib/src/result_set_matcher.dart
@@ -92,7 +92,7 @@
       }
       mismatchDescription.add(' value that ');
       value.describeMismatch(entry.value, mismatchDescription,
-        matchState['state'], verbose);
+          matchState['state'], verbose);
       mismatchDescription.add(' at least once');
     } else {
       mismatchDescription.add('never did');
diff --git a/pkg/mock/pubspec.yaml b/pkg/mock/pubspec.yaml
index 2220370..99eb895 100644
--- a/pkg/mock/pubspec.yaml
+++ b/pkg/mock/pubspec.yaml
@@ -1,5 +1,5 @@
 name: mock
-version: 0.10.1-dev
+version: 0.11.0+1
 author: Dart Team <misc@dartlang.org>
 description: A library for mocking classes
 homepage: http://www.dartlang.org
@@ -9,4 +9,4 @@
 dependencies:
   matcher: '>=0.10.0 <0.11.0'
 dev_dependencies:
-  unittest: '>=0.10.0 <0.11.0'
+  unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/mock/test/mock_test.dart b/pkg/mock/test/mock_test.dart
index df8400f..a4f6db0 100644
--- a/pkg/mock/test/mock_test.dart
+++ b/pkg/mock/test/mock_test.dart
@@ -36,9 +36,9 @@
 LogEntryList makeTestLog() {
   var args = new List();
   return new LogEntryList('test')
-    ..add(makeTestLogEntry('a', args, 1000))
-    ..add(makeTestLogEntry('b', args, 2000))
-    ..add(makeTestLogEntry('c', args, 3000));
+      ..add(makeTestLogEntry('a', args, 1000))
+      ..add(makeTestLogEntry('b', args, 2000))
+      ..add(makeTestLogEntry('c', args, 3000));
 }
 
 void main() {
@@ -56,8 +56,7 @@
 
     var s = '${m.foo(1,2)}${m.foo(1,1)}${m.foo(9,10)}'
         '${m.bar(1,1)}${m.foo(1,2)}';
-    m.getLogs(callsTo('foo', anything, anything)).
-        verify(happenedExactly(4));
+    m.getLogs(callsTo('foo', anything, anything)).verify(happenedExactly(4));
     m.getLogs(callsTo('foo', 1, anything)).verify(happenedExactly(3));
     m.getLogs(callsTo('foo', 9, anything)).verify(happenedOnce);
     m.getLogs(callsTo('foo', anything, 2)).verify(happenedExactly(2));
@@ -157,8 +156,8 @@
 
   test('Mocking: Shared logList', () {
     var logList = new LogEntryList();
-    var m1 = new Mock.custom(name:'m1', log:logList);
-    var m2 = new Mock.custom(name:'m2', log:logList);
+    var m1 = new Mock.custom(name: 'm1', log: logList);
+    var m2 = new Mock.custom(name: 'm2', log: logList);
     m1.foo();
     m2.foo();
     m1.bar();
@@ -446,7 +445,7 @@
     result = logList.preceding(keyList);
     expect(result.logs, hasLength(0));
 
-    result = logList.preceding(keyList, includeKeys:true);
+    result = logList.preceding(keyList, includeKeys: true);
     expect(result.logs, hasLength(0));
 
     // Single key, distance 1, no restrictions.
@@ -460,26 +459,26 @@
 
     // Single key, distance 2, no restrictions.
 
-    result = logList.preceding(keyList, distance:2);
+    result = logList.preceding(keyList, distance: 2);
     expect(result.logs, orderedEquals([e1, e2]));
 
-    result = logList.following(keyList, distance:2);
+    result = logList.following(keyList, distance: 2);
     expect(result.logs, orderedEquals([e4, e5]));
 
     // Single key, distance 3, no restrictions.
 
-    result = logList.preceding(keyList, distance:3);
+    result = logList.preceding(keyList, distance: 3);
     expect(result.logs, orderedEquals([e0, e1, e2]));
 
-    result = logList.following(keyList, distance:3);
+    result = logList.following(keyList, distance: 3);
     expect(result.logs, orderedEquals([e4, e5, e6]));
 
     // Include keys in result
 
-    result = logList.preceding(keyList, distance:3, includeKeys:true);
+    result = logList.preceding(keyList, distance: 3, includeKeys: true);
     expect(result.logs, orderedEquals([e0, e1, e2, e3]));
 
-    result = logList.following(keyList, distance:3, includeKeys:true);
+    result = logList.following(keyList, distance: 3, includeKeys: true);
     expect(result.logs, orderedEquals([e3, e4, e5, e6]));
 
     // Restrict the matches
@@ -511,10 +510,10 @@
     result = logList.following(keyList);
     expect(result.logs, orderedEquals([e1, e4, e8]));
 
-    result = logList.preceding(keyList, includeKeys:true);
+    result = logList.preceding(keyList, includeKeys: true);
     expect(result.logs, orderedEquals([e0, e2, e3, e6, e7]));
 
-    result = logList.following(keyList, includeKeys:true);
+    result = logList.following(keyList, includeKeys: true);
     expect(result.logs, orderedEquals([e0, e1, e3, e4, e7, e8]));
 
     keyList.logs.clear();
@@ -528,10 +527,10 @@
     result = logList.following(keyList);
     expect(result.logs, orderedEquals([e4, e8]));
 
-    result = logList.preceding(keyList, includeKeys:true);
+    result = logList.preceding(keyList, includeKeys: true);
     expect(result.logs, orderedEquals([e2, e3, e6, e7, e9, e10]));
 
-    result = logList.following(keyList, includeKeys:true);
+    result = logList.following(keyList, includeKeys: true);
     expect(result.logs, orderedEquals([e3, e4, e7, e8, e10]));
 
     keyList.logs.clear();
@@ -546,10 +545,10 @@
     result = logList.following(keyList);
     expect(result.logs, orderedEquals([e1, e4, e8]));
 
-    result = logList.preceding(keyList, includeKeys:true);
+    result = logList.preceding(keyList, includeKeys: true);
     expect(result.logs, orderedEquals([e0, e2, e3, e6, e7, e9, e10]));
 
-    result = logList.following(keyList, includeKeys:true);
+    result = logList.following(keyList, includeKeys: true);
     expect(result.logs, orderedEquals([e0, e1, e3, e4, e7, e8, e10]));
 
     keyList.logs.clear();
@@ -557,13 +556,13 @@
     keyList.add(e3);
     keyList.add(e7);
 
-    result = logList.preceding(keyList, distance:3);
+    result = logList.preceding(keyList, distance: 3);
     expect(result.logs, orderedEquals([e1, e2, e4, e5, e6]));
 
-    result = logList.following(keyList, distance:3);
+    result = logList.following(keyList, distance: 3);
     expect(result.logs, orderedEquals([e1, e2, e4, e5, e6, e8, e9, e10]));
 
-    result = logList.preceding(keyList, distance:3, includeKeys:true);
+    result = logList.preceding(keyList, distance: 3, includeKeys: true);
     expect(result.logs, orderedEquals([e0, e1, e2, e3, e4, e5, e6, e7]));
 
     result = logList.following(keyList, distance:3, includeKeys:true);
@@ -575,17 +574,17 @@
     keyList.add(e7);
     keyList.add(e10);
 
-    result = logList.preceding(keyList, distance:3);
+    result = logList.preceding(keyList, distance: 3);
     expect(result.logs, orderedEquals([e0, e1, e2, e4, e5, e6, e8, e9]));
 
-    result = logList.following(keyList, distance:3);
+    result = logList.following(keyList, distance: 3);
     expect(result.logs, orderedEquals([e4, e5, e6, e8, e9]));
 
     result = logList.preceding(keyList, distance:3, includeKeys:true);
     expect(result.logs, orderedEquals([e0, e1, e2, e3, e4, e5, e6,
                                        e7, e8, e9, e10]));
 
-    result = logList.following(keyList, distance:3, includeKeys:true);
+    result = logList.following(keyList, distance: 3, includeKeys: true);
     expect(result.logs, orderedEquals([e3, e4, e5, e6, e7, e8, e9, e10]));
 
     keyList.logs.clear();
@@ -594,10 +593,10 @@
     keyList.add(e7);
     keyList.add(e10);
 
-    result = logList.preceding(keyList, distance:3);
+    result = logList.preceding(keyList, distance: 3);
     expect(result.logs, orderedEquals([e1, e2, e4, e5, e6, e8, e9]));
 
-    result = logList.following(keyList, distance:3);
+    result = logList.following(keyList, distance: 3);
     expect(result.logs, orderedEquals([e1, e2, e4, e5, e6, e8, e9]));
 
     result = logList.preceding(keyList, distance:3, includeKeys:true);
@@ -617,9 +616,9 @@
     }
     int total = 0;
     logList.stepwiseValidate((log, pos) {
-        total += log[pos].args[0] * log[pos + 1].args[0];
-        expect(log[pos + 1].args[0] - log[pos].args[0], equals(1));
-        return 2;
+      total += log[pos].args[0] * log[pos + 1].args[0];
+      expect(log[pos + 1].args[0] - log[pos].args[0], equals(1));
+      return 2;
     });
     expect(total, equals((0 * 1) + (2 * 3) + (4 * 5) + (6 * 7) + (8 * 9)));
   });
@@ -650,7 +649,7 @@
         isTrue);
     m2.clearLogs();
     expect(log.logs, hasLength(3));
-    expect(log.logs.every((e) => e.mockName =='m3'), isTrue);
+    expect(log.logs.every((e) => e.mockName == 'm3'), isTrue);
     m3.clearLogs();
     expect(log.logs, hasLength(0));
   });
diff --git a/pkg/mutation_observer/test/mutation_observer_test.dart b/pkg/mutation_observer/test/mutation_observer_test.dart
index e3bbdf4..6f257e4f 100644
--- a/pkg/mutation_observer/test/mutation_observer_test.dart
+++ b/pkg/mutation_observer/test/mutation_observer_test.dart
@@ -55,7 +55,7 @@
         }
       }
 
-      return expectAsyncUntil2(callback, () => done);
+      return expectAsyncUntil(callback, () => done);
     }
 
     test('empty options is syntax error', () {
diff --git a/pkg/observe/pubspec.yaml b/pkg/observe/pubspec.yaml
index 83b924c..4161d8af 100644
--- a/pkg/observe/pubspec.yaml
+++ b/pkg/observe/pubspec.yaml
@@ -10,7 +10,7 @@
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
   analyzer: '>=0.13.0 <0.14.0'
-  barback: '>=0.9.0 <0.14.0'
+  barback: '>=0.9.0 <0.15.0'
   logging: '>=0.9.0 <0.10.0'
   path: '>=0.9.0 <2.0.0'
   smoke: '>=0.1.0-pre.0 <0.2.0'
diff --git a/pkg/pkg.status b/pkg/pkg.status
index d0ea50e..7b1559c 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -18,9 +18,6 @@
 scheduled_test/test/scheduled_process_test: Pass, Slow # Issue 9231
 polymer/test/build/script_compactor_test: Pass, Slow
 
-[ $compiler == dart2js && $browser ]
-polymer/test/attr_mustache_test: CompileTimeError # Issue 18667
-
 [ $runtime == vm && $mode == debug]
 analysis_server/test/analysis_server_test: Pass, Timeout
 analysis_server/test/domain_context_test: Pass, Timeout
@@ -107,6 +104,7 @@
 polymer/test/template_distribute_dynamic_test: Skip #uses dart:html
 polymer/test/unbind_test: Skip # uses dart:html
 third_party/angular_tests/browser_test: Skip # uses dart:html
+web_components/test/location_wrapper_test: Skip # uses dart:html
 
 [$compiler == dart2dart]
 *: Skip
@@ -135,6 +133,7 @@
 
 [ $runtime == ie10 ]
 typed_data/test/typed_buffers_test/none: Fail # Issue   17607 (I put this here explicitly, since this is not the same as on ie9)
+polymer/test/register_test: Fail # Issue 18870
 
 [ $runtime == safari || $runtime == safarimobilesim ]
 # Unexplained errors only occuring on Safari.
@@ -145,6 +144,7 @@
 path/test/browser_test: Fail, OK # Uses dart:html
 intl/test/find_default_locale_browser_test: Skip
 intl/test/date_time_format_http_request_test: Skip
+third_party/angular_tests/vm_test: Fail # Uses removed APIs. See issue 18733.
 
 [ $runtime == vm && $system == windows ]
 intl/test/find_default_locale_standalone_test: Fail # Issue 8110
@@ -217,6 +217,7 @@
 path/test/io_test: Fail, OK # Uses dart:io.
 polymer/test/build/*: Fail, OK # Uses dart:io.
 shelf/test/shelf_io_test: Fail, OK # Uses dart:io
+shelf_web_socket/test/*: Fail, OK # Uses dart:io.
 smoke/test/codegen/end_to_end_test: Skip # Uses dart:io.
 smoke/test/codegen/recorder_test: Skip # Uses dart:io.
 third_party/angular_tests/browser_test/core_dom/cookies: Fail # Issue 16337
@@ -235,6 +236,7 @@
 # Skip tests on the browser if the test depends on dart:io
 third_party/html5lib/test/parser_test: Skip
 third_party/html5lib/test/tokenizer_test: Skip
+third_party/html5lib/test/selectors/*: Skip
 
 polymer/test/unbind_test: Pass, Fail # Issue 15259
 
@@ -253,10 +255,9 @@
 [ $arch == simarm && $checked ]
 watcher/test/directory_watcher/linux_test: Skip # Issue 16118
 
-[ $arch == simmips && $checked ]
-http/test/http_test: Pass, Crash # Issue 18015
-
 [ $arch == simarm64 ]
+# Timeout. These are not unit tests. They do not run efficiently on our
+# simulator.
 *: Skip
 
 # Skip serialization test that explicitly has no library declaration in the
@@ -321,6 +322,7 @@
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 matcher/test/matchers_test: StaticWarning, OK # testing error creating abstract class
+third_party/angular_tests/vm_test: StaticWarning # Uses removed APIs. See issue 18733.
 
 [ $runtime == vm && ($system == windows || $system == macos) ]
 watcher/test/*/linux_test: Skip
diff --git a/pkg/pkgbuild.status b/pkg/pkgbuild.status
index 836631d..d473ea5 100644
--- a/pkg/pkgbuild.status
+++ b/pkg/pkgbuild.status
@@ -16,6 +16,7 @@
 
 [ $use_public_packages ]
 samples/third_party/angular_todo: Pass, Slow
+pkg/third_party/html5lib: PubGetError # csslib needs to be published
 
 [ $use_public_packages && $builder_tag == russian ]
 samples/third_party/todomvc: Fail # Issue 18104
diff --git a/pkg/polymer/lib/polymer.dart b/pkg/polymer/lib/polymer.dart
index 66428bd..3634266 100644
--- a/pkg/polymer/lib/polymer.dart
+++ b/pkg/polymer/lib/polymer.dart
@@ -69,7 +69,6 @@
 
 import 'package:logging/logging.dart' show Logger, Level;
 import 'package:observe/observe.dart';
-import 'package:path/path.dart' as path;
 import 'package:polymer_expressions/polymer_expressions.dart'
     show PolymerExpressions;
 import 'package:smoke/smoke.dart' as smoke;
diff --git a/pkg/polymer/lib/src/build/script_compactor.dart b/pkg/polymer/lib/src/build/script_compactor.dart
index b90dfe1..765c463 100644
--- a/pkg/polymer/lib/src/build/script_compactor.dart
+++ b/pkg/polymer/lib/src/build/script_compactor.dart
@@ -269,7 +269,8 @@
       var attrs = publishedAttributes[tagName];
       if (attrs == null) continue;
       for (var attr in attrs) {
-        recorder.lookupMember(cls, attr, recursive: true);
+        recorder.lookupMember(cls, attr, recursive: true,
+            includeUpTo: types.htmlElementElement);
       }
     }
   }
diff --git a/pkg/polymer/lib/src/instance.dart b/pkg/polymer/lib/src/instance.dart
index 5abafe0..4dcca03 100644
--- a/pkg/polymer/lib/src/instance.dart
+++ b/pkg/polymer/lib/src/instance.dart
@@ -79,6 +79,26 @@
     (js.context['Polymer'] as JsFunction).apply([name]);
   }
 
+  /// Register a custom element that has no associated `<polymer-element>`.
+  /// Unlike [register] this will always perform synchronous registration and
+  /// by the time this method returns the element will be available using
+  /// [document.createElement] or by modifying the HTML to include the element.
+  static void registerSync(String name, Type type,
+      {String extendsTag, Document doc, Node template}) {
+
+    // Our normal registration, this will queue up the name->type association.
+    register(name, type);
+
+    // Build a polymer-element and initialize it to register
+    if (doc == null) doc = document;
+    var poly = doc.createElement('polymer-element');
+    poly.attributes['name'] = name;
+    if (extendsTag != null) poly.attributes['extends'] = extendsTag;
+    if (template != null) poly.append(template);
+
+    new JsObject.fromBrowserObject(poly).callMethod('init');
+  }
+
   /// The one syntax to rule them all.
   static final BindingDelegate _polymerSyntax =
       new PolymerExpressionsWithEvents();
@@ -626,14 +646,15 @@
     _observers = null;
   }
 
-  /// Bind a [property] in this object to a [path] in model. *Note* in Dart it
+  /// Bind the [name] property in this element to [bindable]. *Note* in Dart it
   /// is necessary to also define the field:
   ///
   ///     var myProperty;
   ///
   ///     ready() {
   ///       super.ready();
-  ///       bindProperty(#myProperty, this, 'myModel.path.to.otherProp');
+  ///       bindProperty(#myProperty,
+  ///           new PathObserver(this, 'myModel.path.to.otherProp'));
   ///     }
   Bindable bindProperty(Symbol name, Bindable bindable) {
     // Dart note: normally we only reach this code when we know it's a
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index 339bd87..4a43d08 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.10.0-pre.11.dev
+version: 0.10.0-pre.12
 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
@@ -9,7 +9,7 @@
 dependencies:
   analyzer: '>=0.13.0 <0.14.0'
   args: '>=0.10.0 <0.12.0'
-  barback: '>=0.9.0 <0.14.0'
+  barback: '>=0.9.0 <0.15.0'
   browser: '>=0.10.0 <0.11.0'
   code_transformers: '>=0.1.0 <0.2.0'
   html5lib: '>=0.10.0 <0.11.0'
@@ -17,7 +17,7 @@
   observe: '>=0.10.0-pre.0 <0.11.0'
   path: '>=0.9.0 <2.0.0'
   polymer_expressions: '>=0.10.0-pre.1 <0.11.0'
-  smoke: '>=0.1.0-pre.2 <0.2.0'
+  smoke: '>=0.1.0-pre.5 <0.2.0'
   source_maps: '>=0.9.0 <0.10.0'
   template_binding: '>=0.10.0-pre.1 <0.11.0'
   web_components: '>=0.3.3 <0.4.0'
diff --git a/pkg/polymer/test/event_handlers_test.dart b/pkg/polymer/test/event_handlers_test.dart
index 567cea5..ae4a05c 100644
--- a/pkg/polymer/test/event_handlers_test.dart
+++ b/pkg/polymer/test/event_handlers_test.dart
@@ -17,8 +17,8 @@
   int _testCount = 0;
   String _lastEvent;
   String _lastMessage;
-  List list1 = [];
-  List list2 = [];
+  List list1 = toObservable([]);
+  List list2 = toObservable([]);
   Future _onTestDone;
 
   XTest.created() : super.created();
diff --git a/pkg/polymer/test/register_test.dart b/pkg/polymer/test/register_test.dart
index f5f2bda..c0ab7d3 100644
--- a/pkg/polymer/test/register_test.dart
+++ b/pkg/polymer/test/register_test.dart
@@ -3,9 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:html';
+import 'package:polymer/polymer.dart';
 import 'package:unittest/unittest.dart';
 import 'package:unittest/html_config.dart';
-import 'package:polymer/polymer.dart';
 
 @CustomTag('x-html')
 class XHtmlElement extends PolymerElement {
@@ -27,6 +27,19 @@
   XDiv2Element.created() : super.created();
 }
 
+/// Dart-specific test:
+/// This element is registered from code without an associated polymer-element.
+class XPolymerElement extends PolymerElement {
+  XPolymerElement.created() : super.created();
+}
+
+/// Dart-specific test:
+/// This element is registered from code without an associated polymer-element.
+class XButtonElement extends ButtonElement with Polymer, Observable {
+  XButtonElement.created() : super.created();
+}
+
+
 @initMethod
 main() {
   useHtmlConfiguration();
@@ -39,4 +52,30 @@
     expect(querySelector('#x-div') is XDivElement, isTrue);
     expect(querySelector('#x-div-two') is XDiv2Element, isTrue);
   });
+
+  group('register without polymer-element', () {
+    test('custom element', () {
+      Polymer.registerSync('x-polymer', XPolymerElement,
+          template: new Element.html('<template>FOOBAR'));
+
+      expect(document.createElement('x-polymer') is XPolymerElement, isTrue,
+          reason: 'should have been registered');
+
+      var e = document.querySelector('x-polymer');
+      expect(e is XPolymerElement, isTrue,
+          reason: 'elements on page should be upgraded');
+      expect(e.shadowRoot, isNotNull,
+          reason: 'shadowRoot was created from template');
+      expect(e.shadowRoot.nodes[0].text, 'FOOBAR');
+    });
+
+    test('type extension', () {
+      Polymer.registerSync('x-button', XButtonElement, extendsTag: 'button');
+
+      expect(document.createElement('button', 'x-button') is XButtonElement,
+          isTrue, reason: 'should have been registered');
+      expect(document.querySelector('[is=x-button]') is XButtonElement, isTrue,
+          reason: 'elements on page should be upgraded');
+    });
+  });
 }
diff --git a/pkg/polymer/test/register_test.html b/pkg/polymer/test/register_test.html
index 8a3bcb6..93d565f 100644
--- a/pkg/polymer/test/register_test.html
+++ b/pkg/polymer/test/register_test.html
@@ -30,6 +30,9 @@
     <div is='x-div' id='x-div'></div>
     <div is='x-div-two' id='x-div-two'></div>
 
+    <button is='x-button'></button>
+    <x-polymer></x-polymer>
+
   <script type="application/dart;component=1" src="register_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer_expressions/lib/eval.dart b/pkg/polymer_expressions/lib/eval.dart
index 2332cf9..c33a262 100644
--- a/pkg/polymer_expressions/lib/eval.dart
+++ b/pkg/polymer_expressions/lib/eval.dart
@@ -80,7 +80,7 @@
  * operators or function invocations, and any index operations must use a
  * literal index.
  */
-void assign(Expression expr, Object value, Scope scope) {
+Object assign(Expression expr, Object value, Scope scope) {
 
   notAssignable() =>
       throw new EvalException("Expression is not assignable: $expr");
@@ -140,6 +140,7 @@
   } else {
     smoke.write(o, smoke.nameToSymbol(property), value);
   }
+  return value;
 }
 
 
diff --git a/pkg/polymer_expressions/lib/polymer_expressions.dart b/pkg/polymer_expressions/lib/polymer_expressions.dart
index f26c2f3..ac939d8 100644
--- a/pkg/polymer_expressions/lib/polymer_expressions.dart
+++ b/pkg/polymer_expressions/lib/polymer_expressions.dart
@@ -123,8 +123,9 @@
   }
 
   _setValue(v) {
+    var oldValue = _value;
     _value = _convertValue(v, _scope, _converter);
-    if (_callback != null) _callback(_value);
+    if (_callback != null && oldValue != _value) _callback(_value);
   }
 
   static _convertValue(v, scope, converter) {
@@ -145,7 +146,8 @@
 
   set value(v) {
     try {
-      assign(_expr, v, _scope);
+      var newValue = assign(_expr, v, _scope);
+      _value = _convertValue(newValue, _scope, _converter);
     } catch (e, s) {
       new Completer().completeError(
           "Error evaluating expression '$_expr': $e", s);
diff --git a/pkg/polymer_expressions/pubspec.yaml b/pkg/polymer_expressions/pubspec.yaml
index 28ec61c..1035fc2 100644
--- a/pkg/polymer_expressions/pubspec.yaml
+++ b/pkg/polymer_expressions/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer_expressions
-version: 0.10.0-pre.2.dev
+version: 0.10.0-pre.2
 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/
diff --git a/pkg/polymer_expressions/test/bindings_test.dart b/pkg/polymer_expressions/test/bindings_test.dart
index 957b358..5e681c9 100644
--- a/pkg/polymer_expressions/test/bindings_test.dart
+++ b/pkg/polymer_expressions/test/bindings_test.dart
@@ -82,8 +82,9 @@
           '<template><input id="i1" value={{x}}></template>'));
       testDiv.append(template.createInstance(model, new PolymerExpressions()));
 
+      var el;
       return new Future(() {
-        var el = testDiv.query("#i1");
+        el = testDiv.query("#i1");
         var subscription = el.onInput.listen(expectAsync((_) {}, count: 1));
         el.focus();
 
@@ -113,8 +114,19 @@
         // selection will be preserved.
         expect(el.selectionStart, 4);
         expect(el.selectionEnd, 4);
-
         subscription.cancel();
+      }).then(_nextMicrotask).then((_) {
+        // Nothing changes on the next micro task.
+        expect(el.selectionStart, 4);
+        expect(el.selectionEnd, 4);
+      }).then((_) => window.animationFrame).then((_) {
+        // ... or on the next animation frame.
+        expect(el.selectionStart, 4);
+        expect(el.selectionEnd, 4);
+      }).then(_afterTimeout).then((_) {
+        // ... or later.
+        expect(el.selectionStart, 4);
+        expect(el.selectionEnd, 4);
       });
     });
 
@@ -142,6 +154,7 @@
 });
 
 _nextMicrotask(_) => new Future(() {});
+_afterTimeout(_) => new Future.delayed(new Duration(milliseconds: 30), () {});
 
 @reflectable
 class NotifyModel extends ChangeNotifier {
diff --git a/pkg/scheduled_test/CHANGELOG.md b/pkg/scheduled_test/CHANGELOG.md
index 7f095a1..4ae4efb 100644
--- a/pkg/scheduled_test/CHANGELOG.md
+++ b/pkg/scheduled_test/CHANGELOG.md
@@ -1,6 +1,10 @@
+## 0.11.0+3
+
+* Support `v0.11.0` of `unittest`.
+
 ## 0.11.0+1
 
-* Support `v0.5.0` of `shelf`
+* Support `v0.5.0` of `shelf`.
 
 ## 0.11.0
 
diff --git a/pkg/scheduled_test/pubspec.yaml b/pkg/scheduled_test/pubspec.yaml
index 82fdb50..a89c40d 100644
--- a/pkg/scheduled_test/pubspec.yaml
+++ b/pkg/scheduled_test/pubspec.yaml
@@ -1,5 +1,5 @@
 name: scheduled_test
-version: 0.11.0+2
+version: 0.11.0+3
 author: Dart Team <misc@dartlang.org>
 homepage: http://www.dartlang.org
 description: >
@@ -14,6 +14,6 @@
   path: '>=0.9.0 <2.0.0'
   shelf: '>=0.4.0 <0.6.0'
   stack_trace: '>=0.9.1 <0.10.0'
-  unittest: '>=0.9.0 <0.11.0'
+  unittest: '>=0.9.0 <0.12.0'
 environment:
   sdk: '>=0.8.10+6 <2.0.0'
diff --git a/pkg/shelf/CHANGELOG.md b/pkg/shelf/CHANGELOG.md
index cbf2905..e6d1118ed 100644
--- a/pkg/shelf/CHANGELOG.md
+++ b/pkg/shelf/CHANGELOG.md
@@ -3,6 +3,11 @@
 * Add a `Cascade` helper that runs handlers in sequence until one returns a
   response that's neither a 404 nor a 405.
 
+* Add a `Request.change` method that copies a request with new header values.
+
+* Add a `Request.hijack` method that allows handlers to gain access to the
+  underlying HTTP socket.
+
 ## 0.5.1+1
 
 * Capture all asynchronous errors thrown by handlers if they would otherwise be
diff --git a/pkg/shelf/lib/shelf.dart b/pkg/shelf/lib/shelf.dart
index afb077e..98d7815 100644
--- a/pkg/shelf/lib/shelf.dart
+++ b/pkg/shelf/lib/shelf.dart
@@ -7,6 +7,7 @@
 export 'src/cascade.dart';
 export 'src/handler.dart';
 export 'src/handlers/logger.dart';
+export 'src/hijack_exception.dart';
 export 'src/middleware.dart';
 export 'src/pipeline.dart';
 export 'src/request.dart';
diff --git a/pkg/shelf/lib/shelf_io.dart b/pkg/shelf/lib/shelf_io.dart
index 1bd4f516..d8d4d9c 100644
--- a/pkg/shelf/lib/shelf_io.dart
+++ b/pkg/shelf/lib/shelf_io.dart
@@ -6,6 +6,8 @@
 ///
 /// One can provide an instance of [HttpServer] as the `requests` parameter in
 /// [serveRequests].
+///
+/// The `dart:io` adapter supports request hijacking; see [Request.hijack].
 library shelf.io;
 
 import 'dart:async';
@@ -53,15 +55,38 @@
 Future handleRequest(HttpRequest request, Handler handler) {
   var shelfRequest = _fromHttpRequest(request);
 
+  // TODO(nweiz): abstract out hijack handling to make it easier to implement an
+  // adapter.
   return syncFuture(() => handler(shelfRequest))
       .catchError((error, stackTrace) {
-    return _logError('Error thrown by handler\n$error', stackTrace);
+    if (error is HijackException) {
+      // A HijackException should bypass the response-writing logic entirely.
+      if (!shelfRequest.canHijack) throw error;
+
+      // If the request wasn't hijacked, we shouldn't be seeing this exception.
+      return _logError(
+          "Caught HijackException, but the request wasn't hijacked.",
+          stackTrace);
+    }
+
+    return _logError('Error thrown by handler.\n$error', stackTrace);
   }).then((response) {
     if (response == null) {
-      response = _logError('null response from handler');
+      response = _logError('null response from handler.');
+    } else if (!shelfRequest.canHijack) {
+      var message = new StringBuffer()
+          ..writeln("Got a response for hijacked request "
+              "${shelfRequest.method} ${shelfRequest.requestedUri}:")
+          ..writeln(response.statusCode);
+      response.headers.forEach((key, value) =>
+          message.writeln("${key}: ${value}"));
+      throw new Exception(message.toString().trim());
     }
 
     return _writeResponse(response, request.response);
+  }).catchError((error, stackTrace) {
+    // Ignore HijackExceptions.
+    if (error is! HijackException) throw error;
   });
 }
 
@@ -74,9 +99,14 @@
     headers[k] = v.join(',');
   });
 
+  onHijack(callback) {
+    return request.response.detachSocket(writeHeaders: false)
+        .then((socket) => callback(socket, socket));
+  }
+
   return new Request(request.method, request.requestedUri,
       protocolVersion: request.protocolVersion, headers: headers,
-      body: request);
+      body: request, onHijack: onHijack);
 }
 
 Future _writeResponse(Response response, HttpResponse httpResponse) {
diff --git a/pkg/shelf/lib/src/handlers/logger.dart b/pkg/shelf/lib/src/handlers/logger.dart
index 2e95cf9..e949c9b 100644
--- a/pkg/shelf/lib/src/handlers/logger.dart
+++ b/pkg/shelf/lib/src/handlers/logger.dart
@@ -6,6 +6,7 @@
 
 import 'package:stack_trace/stack_trace.dart';
 
+import '../hijack_exception.dart';
 import '../middleware.dart';
 import '../util.dart';
 
@@ -37,6 +38,8 @@
 
       return response;
     }, onError: (error, stackTrace) {
+      if (error is HijackException) throw error;
+
       var msg = _getErrorMessage(startTime, request.url, request.method,
           watch.elapsed, error, stackTrace);
 
diff --git a/pkg/shelf/lib/src/hijack_exception.dart b/pkg/shelf/lib/src/hijack_exception.dart
new file mode 100644
index 0000000..13c5054
--- /dev/null
+++ b/pkg/shelf/lib/src/hijack_exception.dart
@@ -0,0 +1,21 @@
+// 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 shelf.hijack_exception;
+
+/// An exception used to indicate that a request has been hijacked.
+///
+/// This shouldn't be captured by any code other than the Shelf adapter that
+/// created the hijackable request. Middleware that captures exceptions should
+/// make sure to pass on HijackExceptions.
+///
+/// See also [Request.hijack].
+class HijackException {
+  const HijackException();
+
+  String toString() =>
+      "A shelf request's underlying data stream was hijacked.\n"
+      "This exception is used for control flow and should only be handled by a "
+        "Shelf adapter.";
+}
diff --git a/pkg/shelf/lib/src/middleware.dart b/pkg/shelf/lib/src/middleware.dart
index e1a9f18..228761d 100644
--- a/pkg/shelf/lib/src/middleware.dart
+++ b/pkg/shelf/lib/src/middleware.dart
@@ -7,6 +7,7 @@
 import 'request.dart';
 import 'response.dart';
 import 'handler.dart';
+import 'hijack_exception.dart';
 import 'util.dart';
 
 /// A function which creates a new [Handler] by wrapping a [Handler].
@@ -21,6 +22,9 @@
 ///
 /// Common uses for middleware include caching, logging, and authentication.
 ///
+/// Middleware that captures exceptions should be sure to pass
+/// [HijackException]s on without modification.
+///
 /// A simple [Middleware] can be created using [createMiddleware].
 typedef Handler Middleware(Handler innerHandler);
 
@@ -40,8 +44,9 @@
 /// create a new response object.
 ///
 /// If provided, [errorHandler] receives errors thrown by the inner handler. It
-/// does not receive errors thrown by [requestHandler] or [responseHandler]. It
-/// can either return a new response or throw an error.
+/// does not receive errors thrown by [requestHandler] or [responseHandler], nor
+/// does it receive [HijackException]s. It can either return a new response or
+/// throw an error.
 Middleware createMiddleware({requestHandler(Request request),
     responseHandler(Response response),
     errorHandler(error, StackTrace stackTrace)}) {
@@ -56,7 +61,10 @@
 
         return syncFuture(() => innerHandler(request))
             .then((response) => responseHandler(response),
-                onError: errorHandler);
+                onError: (error, stackTrace) {
+          if (error is HijackException) throw error;
+          return errorHandler(error, stackTrace);
+        });
       });
     };
   };
diff --git a/pkg/shelf/lib/src/request.dart b/pkg/shelf/lib/src/request.dart
index 192a782..4a08468 100644
--- a/pkg/shelf/lib/src/request.dart
+++ b/pkg/shelf/lib/src/request.dart
@@ -8,9 +8,18 @@
 
 import 'package:http_parser/http_parser.dart';
 
+import 'hijack_exception.dart';
 import 'message.dart';
 import 'util.dart';
 
+/// A callback provided by a Shelf handler that's passed to [Request.hijack].
+typedef void HijackCallback(
+    Stream<List<int>> stream, StreamSink<List<int>> sink);
+
+/// A callback provided by a Shelf adapter that's used by [Request.hijack] to
+/// provide a [HijackCallback] with a socket.
+typedef void OnHijackCallback(HijackCallback callback);
+
 /// Represents an HTTP request to be processed by a Shelf application.
 class Request extends Message {
   /// The remainder of the [requestedUri] path and query designating the virtual
@@ -46,6 +55,17 @@
   /// The original [Uri] for the request.
   final Uri requestedUri;
 
+  /// The callback wrapper for hijacking this request.
+  ///
+  /// This will be `null` if this request can't be hijacked.
+  final _OnHijack _onHijack;
+
+  /// Whether this request can be hijacked.
+  ///
+  /// This will be `false` either if the adapter doesn't support hijacking, or
+  /// if the request has already been hijacked.
+  bool get canHijack => _onHijack != null && !_onHijack.called;
+
   /// If this is non-`null` and the requested resource hasn't been modified
   /// since this date and time, the server should return a 304 Not Modified
   /// response.
@@ -69,15 +89,43 @@
   /// [ArgumentError].
   ///
   /// The default value for [protocolVersion] is '1.1'.
+  ///
+  /// ## `onHijack`
+  ///
+  /// [onHijack] allows handlers to take control of the underlying socket for
+  /// the request. It should be passed by adapters that can provide access to
+  /// the bidirectional socket underlying the HTTP connection stream.
+  ///
+  /// The [onHijack] callback will only be called once per request. It will be
+  /// passed another callback which takes a byte stream and a byte sink.
+  /// [onHijack] must pass the stream and sink for the connection stream to this
+  /// callback, although it may do so asynchronously. Both parameters may be the
+  /// same object. If the user closes the sink, the adapter should ensure that
+  /// the stream is closed as well.
+  ///
+  /// If a request is hijacked, the adapter should expect to receive a
+  /// [HijackException] from the handler. This is a special exception used to
+  /// indicate that hijacking has occurred. The adapter should avoid either
+  /// sending a response or notifying the user of an error if a
+  /// [HijackException] is caught.
+  ///
+  /// An adapter can check whether a request was hijacked using [canHijack],
+  /// which will be `false` for a hijacked request. The adapter may throw an
+  /// error if a [HijackException] is received for a non-hijacked request, or if
+  /// no [HijackException] is received for a hijacked request.
+  ///
+  /// See also [hijack].
   // TODO(kevmoo) finish documenting the rest of the arguments.
   Request(this.method, Uri requestedUri, {String protocolVersion,
     Map<String, String> headers, Uri url, String scriptName,
-    Stream<List<int>> body, Map<String, Object> context})
+    Stream<List<int>> body, Map<String, Object> context,
+    OnHijackCallback onHijack})
       : this.requestedUri = requestedUri,
         this.protocolVersion = protocolVersion == null ?
             '1.1' : protocolVersion,
         this.url = _computeUrl(requestedUri, url, scriptName),
         this.scriptName = _computeScriptName(requestedUri, url, scriptName),
+        this._onHijack = onHijack == null ? null : new _OnHijack(onHijack),
         super(body == null ? new Stream.fromIterable([]) : body,
             headers: headers, context: context) {
     if (method.isEmpty) throw new ArgumentError('method cannot be empty.');
@@ -128,6 +176,52 @@
         protocolVersion: this.protocolVersion, headers: headers, url: this.url,
         scriptName: this.scriptName, body: this.read(), context: context);
   }
+
+  /// Takes control of the underlying request socket.
+  ///
+  /// Synchronously, this throws a [HijackException] that indicates to the
+  /// adapter that it shouldn't emit a response itself. Asynchronously,
+  /// [callback] is called with a [Stream<List<int>>] and
+  /// [StreamSink<List<int>>], respectively, that provide access to the
+  /// underlying request socket.
+  ///
+  /// If the sink is closed, the stream will be closed as well. The stream and
+  /// sink may be the same object, as in the case of a `dart:io` `Socket`
+  /// object.
+  ///
+  /// This may only be called when using a Shelf adapter that supports
+  /// hijacking, such as the `dart:io` adapter. In addition, a given request may
+  /// only be hijacked once. [canHijack] can be used to detect whether this
+  /// request can be hijacked.
+  void hijack(HijackCallback callback) {
+    if (_onHijack == null) {
+      throw new StateError("This request can't be hijacked.");
+    }
+
+    _onHijack.run(callback);
+    throw const HijackException();
+  }
+}
+
+/// A class containing a callback for [Request.hijack] that also tracks whether
+/// the callback has been called.
+class _OnHijack {
+  /// The callback.
+  final OnHijackCallback _callback;
+
+  /// Whether [this] has been called.
+  bool called = false;
+
+  _OnHijack(this._callback);
+
+  /// Calls [this].
+  ///
+  /// Throws a [StateError] if [this] has already been called.
+  void run(HijackCallback callback) {
+    if (called) throw new StateError("This request has already been hijacked.");
+    called = true;
+    newFuture(() => _callback(callback));
+  }
 }
 
 /// Computes `url` from the provided [Request] constructor arguments.
diff --git a/pkg/shelf/lib/src/util.dart b/pkg/shelf/lib/src/util.dart
index bb4847c..b668177 100644
--- a/pkg/shelf/lib/src/util.dart
+++ b/pkg/shelf/lib/src/util.dart
@@ -8,6 +8,10 @@
 
 import 'package:stack_trace/stack_trace.dart';
 
+/// Like [new Future], but avoids around issue 11911 by using [new Future.value]
+/// under the covers.
+Future newFuture(callback()) => new Future.value().then((_) => callback());
+
 /// Like [Future.sync], but wraps the Future in [Chain.track] as well.
 Future syncFuture(callback()) => Chain.track(new Future.sync(callback));
 
diff --git a/pkg/shelf/pubspec.yaml b/pkg/shelf/pubspec.yaml
index bd09077..daf3a94 100644
--- a/pkg/shelf/pubspec.yaml
+++ b/pkg/shelf/pubspec.yaml
@@ -1,10 +1,10 @@
 name: shelf
-version: 0.5.2-dev
+version: 0.5.2
 author: Dart Team <misc@dartlang.org>
 description: Web Server Middleware for Dart
 homepage: http://www.dartlang.org
 environment:
-  sdk: '>=1.2.0 <2.0.0'
+  sdk: '>=1.4.0-dev.5.0 <2.0.0'
 documentation: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf
 dependencies:
   collection: '>=0.9.1 <0.10.0'
diff --git a/pkg/shelf/test/create_middleware_test.dart b/pkg/shelf/test/create_middleware_test.dart
index 5c35f4d..ee01d07 100644
--- a/pkg/shelf/test/create_middleware_test.dart
+++ b/pkg/shelf/test/create_middleware_test.dart
@@ -202,6 +202,18 @@
 
       expect(makeSimpleRequest(handler), throwsA('bad handler'));
     });
+
+    test("doesn't handle HijackException", () {
+      var middleware = createMiddleware(errorHandler: (error, stack) {
+        expect(false, "error handler shouldn't be called");
+      });
+
+      var handler = const Pipeline().addMiddleware(middleware)
+          .addHandler((request) => throw const HijackException());
+
+      expect(makeSimpleRequest(handler),
+          throwsA(new isInstanceOf<HijackException>()));
+    });
   });
 }
 
diff --git a/pkg/shelf/test/hijack_test.dart b/pkg/shelf/test/hijack_test.dart
new file mode 100644
index 0000000..fa67a6d
--- /dev/null
+++ b/pkg/shelf/test/hijack_test.dart
@@ -0,0 +1,51 @@
+// 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 shelf.hijack_test;
+
+import 'dart:async';
+
+import 'package:unittest/unittest.dart';
+import 'package:shelf/shelf.dart';
+
+import 'test_util.dart';
+
+void main() {
+  test('hijacking a non-hijackable request throws a StateError', () {
+    expect(() => new Request('GET', LOCALHOST_URI).hijack((_, __) => null),
+        throwsStateError);
+  });
+
+  test('hijacking a hijackable request throws a HijackException and calls '
+      'onHijack', () {
+    var request = new Request('GET', LOCALHOST_URI,
+        onHijack: expectAsync((callback) {
+      var streamController = new StreamController();
+      streamController.add([1, 2, 3]);
+      streamController.close();
+
+      var sinkController = new StreamController();
+      expect(sinkController.stream.first, completion(equals([4, 5, 6])));
+
+      callback(streamController.stream, sinkController);
+    }));
+
+    expect(() => request.hijack(expectAsync((stream, sink) {
+      expect(stream.first, completion(equals([1, 2, 3])));
+      sink.add([4, 5, 6]);
+      sink.close();
+    })), throwsA(new isInstanceOf<HijackException>()));
+  });
+
+  test('hijacking a hijackable request twice throws a StateError', () {
+    // Assert that the [onHijack] callback is only called once.
+    var request = new Request('GET', LOCALHOST_URI,
+        onHijack: expectAsync((_) => null, count: 1));
+
+    expect(() => request.hijack((_, __) => null),
+        throwsA(new isInstanceOf<HijackException>()));
+
+    expect(() => request.hijack((_, __) => null), throwsStateError);
+  });
+}
diff --git a/pkg/shelf/test/log_middleware_test.dart b/pkg/shelf/test/log_middleware_test.dart
index b9a8304..e056504 100644
--- a/pkg/shelf/test/log_middleware_test.dart
+++ b/pkg/shelf/test/log_middleware_test.dart
@@ -58,4 +58,14 @@
 
     expect(makeSimpleRequest(handler), throwsA('testing logging throw'));
   });
+
+  test("doesn't log a HijackException", () {
+    var handler = const Pipeline()
+        .addMiddleware(logRequests(logger: logger))
+        .addHandler((request) => throw const HijackException());
+
+    expect(makeSimpleRequest(handler).whenComplete(() {
+      expect(gotLog, isFalse);
+    }), throwsA(new isInstanceOf<HijackException>()));
+  });
 }
diff --git a/pkg/shelf/test/shelf_io_test.dart b/pkg/shelf/test/shelf_io_test.dart
index bdece66..5205658 100644
--- a/pkg/shelf/test/shelf_io_test.dart
+++ b/pkg/shelf/test/shelf_io_test.dart
@@ -185,6 +185,39 @@
     });
   });
 
+  test('supports request hijacking', () {
+    _scheduleServer((request) {
+      expect(request.method, 'POST');
+
+      request.hijack(expectAsync((stream, sink) {
+        expect(stream.first, completion(equals("Hello".codeUnits)));
+
+        sink.add((
+            "HTTP/1.1 404 Not Found\r\n"
+            "Date: Mon, 23 May 2005 22:38:34 GMT\r\n"
+            "Content-Length: 13\r\n"
+            "\r\n"
+            "Hello, world!").codeUnits);
+        sink.close();
+      }));
+    });
+
+    return _schedulePost(body: "Hello").then((response) {
+      expect(response.statusCode, HttpStatus.NOT_FOUND);
+      expect(response.headers["date"], "Mon, 23 May 2005 22:38:34 GMT");
+      expect(response.stream.bytesToString(),
+          completion(equals("Hello, world!")));
+    });
+  });
+
+  test('reports an error if a HijackException is thrown without hijacking', () {
+    _scheduleServer((request) => throw const HijackException());
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.INTERNAL_SERVER_ERROR);
+    });
+  });
+
   test('passes asynchronous exceptions to the parent error zone', () {
     return runZoned(() {
       return shelf_io.serve((request) {
diff --git a/pkg/shelf_web_socket/LICENSE b/pkg/shelf_web_socket/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/pkg/shelf_web_socket/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/shelf_web_socket/README.md b/pkg/shelf_web_socket/README.md
new file mode 100644
index 0000000..9091de0
--- /dev/null
+++ b/pkg/shelf_web_socket/README.md
@@ -0,0 +1,31 @@
+## Web Socket Handler for Shelf
+
+`shelf_web_socket` is a [Shelf][] handler for establishing [WebSocket][]
+connections. It exposes a single function, [webSocketHandler][], which calls an
+`onConnection` callback with a [CompatibleWebSocket][] object for every
+connection that's established.
+
+[Shelf]: pub.dartlang.org/packages/shelf
+
+[WebSocket]: https://tools.ietf.org/html/rfc6455
+
+[webSocketHandler]: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf_web_socket/shelf_web_socket.webSocketHandler
+
+[CompatibleWebSocket]: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/http_parser/http_parser.CompatibleWebSocket
+
+```dart
+import 'package:shelf/shelf_io.dart' as shelf_io;
+import 'package:shelf_web_socket/shelf_web_socket.dart';
+
+void main() {
+  var handler = webSocketHandler((webSocket) {
+    webSocket.listen((message) {
+      webSocket.add("echo $message");
+    });
+  });
+
+  shelf_io.serve(handler, 'localhost', 8080).then((server) {
+    print('Serving at ws://${server.address.host}:${server.port}');
+  });
+}
+```
diff --git a/pkg/shelf_web_socket/lib/shelf_web_socket.dart b/pkg/shelf_web_socket/lib/shelf_web_socket.dart
new file mode 100644
index 0000000..8aac366
--- /dev/null
+++ b/pkg/shelf_web_socket/lib/shelf_web_socket.dart
@@ -0,0 +1,61 @@
+// 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 shelf_web_socket;
+
+import 'package:shelf/shelf.dart';
+
+import 'src/web_socket_handler.dart';
+
+/// A typedef used to determine if a function takes two arguments or not.
+typedef _BinaryFunction(arg1, arg2);
+
+/// Creates a Shelf handler that upgrades HTTP requests to WebSocket
+/// connections.
+///
+/// Only valid WebSocket upgrade requests are upgraded. If a request doesn't
+/// look like a WebSocket upgrade request, a 404 Not Found is returned; if a
+/// request looks like an upgrade request but is invalid, a 400 Bad Request is
+/// returned; and if a request is a valid upgrade request but has an origin that
+/// doesn't match [allowedOrigins] (see below), a 403 Forbidden is returned.
+/// This means that this can be placed first in a [Cascade] and only upgrade
+/// requests will be handled.
+///
+/// The [onConnection] must take a [CompatibleWebSocket] as its first argument.
+/// It may also take a string, the [WebSocket subprotocol][], as its second
+/// argument. The subprotocol is determined by looking at the client's
+/// `Sec-WebSocket-Protocol` header and selecting the first entry that also
+/// appears in [protocols]. If no subprotocols are shared between the client and
+/// the server, `null` will be passed instead. Note that if [onConnection] takes
+/// two arguments, [protocols] must be passed.
+///
+/// [WebSocket subprotocol]: https://tools.ietf.org/html/rfc6455#section-1.9
+///
+/// If [allowedOrigins] is passed, browser connections will only be accepted if
+/// they're made by a script from one of the given origins. This ensures that
+/// malicious scripts running in the browser are unable to fake a WebSocket
+/// handshake. Note that non-browser programs can still make connections freely.
+/// See also the WebSocket spec's discussion of [origin considerations][].
+///
+/// [origin considerations]: https://tools.ietf.org/html/rfc6455#section-10.2
+Handler webSocketHandler(Function onConnection, {Iterable<String> protocols,
+      Iterable<String> allowedOrigins}) {
+  if (protocols != null) protocols = protocols.toSet();
+  if (allowedOrigins != null) {
+    allowedOrigins = allowedOrigins
+        .map((origin) => origin.toLowerCase()).toSet();
+  }
+
+  if (onConnection is! _BinaryFunction) {
+    if (protocols != null) {
+      throw new ArgumentError("If protocols is non-null, onConnection must "
+          "take two arguments, the WebSocket and the protocol.");
+    }
+
+    var innerOnConnection = onConnection;
+    onConnection = (webSocket, _) => innerOnConnection(webSocket);
+  }
+
+  return new WebSocketHandler(onConnection, protocols, allowedOrigins).handle;
+}
diff --git a/pkg/shelf_web_socket/lib/src/web_socket_handler.dart b/pkg/shelf_web_socket/lib/src/web_socket_handler.dart
new file mode 100644
index 0000000..ac5786a
--- /dev/null
+++ b/pkg/shelf_web_socket/lib/src/web_socket_handler.dart
@@ -0,0 +1,133 @@
+// 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 shelf_web_socket.web_socket_handler;
+
+import 'dart:convert';
+
+import 'package:http_parser/http_parser.dart';
+import 'package:shelf/shelf.dart';
+
+/// A class that exposes a handler for upgrading WebSocket requests.
+class WebSocketHandler {
+  /// The function to call when a request is upgraded.
+  final Function _onConnection;
+
+  /// The set of protocols the user supports, or `null`.
+  final Set<String> _protocols;
+
+  /// The set of allowed browser origin connections, or `null`..
+  final Set<String> _allowedOrigins;
+
+  WebSocketHandler(this._onConnection, this._protocols, this._allowedOrigins);
+
+  /// The [Handler].
+  Response handle(Request request) {
+    if (request.method != 'GET') return _notFound();
+
+    var connection = request.headers['Connection'];
+    if (connection == null) return _notFound();
+    if (connection.toLowerCase() != 'upgrade') return _notFound();
+
+    var upgrade = request.headers['Upgrade'];
+    if (upgrade == null) return _notFound();
+    if (upgrade.toLowerCase() != 'websocket') return _notFound();
+
+    var version = request.headers['Sec-WebSocket-Version'];
+    if (version == null) {
+      return _badRequest('missing Sec-WebSocket-Version header.');
+    } else if (version != '13') {
+      return _notFound();
+    }
+
+    if (request.protocolVersion != '1.1') {
+      return _badRequest('unexpected HTTP version '
+          '"${request.protocolVersion}".');
+    }
+
+    var key = request.headers['Sec-WebSocket-Key'];
+    if (key == null) return _badRequest('missing Sec-WebSocket-Key header.');
+
+    if (!request.canHijack) {
+      throw new ArgumentError("webSocketHandler may only be used with a server "
+          "that supports request hijacking.");
+    }
+
+    // The Origin header is always set by browser connections. By filtering out
+    // unexpected origins, we ensure that malicious JavaScript is unable to fake
+    // a WebSocket handshake.
+    var origin = request.headers['Origin'];
+    if (origin != null && _allowedOrigins != null &&
+        !_allowedOrigins.contains(origin.toLowerCase())) {
+      return _forbidden('invalid origin "$origin".');
+    }
+
+    var protocol = _chooseProtocol(request);
+    request.hijack((stream, byteSink) {
+      var sink = UTF8.encoder.startChunkedConversion(byteSink);
+      sink.add(
+          "HTTP/1.1 101 Switching Protocols\r\n"
+          "Upgrade: websocket\r\n"
+          "Connection: Upgrade\r\n"
+          "Sec-WebSocket-Accept: ${CompatibleWebSocket.signKey(key)}\r\n");
+      if (protocol != null) sink.add("Sec-WebSocket-Protocol: $protocol\r\n");
+      sink.add("\r\n");
+
+      _onConnection(new CompatibleWebSocket(stream, sink: byteSink), protocol);
+    });
+
+    // [request.hijack] is guaranteed to throw a [HijackException], so we'll
+    // never get here.
+    assert(false);
+    return null;
+  }
+
+  /// Selects a subprotocol to use for the given connection.
+  ///
+  /// If no matching protocol can be found, returns `null`.
+  String _chooseProtocol(Request request) {
+    var protocols = request.headers['Sec-WebSocket-Protocol'];
+    if (protocols == null) return null;
+    for (var protocol in protocols.split(',')) {
+      protocol = protocol.trim();
+      if (_protocols.contains(protocol)) return protocol;
+    }
+    return null;
+  }
+
+  /// Returns a 404 Not Found response.
+  Response _notFound() => _htmlResponse(404, "404 Not Found",
+      "Only WebSocket connections are supported.");
+
+  /// Returns a 400 Bad Request response.
+  ///
+  /// [message] will be HTML-escaped before being included in the response body.
+  Response _badRequest(String message) => _htmlResponse(400, "400 Bad Request",
+      "Invalid WebSocket upgrade request: $message");
+
+  /// Returns a 403 Forbidden response.
+  ///
+  /// [message] will be HTML-escaped before being included in the response body.
+  Response _forbidden(String message) => _htmlResponse(403, "403 Forbidden",
+      "WebSocket upgrade refused: $message");
+
+  /// Creates an HTTP response with the given [statusCode] and an HTML body with
+  /// [title] and [message].
+  ///
+  /// [title] and [message] will be automatically HTML-escaped.
+  Response _htmlResponse(int statusCode, String title, String message) {
+    title = HTML_ESCAPE.convert(title);
+    message = HTML_ESCAPE.convert(message);
+    return new Response(statusCode, body: """
+      <!doctype html>
+      <html>
+        <head><title>$title</title></head>
+        <body>
+          <h1>$title</h1>
+          <p>$message</p>
+        </body>
+      </html>
+    """, headers: {'content-type': 'text/html'});
+  }
+}
diff --git a/pkg/shelf_web_socket/pubspec.yaml b/pkg/shelf_web_socket/pubspec.yaml
new file mode 100644
index 0000000..7cecc42
--- /dev/null
+++ b/pkg/shelf_web_socket/pubspec.yaml
@@ -0,0 +1,14 @@
+name: shelf_web_socket
+version: 0.0.1
+author: "Dart Team <misc@dartlang.org>"
+homepage: http://www.dartlang.org
+description: >
+  A WebSocket handler for Shelf.
+dependencies:
+  http_parser: ">=0.0.2 <0.1.0"
+  shelf: ">=0.5.2 <0.6.0"
+dev_dependencies:
+  http: ">=0.10.0 <0.12.0"
+  unittest: ">=0.10.0 <0.12.0"
+environment:
+  sdk: ">=1.4.0-dev.5.0 <2.0.0"
diff --git a/pkg/shelf_web_socket/test/web_socket_test.dart b/pkg/shelf_web_socket/test/web_socket_test.dart
new file mode 100644
index 0000000..f9ae2dc
--- /dev/null
+++ b/pkg/shelf_web_socket/test/web_socket_test.dart
@@ -0,0 +1,167 @@
+// 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 shelf_web_socket.web_socket_test;
+
+import 'dart:io';
+
+import 'package:http/http.dart' as http;
+import 'package:shelf/shelf_io.dart' as shelf_io;
+import 'package:shelf_web_socket/shelf_web_socket.dart';
+import 'package:unittest/unittest.dart';
+
+Map<String, String> get _handshakeHeaders => {
+  "Upgrade": "websocket",
+  "Connection": "Upgrade",
+  "Sec-WebSocket-Key": "x3JJHMbDL1EzLkh9GBhXDw==",
+  "Sec-WebSocket-Version": "13"
+};
+
+void main() {
+  test("can communicate with a dart:io WebSocket client", () {
+    return shelf_io.serve(webSocketHandler((webSocket) {
+      webSocket.add("hello!");
+      webSocket.first.then((request) {
+        expect(request, equals("ping"));
+        webSocket.add("pong");
+        webSocket.close();
+      });
+    }), "localhost", 0).then((server) {
+      return WebSocket.connect('ws://localhost:${server.port}')
+          .then((webSocket) {
+        var n = 0;
+        return webSocket.listen((message) {
+          if (n == 0) {
+            expect(message, equals("hello!"));
+            webSocket.add("ping");
+          } else if (n == 1) {
+            expect(message, equals("pong"));
+            webSocket.close();
+            server.close();
+          } else {
+            fail("Only expected two messages.");
+          }
+          n++;
+        }).asFuture();
+      }).whenComplete(server.close);
+    });
+  });
+
+  test("negotiates the sub-protocol", () {
+    return shelf_io.serve(webSocketHandler((webSocket, protocol) {
+      expect(protocol, equals("two"));
+      webSocket.close();
+    }, protocols: ["three", "two", "x"]), "localhost", 0).then((server) {
+      return WebSocket.connect('ws://localhost:${server.port}',
+          protocols: ["one", "two", "three"]).then((webSocket) {
+        expect(webSocket.protocol, equals("two"));
+        return webSocket.close();
+      }).whenComplete(server.close);
+    });
+  });
+
+  group("with a set of allowed origins", () {
+    var server;
+    var url;
+    setUp(() {
+      return shelf_io.serve(webSocketHandler((webSocket) {
+        webSocket.close();
+      }, allowedOrigins: ["pub.dartlang.org", "GoOgLe.CoM"]), "localhost", 0)
+          .then((server_) {
+        server = server_;
+        url = 'http://localhost:${server.port}/';
+      });
+    });
+
+    tearDown(() => server.close());
+
+    test("allows access with an allowed origin", () {
+      var headers = _handshakeHeaders;
+      headers['Origin'] = 'pub.dartlang.org';
+      expect(http.get(url, headers: headers), hasStatus(101));
+    });
+
+    test("forbids access with a non-allowed origin", () {
+      var headers = _handshakeHeaders;
+      headers['Origin'] = 'dartlang.org';
+      expect(http.get(url, headers: headers), hasStatus(403));
+    });
+
+    test("allows access with no origin", () {
+      expect(http.get(url, headers: _handshakeHeaders), hasStatus(101));
+    });
+
+    test("ignores the case of the client origin", () {
+      var headers = _handshakeHeaders;
+      headers['Origin'] = 'PuB.DaRtLaNg.OrG';
+      expect(http.get(url, headers: headers), hasStatus(101));
+    });
+
+    test("ignores the case of the server origin", () {
+      var headers = _handshakeHeaders;
+      headers['Origin'] = 'google.com';
+      expect(http.get(url, headers: headers), hasStatus(101));
+    });
+  });
+
+  group("HTTP errors", () {
+    var server;
+    var url;
+    setUp(() {
+      return shelf_io.serve(webSocketHandler((_) {
+        fail("should not create a WebSocket");
+      }), "localhost", 0).then((server_) {
+        server = server_;
+        url = 'http://localhost:${server.port}/';
+      });
+    });
+
+    tearDown(() => server.close());
+
+    test("404s for non-GET requests", () {
+      expect(http.delete(url, headers: _handshakeHeaders), hasStatus(404));
+    });
+
+    test("404s for non-Upgrade requests", () {
+      var headers = _handshakeHeaders;
+      headers.remove('Connection');
+      expect(http.get(url, headers: headers), hasStatus(404));
+    });
+
+    test("404s for non-websocket upgrade requests", () {
+      var headers = _handshakeHeaders;
+      headers['Upgrade'] = 'fblthp';
+      expect(http.get(url, headers: headers), hasStatus(404));
+    });
+
+    test("400s for a missing Sec-WebSocket-Version", () {
+      var headers = _handshakeHeaders;
+      headers.remove('Sec-WebSocket-Version');
+      expect(http.get(url, headers: headers), hasStatus(400));
+    });
+
+    test("404s for an unknown Sec-WebSocket-Version", () {
+      var headers = _handshakeHeaders;
+      headers['Sec-WebSocket-Version'] = '15';
+      expect(http.get(url, headers: headers), hasStatus(404));
+    });
+
+    test("400s for a missing Sec-WebSocket-Key", () {
+      var headers = _handshakeHeaders;
+      headers.remove('Sec-WebSocket-Key');
+      expect(http.get(url, headers: headers), hasStatus(400));
+    });
+  });
+
+  test("throws an error if a unary function is provided with protocols", () {
+    expect(() => webSocketHandler((_) => null, protocols: ['foo']),
+        throwsArgumentError);
+  });
+}
+
+Matcher hasStatus(int status) => completion(predicate((response) {
+  expect(response, new isInstanceOf<http.Response>());
+  expect(response.statusCode, equals(status));
+  return true;
+}));
diff --git a/pkg/smoke/lib/codegen/recorder.dart b/pkg/smoke/lib/codegen/recorder.dart
index 6920534..073e8fe 100644
--- a/pkg/smoke/lib/codegen/recorder.dart
+++ b/pkg/smoke/lib/codegen/recorder.dart
@@ -151,18 +151,18 @@
 
   /// Adds the declaration of [name] if it was found in [type]. If [recursive]
   /// is true, then we continue looking up [name] in the parent classes until we
-  /// find it or we reach Object. Returns whether the declaration was found.
-  /// When a declaration is found, add also a symbol, getter, and setter if
-  /// [includeAccessors] is true.
+  /// find it or we reach [includeUpTo] or Object. Returns whether the
+  /// declaration was found.  When a declaration is found, add also a symbol,
+  /// getter, and setter if [includeAccessors] is true.
   bool lookupMember(ClassElement type, String name, {bool recursive: false,
-      bool includeAccessors: true}) =>
+      bool includeAccessors: true, ClassElement includeUpTo}) =>
     _lookupMemberInternal(type, _typeFor(type), name, recursive,
-        includeAccessors);
+        includeAccessors, includeUpTo);
 
   /// Helper for [lookupMember] that walks up the type hierarchy including mixin
   /// classes.
   bool _lookupMemberInternal(ClassElement type, TypeIdentifier id, String name,
-      bool recursive, bool includeAccessors) {
+      bool recursive, bool includeAccessors, ClassElement includeUpTo) {
     // Exclude members from [Object].
     if (type.type.isObject) return false;
     generator.addEmptyDeclaration(id);
@@ -210,19 +210,19 @@
     if (recursive) {
       lookupParent(type);
       var parent = type.supertype != null ? type.supertype.element : null;
-      if (parent == null) return false;
+      if (parent == null || parent == includeUpTo) return false;
       var parentId = _typeFor(parent);
       for (var m in type.mixins) {
         var mixinClass = m.element;
         var mixinId = _mixins[parentId][mixinClass];
         if (_lookupMemberInternal(mixinClass, mixinId, name, false,
-              includeAccessors)) {
+              includeAccessors, includeUpTo)) {
           return true;
         }
         parentId = mixinId;
       }
       return _lookupMemberInternal(parent, parentId, name, true,
-          includeAccessors);
+          includeAccessors, includeUpTo);
     }
     return false;
   }
diff --git a/pkg/smoke/pubspec.yaml b/pkg/smoke/pubspec.yaml
index 1d728ca..dab0540 100644
--- a/pkg/smoke/pubspec.yaml
+++ b/pkg/smoke/pubspec.yaml
@@ -1,5 +1,5 @@
 name: smoke
-version: 0.1.0-pre.4
+version: 0.1.0-pre.5
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: "https://api.dartlang.org/apidocs/channels/be/#smoke"
 description: >
@@ -7,7 +7,7 @@
   can be replaced with non-reflective calls using code generation. See README.md
   for mode details.
 dependencies:
-  barback: ">=0.9.0 <0.14.0"
+  barback: ">=0.9.0 <0.15.0"
   logging: ">=0.9.0 <0.10.0"
   analyzer: ">=0.13.0 <0.14.0"
 # TODO(sigmund): once we have some easier way to do global app-level
diff --git a/pkg/smoke/test/codegen/recorder_test.dart b/pkg/smoke/test/codegen/recorder_test.dart
index a81a0d7..091abac 100644
--- a/pkg/smoke/test/codegen/recorder_test.dart
+++ b/pkg/smoke/test/codegen/recorder_test.dart
@@ -328,6 +328,49 @@
             '      },\n'
             '    }));\n');
     });
+
+    test('inherited field - recursive deep', () {
+      recorder.lookupMember(lib.getType('J3'), 'i', recursive: true,
+          includeAccessors: false);
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.J2: smoke_0.J1,\n'
+            '      smoke_0.J3: smoke_0.J2,\n'
+            '    },\n'
+            '    declarations: {\n'
+            '      smoke_0.J1: {\n'
+            '        #i: const Declaration(#i, int),\n'
+            '      },\n'
+            '      smoke_0.J2: const {},\n'
+            '      smoke_0.J3: const {},\n'
+            '    }));\n');
+    });
+
+    test('inherited field - recursive - includeUpTo', () {
+      recorder.lookupMember(lib.getType('J3'), 'i', recursive: true,
+          includeAccessors: false, includeUpTo: lib.getType('J1'));
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.J2: smoke_0.J1,\n'
+            '      smoke_0.J3: smoke_0.J2,\n'
+            '    },\n'
+            '    declarations: {\n'
+            '      smoke_0.J2: const {},\n'
+            '      smoke_0.J3: const {},\n'
+            '    }));\n');
+    });
   });
 
   group('query', () {
@@ -786,6 +829,14 @@
         G get i3;
         G m4() {};
       }
+
+      class J1 {
+        int i;
+      }
+      class J2 extends J1 {
+      }
+      class J3 extends J2 {
+      }
       '''
 };
 
diff --git a/pkg/third_party/html5lib/lib/dom.dart b/pkg/third_party/html5lib/lib/dom.dart
index 973e5ae..a87bca9 100644
--- a/pkg/third_party/html5lib/lib/dom.dart
+++ b/pkg/third_party/html5lib/lib/dom.dart
@@ -1,18 +1,26 @@
 /// A simple tree API that results from parsing html. Intended to be compatible
-/// with dart:html, but right now it resembles the classic JS DOM.
+/// with dart:html, but it is missing many types and APIs.
 library dom;
 
+// TODO(jmesserly): lots to do here. Originally I wanted to generate this using
+// our Blink IDL generator, but another idea is to directly use the excellent
+// http://dom.spec.whatwg.org/ and http://html.spec.whatwg.org/ and just
+// implement that.
+
 import 'dart:collection';
 import 'package:source_maps/span.dart' show FileSpan;
 
 import 'src/constants.dart';
+import 'src/css_class_set.dart';
 import 'src/list_proxy.dart';
+import 'src/query_selector.dart' as query;
 import 'src/token.dart';
 import 'src/tokenizer.dart';
-import 'src/utils.dart';
 import 'dom_parsing.dart';
 import 'parser.dart';
 
+export 'src/css_class_set.dart' show CssClassSet;
+
 // TODO(jmesserly): this needs to be replaced by an AttributeMap for attributes
 // that exposes namespace info.
 class AttributeName implements Comparable {
@@ -60,6 +68,55 @@
   }
 }
 
+// http://dom.spec.whatwg.org/#parentnode
+abstract class _ParentNode implements Node {
+  // TODO(jmesserly): this is only a partial implementation
+
+  /// Seaches for the first descendant node matching the given selectors, using
+  /// a preorder traversal.
+  ///
+  /// NOTE: Not all selectors from
+  /// [selectors level 4](http://dev.w3.org/csswg/selectors-4/)
+  /// are implemented. For example, nth-child does not implement An+B syntax
+  /// and *-of-type is not implemented. If a selector is not implemented this
+  /// method will throw [UniplmentedError].
+  Element querySelector(String selector) =>
+      query.querySelector(this, selector);
+
+  /// Returns all descendant nodes matching the given selectors, using a
+  /// preorder traversal.
+  ///
+  /// NOTE: Not all selectors from
+  /// [selectors level 4](http://dev.w3.org/csswg/selectors-4/)
+  /// are implemented. For example, nth-child does not implement An+B syntax
+  /// and *-of-type is not implemented. If a selector is not implemented this
+  /// method will throw [UniplmentedError].
+  List<Element> querySelectorAll(String selector) =>
+      query.querySelectorAll(this, selector);
+}
+
+// http://dom.spec.whatwg.org/#interface-nonelementparentnode
+abstract class _NonElementParentNode implements _ParentNode {
+  // TODO(jmesserly): could be faster, should throw on invalid id.
+  Element getElementById(String id) => querySelector('#$id');
+}
+
+// This doesn't exist as an interface in the spec, but it's useful to merge
+// common methods from these:
+// http://dom.spec.whatwg.org/#interface-document
+// http://dom.spec.whatwg.org/#element
+abstract class _ElementAndDocument implements _ParentNode {
+  // TODO(jmesserly): could be faster, should throw on invalid tag/class names.
+
+  List<Element> getElementsByTagName(String localName) =>
+      querySelectorAll(localName);
+
+  List<Element> getElementsByClassName(String classNames) =>
+      querySelectorAll(classNames.splitMapJoin(' ',
+          onNonMatch: (m) => m.isNotEmpty ? '.$m' : m,
+          onMatch: (m) => ''));
+}
+
 /// Really basic implementation of a DOM-core like Node.
 abstract class Node {
   static const int ATTRIBUTE_NODE = 2;
@@ -75,16 +132,14 @@
   static const int PROCESSING_INSTRUCTION_NODE = 7;
   static const int TEXT_NODE = 3;
 
-  /// Note: For now we use it to implement the deprecated tagName property.
-  final String _tagName;
-
-  /// *Deprecated* use [Element.localName] instead.
-  /// Note: after removal, this will be replaced by a correct version that
-  /// returns uppercase [as specified](http://dom.spec.whatwg.org/#dom-element-tagname).
-  @deprecated String get tagName => _tagName;
-
   /// The parent of the current node (or null for the document node).
-  Node parent;
+  Node parentNode;
+
+  /// The parent element of this node.
+  ///
+  /// Returns null if this node either does not have a parent or its parent is
+  /// not an element.
+  Element get parent => parentNode is Element ? parentNode : null;
 
   // TODO(jmesserly): should move to Element.
   /// A map holding name, value pairs for attributes of the node.
@@ -108,10 +163,7 @@
   LinkedHashMap<dynamic, FileSpan> _attributeSpans;
   LinkedHashMap<dynamic, FileSpan> _attributeValueSpans;
 
-  /// *Deprecated* use [new Element.tag] instead.
-  @deprecated Node(String tagName) : this._(tagName);
-
-  Node._([this._tagName]) {
+  Node._() {
     nodes._parent = this;
   }
 
@@ -140,29 +192,14 @@
     return _elements;
   }
 
-  // TODO(jmesserly): needs to support deep clone.
-  /// Return a shallow copy of the current node i.e. a node with the same
-  /// name and attributes but with no parent or child nodes.
-  Node clone();
-
-  /// *Deprecated* use [Element.namespaceUri] instead.
-  @deprecated String get namespace => null;
+  /// Returns a copy of this node.
+  ///
+  /// If [deep] is `true`, then all of this node's children and decendents are
+  /// copied as well. If [deep] is `false`, then only this node is copied.
+  Node clone(bool deep);
 
   int get nodeType;
 
-  /// *Deprecated* use [text], [Text.data] or [Comment.data].
-  @deprecated String get value => null;
-
-  /// *Deprecated* use [nodeType].
-  @deprecated int get $dom_nodeType => nodeType;
-
-  /// *Deprecated* use [Element.outerHtml]
-  @deprecated String get outerHtml => _outerHtml;
-
-  /// *Deprecated* use [Element.innerHtml]
-  @deprecated String get innerHtml => _innerHtml;
-  @deprecated set innerHtml(String value) { _innerHtml = value; }
-
   // http://domparsing.spec.whatwg.org/#extensions-to-the-element-interface
   String get _outerHtml {
     var str = new StringBuffer();
@@ -176,13 +213,6 @@
     return str.toString();
   }
 
-  set _innerHtml(String value) {
-    nodes.clear();
-    // TODO(jmesserly): should be able to get the same effect by adding the
-    // fragment directly.
-    nodes.addAll(parseFragment(value, container: _tagName).nodes);
-  }
-
   // Implemented per: http://dom.spec.whatwg.org/#dom-node-textcontent
   String get text => null;
   set text(String value) {}
@@ -199,8 +229,8 @@
 
   Node remove() {
     // TODO(jmesserly): is parent == null an error?
-    if (parent != null) {
-      parent.nodes.remove(this);
+    if (parentNode != null) {
+      parentNode.nodes.remove(this);
     }
     return this;
   }
@@ -219,10 +249,10 @@
 
   /// Replaces this node with another node.
   Node replaceWith(Node otherNode) {
-    if (parent == null) {
+    if (parentNode == null) {
       throw new UnsupportedError('Node must have a parent to replace it.');
     }
-    parent.nodes[parent.nodes.indexOf(this)] = otherNode;
+    parentNode.nodes[parentNode.nodes.indexOf(this)] = otherNode;
     return this;
   }
 
@@ -230,10 +260,6 @@
   /// Return true if the node has children or text.
   bool hasContent() => nodes.length > 0;
 
-  /// *Deprecated* construct a pair using the namespaceUri and the name.
-  @deprecated Pair<String, String> get nameTuple =>
-      this is Element ? getElementNameTuple(this) : null;
-
   /// Move all the children of the current node to [newParent].
   /// This is needed so that trees that don't store text as nodes move the
   /// text in the correct way.
@@ -242,42 +268,10 @@
     nodes.clear();
   }
 
-  /// *Deprecated* use [querySelector] instead.
-  @deprecated
-  Element query(String selectors) => querySelector(selectors);
-
-  /// *Deprecated* use [querySelectorAll] instead.
-  @deprecated
-  List<Element> queryAll(String selectors) => querySelectorAll(selectors);
-
-  /// Seaches for the first descendant node matching the given selectors, using a
-  /// preorder traversal. NOTE: right now, this supports only a single type
-  /// selectors, e.g. `node.query('div')`.
-
-  Element querySelector(String selectors) =>
-      _queryType(_typeSelector(selectors));
-
-  /// Returns all descendant nodes matching the given selectors, using a
-  /// preorder traversal. NOTE: right now, this supports only a single type
-  /// selectors, e.g. `node.queryAll('div')`.
-  List<Element> querySelectorAll(String selectors) {
-    var results = new List<Element>();
-    _queryAllType(_typeSelector(selectors), results);
-    return results;
-  }
-
   bool hasChildNodes() => !nodes.isEmpty;
 
   bool contains(Node node) => nodes.contains(node);
 
-  String _typeSelector(String selectors) {
-    selectors = selectors.trim();
-    if (!_isTypeSelector(selectors)) {
-      throw new UnimplementedError('only type selectors are implemented');
-    }
-    return selectors;
-  }
-
   /// Checks if this is a type selector.
   /// See <http://www.w3.org/TR/CSS2/grammar.html>.
   /// Note: this doesn't support '*', the universal selector, non-ascii chars or
@@ -318,24 +312,6 @@
     return true;
   }
 
-  Element _queryType(String tag) {
-    for (var node in nodes) {
-      if (node is! Element) continue;
-      if (node.localName == tag) return node;
-      var result = node._queryType(tag);
-      if (result != null) return result;
-    }
-    return null;
-  }
-
-  void _queryAllType(String tag, List<Element> results) {
-    for (var node in nodes) {
-      if (node is! Element) continue;
-      if (node.localName == tag) results.add(node);
-      node._queryAllType(tag, results);
-    }
-  }
-
   /// Initialize [attributeSpans] using [sourceSpan].
   void _ensureAttributeSpans() {
     if (_attributeSpans != null) return;
@@ -363,9 +339,20 @@
       }
     }
   }
+
+  _clone(Node shallowClone, bool deep) {
+    if (deep) {
+      for (var child in nodes) {
+        shallowClone.append(child.clone(true));
+      }
+    }
+    return shallowClone;
+  }
 }
 
-class Document extends Node {
+class Document extends Node
+    with _ParentNode, _NonElementParentNode, _ElementAndDocument {
+
   Document() : super._();
   factory Document.html(String html) => parse(html);
 
@@ -388,18 +375,41 @@
 
   void _addOuterHtml(StringBuffer str) => _addInnerHtml(str);
 
-  Document clone() => new Document();
+  Document clone(bool deep) => _clone(new Document(), deep);
+
+  Element createElement(String tag) => new Element.tag(tag);
+
+  // TODO(jmesserly): this is only a partial implementation of:
+  // http://dom.spec.whatwg.org/#dom-document-createelementns
+  Element createElementNS(String namespaceUri, String tag) {
+    if (namespaceUri == '') namespaceUri = null;
+    return new Element._(tag, namespaceUri);
+  }
+
+  DocumentFragment createDocumentFragment() => new DocumentFragment();
 }
 
-class DocumentFragment extends Document {
-  DocumentFragment();
+class DocumentFragment extends Node
+    with _ParentNode, _NonElementParentNode {
+
+  DocumentFragment() : super._();
   factory DocumentFragment.html(String html) => parseFragment(html);
 
   int get nodeType => Node.DOCUMENT_FRAGMENT_NODE;
 
+  /// Returns a fragment of HTML or XML that represents the element and its
+  /// contents.
+  // TODO(jmesserly): this API is not specified in:
+  // <http://domparsing.spec.whatwg.org/> nor is it in dart:html, instead
+  // only Element has outerHtml. However it is quite useful. Should we move it
+  // to dom_parsing, where we keep other custom APIs?
+  String get outerHtml => _outerHtml;
+
   String toString() => "#document-fragment";
 
-  DocumentFragment clone() => new DocumentFragment();
+  DocumentFragment clone(bool deep) => _clone(new DocumentFragment(), deep);
+
+  void _addOuterHtml(StringBuffer str) => _addInnerHtml(str);
 
   String get text => _getText(this);
   set text(String value) => _setText(this, value);
@@ -412,7 +422,7 @@
 
   DocumentType(String name, this.publicId, this.systemId)
       // Note: once Node.tagName is removed, don't pass "name" to super
-      : name = name, super._(name);
+      : name = name, super._();
 
   int get nodeType => Node.DOCUMENT_TYPE_NODE;
 
@@ -433,7 +443,7 @@
     str.write(toString());
   }
 
-  DocumentType clone() => new DocumentType(name, publicId, systemId);
+  DocumentType clone(bool deep) => new DocumentType(name, publicId, systemId);
 }
 
 class Text extends Node {
@@ -441,36 +451,29 @@
 
   Text(this.data) : super._();
 
-  /// *Deprecated* use [data].
-  @deprecated String get value => data;
-  @deprecated set value(String x) { data = x; }
-
   int get nodeType => Node.TEXT_NODE;
 
   String toString() => '"$data"';
 
   void _addOuterHtml(StringBuffer str) => writeTextNodeAsHtml(str, this);
 
-  Text clone() => new Text(data);
+  Text clone(bool deep) => new Text(data);
 
   String get text => data;
   set text(String value) { data = value; }
 }
 
-class Element extends Node {
+// TODO(jmesserly): Elements should have a pointer back to their document
+class Element extends Node with _ParentNode, _ElementAndDocument {
   final String namespaceUri;
 
-  @deprecated String get namespace => namespaceUri;
-
   /// The [local name](http://dom.spec.whatwg.org/#concept-element-local-name)
   /// of this element.
-  String get localName => _tagName;
+  final String localName;
 
-  // TODO(jmesserly): deprecate in favor of [Document.createElementNS].
-  // However we need every element to have a Document before this can work.
-  Element(String name, [this.namespaceUri]) : super._(name);
+  Element._(this.localName, [this.namespaceUri]) : super._();
 
-  Element.tag(String name) : namespaceUri = null, super._(name);
+  Element.tag(this.localName) : namespaceUri = Namespaces.html, super._();
 
   static final _START_TAG_REGEXP = new RegExp('<(\\w+)');
 
@@ -528,9 +531,30 @@
 
   int get nodeType => Node.ELEMENT_NODE;
 
+  // TODO(jmesserly): we can make this faster
+  Element get previousElementSibling {
+    if (parentNode == null) return null;
+    var siblings = parentNode.nodes;
+    for (int i = siblings.indexOf(this) - 1; i >= 0; i--) {
+      var s = siblings[i];
+      if (s is Element) return s;
+    }
+    return null;
+  }
+
+  Element get nextElementSibling {
+    if (parentNode == null) return null;
+    var siblings = parentNode.nodes;
+    for (int i = siblings.indexOf(this) + 1; i < siblings.length; i++) {
+      var s = siblings[i];
+      if (s is Element) return s;
+    }
+    return null;
+  }
+
   String toString() {
-    if (namespaceUri == null) return "<$localName>";
-    return "<${Namespaces.getPrefix(namespaceUri)} $localName>";
+    var prefix = Namespaces.getPrefix(namespaceUri);
+    return "<${prefix == null ? '' : '$prefix '}$localName>";
   }
 
   String get text => _getText(this);
@@ -546,21 +570,17 @@
   String get innerHtml => _innerHtml;
   // TODO(jmesserly): deprecate in favor of:
   // <https://api.dartlang.org/apidocs/channels/stable/#dart-dom-html.Element@id_setInnerHtml>
-  set innerHtml(String value) { _innerHtml = value; }
+  set innerHtml(String value) {
+    nodes.clear();
+    // TODO(jmesserly): should be able to get the same effect by adding the
+    // fragment directly.
+    nodes.addAll(parseFragment(value, container: localName).nodes);
+  }
 
   void _addOuterHtml(StringBuffer str) {
     // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#serializing-html-fragments
     // Element is the most complicated one.
-    if (namespaceUri == null ||
-        namespaceUri == Namespaces.html ||
-        namespaceUri == Namespaces.mathml ||
-        namespaceUri == Namespaces.svg) {
-      str.write('<$localName');
-    } else {
-      // TODO(jmesserly): the spec doesn't define "qualified name".
-      // I'm not sure if this is correct, but it should parse reasonably.
-      str.write('<${Namespaces.getPrefix(namespaceUri)}:$localName');
-    }
+    str.write('<${_getSerializationPrefix(namespaceUri)}$localName');
 
     if (attributes.length > 0) {
       attributes.forEach((key, v) {
@@ -591,21 +611,56 @@
     if (!isVoidElement(localName)) str.write('</$localName>');
   }
 
-  Element clone() => new Element(localName, namespaceUri)
-      ..attributes = new LinkedHashMap.from(attributes);
+  static String _getSerializationPrefix(String uri) {
+    if (uri == null ||
+        uri == Namespaces.html ||
+        uri == Namespaces.mathml ||
+        uri == Namespaces.svg) {
+      return '';
+    }
+    var prefix = Namespaces.getPrefix(uri);
+    // TODO(jmesserly): the spec doesn't define "qualified name".
+    // I'm not sure if this is correct, but it should parse reasonably.
+    return prefix == null ? '' : '$prefix:';
+  }
 
+  Element clone(bool deep) {
+    var result = new Element._(localName, namespaceUri)
+        ..attributes = new LinkedHashMap.from(attributes);
+    return _clone(result, deep);
+  }
+
+  // http://dom.spec.whatwg.org/#dom-element-id
   String get id {
     var result = attributes['id'];
     return result != null ? result : '';
   }
 
   set id(String value) {
-    if (value == null) {
-      attributes.remove('id');
-    } else {
-      attributes['id'] = value;
-    }
+    attributes['id'] = '$value';
   }
+
+  // http://dom.spec.whatwg.org/#dom-element-classname
+  String get className {
+    var result = attributes['class'];
+    return result != null ? result : '';
+  }
+
+  set className(String value) {
+    attributes['class'] = '$value';
+  }
+
+  /**
+   * The set of CSS classes applied to this element.
+   *
+   * This set makes it easy to add, remove or toggle the classes applied to
+   * this element.
+   *
+   *     element.classes.add('selected');
+   *     element.classes.toggle('isOnline');
+   *     element.classes.remove('selected');
+   */
+  CssClassSet get classes => new ElementCssClassSet(this);
 }
 
 class Comment extends Node {
@@ -621,7 +676,7 @@
     str.write("<!--$data-->");
   }
 
-  Comment clone() => new Comment(data);
+  Comment clone(bool deep) => new Comment(data);
 
   String get text => data;
   set text(String value) {
@@ -646,7 +701,7 @@
     // Note: we need to remove the node from its previous parent node, if any,
     // before updating its parent pointer to point at our parent.
     node.remove();
-    node.parent = _parent;
+    node.parentNode = _parent;
     return node;
   }
 
@@ -681,12 +736,12 @@
     }
   }
 
-  Node removeLast() => super.removeLast()..parent = null;
+  Node removeLast() => super.removeLast()..parentNode = null;
 
-  Node removeAt(int i) => super.removeAt(i)..parent = null;
+  Node removeAt(int i) => super.removeAt(i)..parentNode = null;
 
   void clear() {
-    for (var node in this) node.parent = null;
+    for (var node in this) node.parentNode = null;
     super.clear();
   }
 
@@ -695,7 +750,7 @@
       removeAt(index);
       insertAll(index, value.nodes);
     } else {
-      this[index].parent = null;
+      this[index].parentNode = null;
       super[index] = _setParent(value);
     }
   }
@@ -721,20 +776,20 @@
   }
 
   void removeRange(int start, int rangeLength) {
-    for (int i = start; i < rangeLength; i++) this[i].parent = null;
+    for (int i = start; i < rangeLength; i++) this[i].parentNode = null;
     super.removeRange(start, rangeLength);
   }
 
   void removeWhere(bool test(Element e)) {
     for (var node in where(test)) {
-      node.parent = null;
+      node.parentNode = null;
     }
     super.removeWhere(test);
   }
 
   void retainWhere(bool test(Element e)) {
     for (var node in where((n) => !test(n))) {
-      node.parent = null;
+      node.parentNode = null;
     }
     super.retainWhere(test);
   }
diff --git a/pkg/third_party/html5lib/lib/dom_parsing.dart b/pkg/third_party/html5lib/lib/dom_parsing.dart
index aed9fff..527d9a6 100644
--- a/pkg/third_party/html5lib/lib/dom_parsing.dart
+++ b/pkg/third_party/html5lib/lib/dom_parsing.dart
@@ -40,8 +40,7 @@
 
   visitComment(Comment node) => visitNodeFallback(node);
 
-  // Note: visits document by default because DocumentFragment is a Document.
-  visitDocumentFragment(DocumentFragment node) => visitDocument(node);
+  visitDocumentFragment(DocumentFragment node) => visitNodeFallback(node);
 }
 
 /// Converts the DOM tree into an HTML string with code markup suitable for
@@ -166,7 +165,7 @@
 /// <http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#html-fragment-serialization-algorithm>
 void writeTextNodeAsHtml(StringBuffer str, Text node) {
   // Don't escape text for certain elements, notably <script>.
-  final parent = node.parent;
+  final parent = node.parentNode;
   if (parent is Element) {
     var tag = parent.localName;
     if (rcdataElements.contains(tag) || tag == 'plaintext') {
diff --git a/pkg/third_party/html5lib/lib/parser.dart b/pkg/third_party/html5lib/lib/parser.dart
index 2d04f8e..721985a 100644
--- a/pkg/third_party/html5lib/lib/parser.dart
+++ b/pkg/third_party/html5lib/lib/parser.dart
@@ -1313,8 +1313,8 @@
         tree.openElements[1].localName != "body")) {
       assert(parser.innerHTMLMode);
     } else if (parser.framesetOK) {
-      if (tree.openElements[1].parent != null) {
-        tree.openElements[1].parent.nodes.remove(tree.openElements[1]);
+      if (tree.openElements[1].parentNode != null) {
+        tree.openElements[1].parentNode.nodes.remove(tree.openElements[1]);
       }
       while (tree.openElements.last.localName != "html") {
         tree.openElements.removeLast();
@@ -1840,7 +1840,7 @@
         }
         // Step 6.5
         //cite = node.parent
-        var clone = node.clone();
+        var clone = node.clone(false);
         // Replace node with clone
         tree.activeFormattingElements[
             tree.activeFormattingElements.indexOf(node)] = clone;
@@ -1849,8 +1849,8 @@
 
         // Step 6.6
         // Remove lastNode from its parents, if any
-        if (lastNode.parent != null) {
-          lastNode.parent.nodes.remove(lastNode);
+        if (lastNode.parentNode != null) {
+          lastNode.parentNode.nodes.remove(lastNode);
         }
         node.nodes.add(lastNode);
         // Step 7.7
@@ -1862,8 +1862,8 @@
       // Foster parent lastNode if commonAncestor is a
       // table, tbody, tfoot, thead, or tr we need to foster parent the
       // lastNode
-      if (lastNode.parent != null) {
-        lastNode.parent.nodes.remove(lastNode);
+      if (lastNode.parentNode != null) {
+        lastNode.parentNode.nodes.remove(lastNode);
       }
 
       if (const ["table", "tbody", "tfoot", "thead", "tr"].contains(
@@ -1875,7 +1875,7 @@
       }
 
       // Step 8
-      var clone = formattingElement.clone();
+      var clone = formattingElement.clone(false);
 
       // Step 9
       furthestBlock.reparentChildren(clone);
diff --git a/pkg/third_party/html5lib/lib/src/constants.dart b/pkg/third_party/html5lib/lib/src/constants.dart
index b8e4dbd..0fd9e12 100644
--- a/pkg/third_party/html5lib/lib/src/constants.dart
+++ b/pkg/third_party/html5lib/lib/src/constants.dart
@@ -316,7 +316,7 @@
       case xlink: return 'xlink';
       case xml: return 'xml';
       case xmlns: return 'xmlns';
-      default: throw new ArgumentError(url);
+      default: return null;
     }
   }
 }
diff --git a/pkg/third_party/html5lib/lib/src/css_class_set.dart b/pkg/third_party/html5lib/lib/src/css_class_set.dart
new file mode 100644
index 0000000..03136a7
--- /dev/null
+++ b/pkg/third_party/html5lib/lib/src/css_class_set.dart
@@ -0,0 +1,336 @@
+// 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.
+
+// TODO(jmesserly): everything in this file is copied straight from "dart:html".
+library html5lib.dom.src;
+
+import 'dart:collection';
+import 'package:html5lib/dom.dart';
+
+class ElementCssClassSet extends CssClassSetImpl {
+
+  final Element _element;
+
+  ElementCssClassSet(this._element);
+
+  Set<String> readClasses() {
+    var s = new LinkedHashSet<String>();
+    var classname = _element.className;
+
+    for (String name in classname.split(' ')) {
+      String trimmed = name.trim();
+      if (!trimmed.isEmpty) {
+        s.add(trimmed);
+      }
+    }
+    return s;
+  }
+
+  void writeClasses(Set<String> s) {
+    List list = new List.from(s);
+    _element.className = s.join(' ');
+  }
+}
+
+
+/** A Set that stores the CSS class names for an element. */
+abstract class CssClassSet implements Set<String> {
+
+  /**
+   * Adds the class [value] to the element if it is not on it, removes it if it
+   * is.
+   *
+   * If [shouldAdd] is true, then we always add that [value] to the element. If
+   * [shouldAdd] is false then we always remove [value] from the element.
+   */
+  bool toggle(String value, [bool shouldAdd]);
+
+  /**
+   * Returns [:true:] if classes cannot be added or removed from this
+   * [:CssClassSet:].
+   */
+  bool get frozen;
+
+  /**
+   * Determine if this element contains the class [value].
+   *
+   * This is the Dart equivalent of jQuery's
+   * [hasClass](http://api.jquery.com/hasClass/).
+   */
+  bool contains(String value);
+
+  /**
+   * Add the class [value] to element.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [addClass](http://api.jquery.com/addClass/).
+   *
+   * If this corresponds to one element. Returns true if [value] was added to
+   * the set, otherwise false.
+   *
+   * If this corresponds to many elements, null is always returned.
+   */
+  bool add(String value);
+
+  /**
+   * Remove the class [value] from element, and return true on successful
+   * removal.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [removeClass](http://api.jquery.com/removeClass/).
+   */
+  bool remove(Object value);
+
+  /**
+   * Add all classes specified in [iterable] to element.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [addClass](http://api.jquery.com/addClass/).
+   */
+  void addAll(Iterable<String> iterable);
+
+  /**
+   * Remove all classes specified in [iterable] from element.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [removeClass](http://api.jquery.com/removeClass/).
+   */
+  void removeAll(Iterable<String> iterable);
+
+  /**
+   * Toggles all classes specified in [iterable] on element.
+   *
+   * Iterate through [iterable]'s items, and add it if it is not on it, or
+   * remove it if it is. This is the Dart equivalent of jQuery's
+   * [toggleClass](http://api.jquery.com/toggleClass/).
+   * If [shouldAdd] is true, then we always add all the classes in [iterable]
+   * element. If [shouldAdd] is false then we always remove all the classes in
+   * [iterable] from the element.
+   */
+  void toggleAll(Iterable<String> iterable, [bool shouldAdd]);
+}
+
+abstract class CssClassSetImpl implements CssClassSet {
+
+  String toString() {
+    return readClasses().join(' ');
+  }
+
+  /**
+   * Adds the class [value] to the element if it is not on it, removes it if it
+   * is.
+   *
+   * If [shouldAdd] is true, then we always add that [value] to the element. If
+   * [shouldAdd] is false then we always remove [value] from the element.
+   */
+  bool toggle(String value, [bool shouldAdd]) {
+    Set<String> s = readClasses();
+    bool result = false;
+    if (shouldAdd == null) shouldAdd = !s.contains(value);
+    if (shouldAdd) {
+      s.add(value);
+      result = true;
+    } else {
+      s.remove(value);
+    }
+    writeClasses(s);
+    return result;
+  }
+
+  /**
+   * Returns [:true:] if classes cannot be added or removed from this
+   * [:CssClassSet:].
+   */
+  bool get frozen => false;
+
+  // interface Iterable - BEGIN
+  Iterator<String> get iterator => readClasses().iterator;
+  // interface Iterable - END
+
+  // interface Collection - BEGIN
+  void forEach(void f(String element)) {
+    readClasses().forEach(f);
+  }
+
+  String join([String separator = ""]) => readClasses().join(separator);
+
+  Iterable map(f(String element)) => readClasses().map(f);
+
+  Iterable<String> where(bool f(String element)) => readClasses().where(f);
+
+  Iterable expand(Iterable f(String element)) => readClasses().expand(f);
+
+  bool every(bool f(String element)) => readClasses().every(f);
+
+  bool any(bool f(String element)) => readClasses().any(f);
+
+  bool get isEmpty => readClasses().isEmpty;
+
+  bool get isNotEmpty => readClasses().isNotEmpty;
+
+  int get length => readClasses().length;
+
+  String reduce(String combine(String value, String element)) {
+    return readClasses().reduce(combine);
+  }
+
+  dynamic fold(dynamic initialValue,
+      dynamic combine(dynamic previousValue, String element)) {
+    return readClasses().fold(initialValue, combine);
+  }
+  // interface Collection - END
+
+  // interface Set - BEGIN
+  /**
+   * Determine if this element contains the class [value].
+   *
+   * This is the Dart equivalent of jQuery's
+   * [hasClass](http://api.jquery.com/hasClass/).
+   */
+  bool contains(String value) => readClasses().contains(value);
+
+  /** Lookup from the Set interface. Not interesting for a String set. */
+  String lookup(String value) => contains(value) ? value : null;
+
+  /**
+   * Add the class [value] to element.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [addClass](http://api.jquery.com/addClass/).
+   */
+  bool add(String value) {
+    // TODO - figure out if we need to do any validation here
+    // or if the browser natively does enough.
+    return modify((s) => s.add(value));
+  }
+
+  /**
+   * Remove the class [value] from element, and return true on successful
+   * removal.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [removeClass](http://api.jquery.com/removeClass/).
+   */
+  bool remove(Object value) {
+    if (value is! String) return false;
+    Set<String> s = readClasses();
+    bool result = s.remove(value);
+    writeClasses(s);
+    return result;
+  }
+
+  /**
+   * Add all classes specified in [iterable] to element.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [addClass](http://api.jquery.com/addClass/).
+   */
+  void addAll(Iterable<String> iterable) {
+    // TODO - see comment above about validation.
+    modify((s) => s.addAll(iterable));
+  }
+
+  /**
+   * Remove all classes specified in [iterable] from element.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [removeClass](http://api.jquery.com/removeClass/).
+   */
+  void removeAll(Iterable<String> iterable) {
+    modify((s) => s.removeAll(iterable));
+  }
+
+  /**
+   * Toggles all classes specified in [iterable] on element.
+   *
+   * Iterate through [iterable]'s items, and add it if it is not on it, or
+   * remove it if it is. This is the Dart equivalent of jQuery's
+   * [toggleClass](http://api.jquery.com/toggleClass/).
+   * If [shouldAdd] is true, then we always add all the classes in [iterable]
+   * element. If [shouldAdd] is false then we always remove all the classes in
+   * [iterable] from the element.
+   */
+  void toggleAll(Iterable<String> iterable, [bool shouldAdd]) {
+    iterable.forEach((e) => toggle(e, shouldAdd));
+  }
+
+  void retainAll(Iterable<String> iterable) {
+    modify((s) => s.retainAll(iterable));
+  }
+
+  void removeWhere(bool test(String name)) {
+    modify((s) => s.removeWhere(test));
+  }
+
+  void retainWhere(bool test(String name)) {
+    modify((s) => s.retainWhere(test));
+  }
+
+  bool containsAll(Iterable<String> collection) =>
+    readClasses().containsAll(collection);
+
+  Set<String> intersection(Set<String> other) =>
+    readClasses().intersection(other);
+
+  Set<String> union(Set<String> other) =>
+    readClasses().union(other);
+
+  Set<String> difference(Set<String> other) =>
+    readClasses().difference(other);
+
+  String get first => readClasses().first;
+  String get last => readClasses().last;
+  String get single => readClasses().single;
+  List<String> toList({ bool growable: true }) =>
+      readClasses().toList(growable: growable);
+  Set<String> toSet() => readClasses().toSet();
+  Iterable<String> take(int n) => readClasses().take(n);
+  Iterable<String> takeWhile(bool test(String value)) =>
+      readClasses().takeWhile(test);
+  Iterable<String> skip(int n) => readClasses().skip(n);
+  Iterable<String> skipWhile(bool test(String value)) =>
+      readClasses().skipWhile(test);
+  dynamic firstWhere(bool test(String value), { Object orElse() }) =>
+      readClasses().firstWhere(test, orElse: orElse);
+  dynamic lastWhere(bool test(String value), { Object orElse()}) =>
+      readClasses().lastWhere(test, orElse: orElse);
+  String singleWhere(bool test(String value)) =>
+      readClasses().singleWhere(test);
+  String elementAt(int index) => readClasses().elementAt(index);
+
+  void clear() {
+    modify((s) => s.clear());
+  }
+  // interface Set - END
+
+  /**
+   * Helper method used to modify the set of css classes on this element.
+   *
+   *   f - callback with:
+   *   s - a Set of all the css class name currently on this element.
+   *
+   *   After f returns, the modified set is written to the
+   *       className property of this element.
+   */
+  modify( f(Set<String> s)) {
+    Set<String> s = readClasses();
+    var ret = f(s);
+    writeClasses(s);
+    return ret;
+  }
+
+  /**
+   * Read the class names from the Element class property,
+   * and put them into a set (duplicates are discarded).
+   * This is intended to be overridden by specific implementations.
+   */
+  Set<String> readClasses();
+
+  /**
+   * Join all the elements of a set into one string and write
+   * back to the element.
+   * This is intended to be overridden by specific implementations.
+   */
+  void writeClasses(Set<String> s);
+}
diff --git a/pkg/third_party/html5lib/lib/src/query_selector.dart b/pkg/third_party/html5lib/lib/src/query_selector.dart
new file mode 100644
index 0000000..ededa54
--- /dev/null
+++ b/pkg/third_party/html5lib/lib/src/query_selector.dart
@@ -0,0 +1,288 @@
+/// Query selector implementation for html5lib's DOM.
+library html5lib.src.query;
+
+import 'package:csslib/parser.dart' as css;
+import 'package:csslib/parser.dart' show TokenKind;
+import 'package:csslib/visitor.dart'; // the CSSOM
+import 'package:html5lib/dom.dart';
+import 'package:html5lib/src/constants.dart' show isWhitespaceCC;
+
+bool matches(Node node, String selector) =>
+    new SelectorEvaluator().matches(node, _parseSelectorList(selector));
+
+Element querySelector(Node node, String selector) =>
+    new SelectorEvaluator().querySelector(node, _parseSelectorList(selector));
+
+List<Element> querySelectorAll(Node node, String selector) {
+  var results = [];
+  new SelectorEvaluator()
+      .querySelectorAll(node, _parseSelectorList(selector), results);
+  return results;
+}
+
+// http://dev.w3.org/csswg/selectors-4/#grouping
+SelectorGroup _parseSelectorList(String selector) {
+  var errors = [];
+  var group = css.parseSelectorGroup(selector, errors: errors);
+  if (group == null || errors.isNotEmpty) {
+    throw new FormatException("'$selector' is not a valid selector: $errors");
+  }
+  return group;
+}
+
+class SelectorEvaluator extends Visitor {
+  /// The current HTML element to match against.
+  Element _element;
+
+  bool matches(Element element, SelectorGroup selector) {
+    _element = element;
+    return visitSelectorGroup(selector);
+  }
+
+  Element querySelector(Node root, SelectorGroup selector) {
+    for (var node in root.nodes) {
+      if (node is! Element) continue;
+      if (matches(node, selector)) return node;
+      var result = querySelector(node, selector);
+      if (result != null) return result;
+    }
+    return null;
+  }
+
+  void querySelectorAll(Node root, SelectorGroup selector,
+      List<Element> results) {
+
+    for (var node in root.nodes) {
+      if (node is! Element) continue;
+      if (matches(node, selector)) results.add(node);
+      querySelectorAll(node, selector, results);
+    }
+  }
+
+
+  bool visitSelectorGroup(SelectorGroup group) =>
+      group.selectors.any(visitSelector);
+
+  bool visitSelector(Selector selector) {
+    var old = _element;
+    var result = true;
+
+    // Note: evaluate selectors right-to-left as it's more efficient.
+    int combinator = null;
+    for (var s in selector.simpleSelectorSequences.reversed) {
+      if (combinator == null) {
+        result = s.simpleSelector.visit(this);
+      } else if (combinator == TokenKind.COMBINATOR_DESCENDANT) {
+        // descendant combinator
+        // http://dev.w3.org/csswg/selectors-4/#descendant-combinators
+        do {
+          _element = _element.parent;
+        } while (_element != null && !s.simpleSelector.visit(this));
+
+        if (_element == null) result = false;
+      } else if (combinator == TokenKind.COMBINATOR_TILDE) {
+        // Following-sibling combinator
+        // http://dev.w3.org/csswg/selectors-4/#general-sibling-combinators
+        do {
+          _element = _element.previousElementSibling;
+        } while (_element != null && !s.simpleSelector.visit(this));
+
+        if (_element == null) result = false;
+      }
+
+      if (!result) break;
+
+      switch (s.combinator) {
+        case TokenKind.COMBINATOR_PLUS:
+          // Next-sibling combinator
+          // http://dev.w3.org/csswg/selectors-4/#adjacent-sibling-combinators
+          _element = _element.previousElementSibling;
+          break;
+        case TokenKind.COMBINATOR_GREATER:
+          // Child combinator
+          // http://dev.w3.org/csswg/selectors-4/#child-combinators
+          _element = _element.parent;
+          break;
+        case TokenKind.COMBINATOR_DESCENDANT:
+        case TokenKind.COMBINATOR_TILDE:
+          // We need to iterate through all siblings or parents.
+          // For now, just remember what the combinator was.
+          combinator = s.combinator;
+          break;
+        case TokenKind.COMBINATOR_NONE: break;
+        default: throw _unsupported(selector);
+      }
+
+      if (_element == null) {
+        result = false;
+        break;
+      }
+    }
+
+    _element = old;
+    return result;
+  }
+
+  _unimplemented(SimpleSelector selector) =>
+      new UnimplementedError("'$selector' selector of type "
+         "${selector.runtimeType} is not implemented");
+
+  _unsupported(selector) =>
+      new FormatException("'$selector' is not a valid selector");
+
+  bool visitPseudoClassSelector(PseudoClassSelector selector) {
+    switch (selector.name) {
+      // http://dev.w3.org/csswg/selectors-4/#structural-pseudos
+
+      // http://dev.w3.org/csswg/selectors-4/#the-root-pseudo
+      case 'root':
+        // TODO(jmesserly): fix when we have a .ownerDocument pointer
+        // return _element == _element.ownerDocument.rootElement;
+        return _element.localName == 'html' && _element.parentNode == null;
+
+      // http://dev.w3.org/csswg/selectors-4/#the-empty-pseudo
+      case 'empty':
+        return _element.nodes.any((n) => !(n is Element ||
+            n is Text && n.text.isNotEmpty));
+
+      // http://dev.w3.org/csswg/selectors-4/#the-blank-pseudo
+      case 'blank':
+        return _element.nodes.any((n) => !(n is Element ||
+            n is Text && n.text.runes.any((r) => !isWhitespaceCC(r))));
+
+      // http://dev.w3.org/csswg/selectors-4/#the-first-child-pseudo
+      case 'first-child':
+        return _element.previousElementSibling == null;
+
+      // http://dev.w3.org/csswg/selectors-4/#the-last-child-pseudo
+      case 'last-child':
+        return _element.nextElementSibling == null;
+
+      // http://dev.w3.org/csswg/selectors-4/#the-only-child-pseudo
+      case 'only-child':
+        return _element.previousElementSibling == null &&
+            _element.nextElementSibling == null;
+
+      // http://dev.w3.org/csswg/selectors-4/#link
+      case 'link':
+        return _element.attributes['href'] != null;
+
+      case 'visited':
+        // Always return false since we aren't a browser. This is allowed per:
+        // http://dev.w3.org/csswg/selectors-4/#visited-pseudo
+        return false;
+    }
+
+    // :before, :after, :first-letter/line can't match DOM elements.
+    if (_isLegacyPsuedoClass(selector.name)) return false;
+
+    throw _unimplemented(selector);
+  }
+
+
+  bool visitPseudoElementSelector(PseudoElementSelector selector) {
+    // :before, :after, :first-letter/line can't match DOM elements.
+    if (_isLegacyPsuedoClass(selector.name)) return false;
+
+    throw _unimplemented(selector);
+  }
+
+  static bool _isLegacyPsuedoClass(String name) {
+    switch (name) {
+      case 'before': case 'after': case 'first-line': case 'first-letter':
+        return true;
+      default: return false;
+    }
+  }
+
+  bool visitPseudoElementFunctionSelector(PseudoElementFunctionSelector s) =>
+      throw _unimplemented(s);
+
+  bool visitPseudoClassFunctionSelector(PseudoClassFunctionSelector selector) {
+    switch (selector.name) {
+      // http://dev.w3.org/csswg/selectors-4/#child-index
+
+      // http://dev.w3.org/csswg/selectors-4/#the-nth-child-pseudo
+      case 'nth-child':
+        // TODO(jmesserly): support An+B syntax too.
+        var exprs = selector.expression.expressions;
+        if (exprs.length == 1 && exprs[0] is LiteralTerm) {
+          LiteralTerm literal = exprs[0];
+          var parent = _element.parentNode;
+          return parent != null && literal.value > 0 &&
+              parent.nodes.indexOf(_element) == literal.value;
+        }
+        break;
+
+      // http://dev.w3.org/csswg/selectors-4/#the-lang-pseudo
+      case 'lang':
+        // TODO(jmesserly): shouldn't need to get the raw text here, but csslib
+        // gets confused by the "-" in the expression, such as in "es-AR".
+        var toMatch = selector.expression.span.text;
+        var lang = _getInheritedLanguage(_element);
+        // TODO(jmesserly): implement wildcards in level 4
+        return lang != null && lang.startsWith(toMatch);
+    }
+    throw _unimplemented(selector);
+  }
+
+  static String _getInheritedLanguage(Node node) {
+    while (node != null) {
+      var lang = node.attributes['lang'];
+      if (lang != null) return lang;
+      node = node.parent;
+    }
+    return null;
+  }
+
+  bool visitNamespaceSelector(NamespaceSelector selector) {
+    // Match element tag name
+    if (!selector.nameAsSimpleSelector.visit(this)) return false;
+
+    if (selector.isNamespaceWildcard) return true;
+
+    if (selector.namespace == '') return _element.namespaceUri == null;
+
+    throw _unimplemented(selector);
+  }
+
+  bool visitElementSelector(ElementSelector selector) =>
+      selector.isWildcard || _element.localName == selector.name.toLowerCase();
+
+  bool visitIdSelector(IdSelector selector) => _element.id == selector.name;
+
+  bool visitClassSelector(ClassSelector selector) =>
+      _element.classes.contains(selector.name);
+
+  // TODO(jmesserly): negation should support any selectors in level 4,
+  // not just simple selectors.
+  // http://dev.w3.org/csswg/selectors-4/#negation
+  bool visitNegationSelector(NegationSelector selector) =>
+      !selector.negationArg.visit(this);
+
+  bool visitAttributeSelector(AttributeSelector selector) {
+    // Match name first
+    var value = _element.attributes[selector.name.toLowerCase()];
+    if (value == null) return false;
+
+    if (selector.operatorKind == TokenKind.NO_MATCH) return true;
+
+    var select = '${selector.value}';
+    switch (selector.operatorKind) {
+      case TokenKind.EQUALS:
+        return value == select;
+      case TokenKind.INCLUDES:
+        return value.split(' ').any((v) => v.isNotEmpty && v == select);
+      case TokenKind.DASH_MATCH:
+        return value.startsWith(select) &&
+            (value.length == select.length || value[select.length] == '-');
+      case TokenKind.PREFIX_MATCH:
+        return value.startsWith(select);
+      case TokenKind.SUFFIX_MATCH:
+        return value.endsWith(select);
+      case TokenKind.SUBSTRING_MATCH:
+        return value.contains(select);
+      default: throw _unsupported(selector);
+    }
+  }
+}
diff --git a/pkg/third_party/html5lib/lib/src/treebuilder.dart b/pkg/third_party/html5lib/lib/src/treebuilder.dart
index 708c08c..0e17ab5 100644
--- a/pkg/third_party/html5lib/lib/src/treebuilder.dart
+++ b/pkg/third_party/html5lib/lib/src/treebuilder.dart
@@ -251,7 +251,7 @@
     var name = token.name;
     var namespace = token.namespace;
     if (namespace == null) namespace = defaultNamespace;
-    var element = new Element(name, namespace)
+    var element = document.createElementNS(namespace, name)
         ..attributes = token.data
         ..sourceSpan = token.span;
     return element;
@@ -266,7 +266,7 @@
     var name = token.name;
     var namespace = token.namespace;
     if (namespace == null) namespace = defaultNamespace;
-    var element = new Element(name, namespace)
+    var element = document.createElementNS(namespace, name)
         ..attributes = token.data
         ..sourceSpan = token.span;
     openElements.last.nodes.add(element);
@@ -357,8 +357,8 @@
     if (lastTable != null) {
       // XXX - we should really check that this parent is actually a
       // node here
-      if (lastTable.parent != null) {
-        fosterParent = lastTable.parent;
+      if (lastTable.parentNode != null) {
+        fosterParent = lastTable.parentNode;
         insertBefore = lastTable;
       } else {
         fosterParent = openElements[openElements.indexOf(lastTable) - 1];
diff --git a/pkg/third_party/html5lib/pubspec.yaml b/pkg/third_party/html5lib/pubspec.yaml
index 75038c6..66ff1c0 100644
--- a/pkg/third_party/html5lib/pubspec.yaml
+++ b/pkg/third_party/html5lib/pubspec.yaml
@@ -1,11 +1,12 @@
 name: html5lib
-version: 0.10.0
+version: 0.11.0
 author: Dart Team <misc@dartlang.org>
 description: A library for working with HTML documents.
 homepage: http://pub.dartlang.org/packages/html5lib
 environment:
   sdk: '>=1.2.0 <2.0.0'
 dependencies:
+  csslib: '>=0.10.0-dev <0.11.0'
   source_maps: '>=0.9.0 <0.10.0'
   utf: '>=0.9.0 <0.10.0'
 dev_dependencies:
diff --git a/pkg/third_party/html5lib/test/dom_test.dart b/pkg/third_party/html5lib/test/dom_test.dart
index 99dfb01..9251faf 100644
--- a/pkg/third_party/html5lib/test/dom_test.dart
+++ b/pkg/third_party/html5lib/test/dom_test.dart
@@ -2,71 +2,55 @@
 library dom_test;
 
 import 'package:unittest/unittest.dart';
+import 'package:html5lib/dom.dart';
 import 'package:html5lib/parser.dart';
 
 main() {
-  group('Node.querySelector type selectors', () {
-    test('x-foo', () {
-      expect(parse('<x-foo>').body.querySelector('x-foo'), isNotNull);
-    });
 
-    test('-x-foo', () {
-      var doc = parse('<body><-x-foo>');
-      expect(doc.body.outerHtml, equals('<body>&lt;-x-foo&gt;</body>'));
-      expect(doc.body.querySelector('-x-foo'), isNull);
-    });
-
-    test('foo123', () {
-      expect(parse('<foo123>').body.querySelector('foo123'), isNotNull);
-    });
-
-    test('built from fragments', () {
-      var doc = parse('<body>');
-      doc.body.nodes.add(parseFragment('<x-foo>'));
-      expect(doc.body.querySelector('x-foo'), isNotNull);
-    });
-
-    test('123 - invalid', () {
-      var doc = parse('<123>');
-      expect(() => doc.body.querySelector('123'), throwsUnimplementedError);
-    });
-
-    test('x\\ny - not implemented', () {
-      var doc = parse('<x\\ny>');
-      expect(() => doc.body.querySelector('x\\ny'), throwsUnimplementedError);
+  group('Element', () {
+    test('classes', () {
+      final barBaz = new Element.html('<div class=" bar baz"></div>');
+      final quxBaz = new Element.html('<div class="qux  baz "></div>');
+      expect(barBaz.className, ' bar baz');
+      expect(quxBaz.className, 'qux  baz ');
+      expect(barBaz.classes, ['bar', 'baz']);
+      expect(quxBaz.classes, ['qux', 'baz']);
     });
   });
 
-  group('Node.querySelectorAll type selectors', () {
-    test('x-foo', () {
-      expect(parse('<x-foo>').body.querySelectorAll('x-foo').length, 1);
+  group('Document', () {
+    final doc = parse('<div id=foo>'
+          '<div class=" bar baz"></div>'
+          '<div class="qux  baz "></div>'
+          '<div id=Foo>');
+
+    test('getElementById', () {
+      var foo = doc.body.nodes[0];
+      var Foo = foo.nodes[2];
+      expect(foo.id, 'foo');
+      expect(Foo.id, 'Foo');
+      expect(doc.getElementById('foo'), foo);
+      expect(doc.getElementById('Foo'), Foo);
     });
 
-    test('-x-foo', () {
-      var doc = parse('<body><-x-foo>');
-      expect(doc.body.outerHtml, equals('<body>&lt;-x-foo&gt;</body>'));
-      expect(doc.body.querySelectorAll('-x-foo').length, 0);
+    test('getElementsByClassName', () {
+      var foo = doc.body.nodes[0];
+      var barBaz = foo.nodes[0];
+      var quxBaz = foo.nodes[1];
+      expect(barBaz.className, ' bar baz');
+      expect(quxBaz.className, 'qux  baz ');
+      expect(doc.getElementsByClassName('baz'), [barBaz, quxBaz]);
+      expect(doc.getElementsByClassName('bar '), [barBaz]);
+      expect(doc.getElementsByClassName('  qux'), [quxBaz]);
+      expect(doc.getElementsByClassName(' baz qux'), [quxBaz]);
     });
 
-    test('foo123', () {
-      expect(parse('<foo123>').body.querySelectorAll('foo123').length, 1);
-    });
-
-    test('built from fragments', () {
-      var doc = parse('<body>');
-      doc.body.nodes.add(parseFragment('<x-foo></x-foo><x-foo>'));
-      expect(doc.body.querySelectorAll('x-foo').length, 2);
-    });
-
-    test('123 - invalid', () {
-      var doc = parse('<123>');
-      expect(() => doc.body.querySelectorAll('123'), throwsUnimplementedError);
-    });
-
-    test('x\\ny - not implemented', () {
-      var doc = parse('<x\\ny>');
-      expect(() => doc.body.querySelectorAll('x\\ny'),
-        throwsUnimplementedError);
+    test('getElementsByTagName', () {
+      var foo = doc.body.nodes[0];
+      var barBaz = foo.nodes[0];
+      var quxBaz = foo.nodes[1];
+      var Foo = foo.nodes[2];
+      expect(doc.getElementsByTagName('div'), [foo, barBaz, quxBaz, Foo]);
     });
   });
 
diff --git a/pkg/third_party/html5lib/test/parser_feature_test.dart b/pkg/third_party/html5lib/test/parser_feature_test.dart
index 212ae05..b21480d 100644
--- a/pkg/third_party/html5lib/test/parser_feature_test.dart
+++ b/pkg/third_party/html5lib/test/parser_feature_test.dart
@@ -11,7 +11,7 @@
   test('doctype is cloneable', () {
     var doc = parse('<!doctype HTML>');
     DocumentType doctype = doc.nodes[0];
-    expect(doctype.clone().toString(), '<!DOCTYPE html>');
+    expect(doctype.clone(false).toString(), '<!DOCTYPE html>');
   });
 
   test('line counter', () {
diff --git a/pkg/third_party/html5lib/test/selectors/LICENSE b/pkg/third_party/html5lib/test/selectors/LICENSE
new file mode 100644
index 0000000..0dc0193
--- /dev/null
+++ b/pkg/third_party/html5lib/test/selectors/LICENSE
@@ -0,0 +1,9 @@
+Contents of this folder are ported from
+https://github.com/w3c/web-platform-tests/tree/master/selectors-api
+
+It is based on commit 96c61ac7c21f7f37526d1c03c4c6087734524130
+
+The original code is covered by the dual-licensing approach described in:
+
+    http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html
+    
\ No newline at end of file
diff --git a/pkg/third_party/html5lib/test/selectors/README b/pkg/third_party/html5lib/test/selectors/README
new file mode 100644
index 0000000..d6e3852
--- /dev/null
+++ b/pkg/third_party/html5lib/test/selectors/README
@@ -0,0 +1,9 @@
+Contents of this folder are ported from
+https://github.com/w3c/web-platform-tests/tree/master/selectors-api
+
+It is based on commit 96c61ac7c21f7f37526d1c03c4c6087734524130
+
+It is used to test the implementation of querySelector/querySelectorAll.
+
+Not all code was ported; as the current implementation doesn't yet support
+all features of those methods.
diff --git a/pkg/third_party/html5lib/test/selectors/level1-content.html b/pkg/third_party/html5lib/test/selectors/level1-content.html
new file mode 100644
index 0000000..b90d918
--- /dev/null
+++ b/pkg/third_party/html5lib/test/selectors/level1-content.html
@@ -0,0 +1,377 @@
+<!DOCTYPE html>
+<html id="html" lang="en">
+<head id="head">
+	<meta id="meta" charset="UTF-8">
+	<title id="title">Selectors-API Test Suite: HTML with Selectors Level 2 using TestHarness: Test Document</title>
+
+	<!-- Links for :link and :visited pseudo-class test -->
+	<link id="pseudo-link-link1" href="">
+	<link id="pseudo-link-link2" href="http://example.org/">
+	<link id="pseudo-link-link3">
+	<style>
+	@namespace ns "http://www.w3.org/1999/xhtml";
+	 /* Declare the namespace prefix used in tests. This declaration should not be used by the API. */
+	</style>
+</head>
+<body id="body">
+<div id="root">
+	<div id="target"></div>
+
+	<div id="universal">
+		<p id="universal-p1">Universal selector tests inside element with <code id="universal-code1">id="universal"</code>.</p>
+		<hr id="universal-hr1">
+		<pre id="universal-pre1">Some preformatted text with some <span id="universal-span1">embedded code</span></pre>
+		<p id="universal-p2">This is a normal link: <a id="universal-a1" href="http://www.w3.org/">W3C</a></p>
+		<address id="universal-address1">Some more nested elements <code id="universal-code2"><a href="#" id="universal-a2">code hyperlink</a></code></address>
+	</div>
+
+	<div id="attr-presence">
+		<div class="attr-presence-div1" id="attr-presence-div1" align="center"></div>
+		<div class="attr-presence-div2" id="attr-presence-div2" align=""></div>
+		<div class="attr-presence-div3" id="attr-presence-div3" valign="center"></div>
+		<div class="attr-presence-div4" id="attr-presence-div4" alignv="center"></div>
+		<p id="attr-presence-p1"><a  id="attr-presence-a1" tItLe=""></a><span id="attr-presence-span1" TITLE="attr-presence-span1"></span></p>
+		<pre id="attr-presence-pre1" data-attr-presence="pre1"></pre>
+		<blockquote id="attr-presence-blockquote1" data-attr-presence="blockquote1"></blockquote>
+		<ul id="attr-presence-ul1" data-中文=""></ul>
+
+		<select id="attr-presence-select1">
+			<option id="attr-presence-select1-option1">A</option>
+			<option id="attr-presence-select1-option2">B</option>
+			<option id="attr-presence-select1-option3">C</option>
+			<option id="attr-presence-select1-option4">D</option>
+		</select>
+		<select id="attr-presence-select2">
+			<option id="attr-presence-select2-option1">A</option>
+			<option id="attr-presence-select2-option2">B</option>
+			<option id="attr-presence-select2-option3">C</option>
+			<option id="attr-presence-select2-option4" selected="selected">D</option>
+		</select>
+		<select id="attr-presence-select3" multiple="multiple">
+			<option id="attr-presence-select3-option1">A</option>
+			<option id="attr-presence-select3-option2" selected="">B</option>
+			<option id="attr-presence-select3-option3" selected="selected">C</option>
+			<option id="attr-presence-select3-option4">D</option>
+		</select>
+	</div>
+
+	<div id="attr-value">
+		<div id="attr-value-div1" align="center"></div>
+	    <div id="attr-value-div2" align=""></div>
+	    <div id="attr-value-div3" data-attr-value="&#xE9;"></div>
+	    <div id="attr-value-div4" data-attr-value_foo="&#xE9;"></div>
+
+		<form id="attr-value-form1">
+			<input id="attr-value-input1" type="text">
+			<input id="attr-value-input2" type="password">
+			<input id="attr-value-input3" type="hidden">
+			<input id="attr-value-input4" type="radio">
+			<input id="attr-value-input5" type="checkbox">
+			<input id="attr-value-input6" type="radio">
+			<input id="attr-value-input7" type="text">
+			<input id="attr-value-input8" type="hidden">
+			<input id="attr-value-input9" type="radio">
+		</form>
+
+		<div id="attr-value-div5" data-attr-value="中文"></div>
+	</div>
+
+	<div id="attr-whitespace">
+		<div id="attr-whitespace-div1" class="foo div1 bar"></div>
+	    <div id="attr-whitespace-div2" class=""></div>
+	    <div id="attr-whitespace-div3" class="foo div3 bar"></div>
+
+	    <div id="attr-whitespace-div4" data-attr-whitespace="foo &#xE9; bar"></div>
+	    <div id="attr-whitespace-div5" data-attr-whitespace_foo="&#xE9; foo"></div>
+
+		<a id="attr-whitespace-a1" rel="next bookmark"></a>
+		<a id="attr-whitespace-a2" rel="tag nofollow"></a>
+		<a id="attr-whitespace-a3" rel="tag bookmark"></a>
+		<a id="attr-whitespace-a4" rel="book mark"></a> <!-- Intentional space in "book mark" -->
+		<a id="attr-whitespace-a5" rel="nofollow"></a>
+		<a id="attr-whitespace-a6" rev="bookmark nofollow"></a>
+		<a id="attr-whitespace-a7" rel="prev next tag alternate nofollow author help icon noreferrer prefetch search stylesheet tag"></a>
+		
+		<p id="attr-whitespace-p1" title="Chinese 中文 characters"></p>
+	</div>
+
+	<div id="attr-hyphen">
+		<div id="attr-hyphen-div1"></div>
+	    <div id="attr-hyphen-div2" lang="fr"></div>
+	    <div id="attr-hyphen-div3" lang="en-AU"></div>
+	    <div id="attr-hyphen-div4" lang="es"></div>
+	</div>
+
+	<div id="attr-begins">
+		<a id="attr-begins-a1" href="http://www.example.org"></a>
+		<a id="attr-begins-a2" href="http://example.org/"></a>
+		<a id="attr-begins-a3" href="http://www.example.com/"></a>
+
+	    <div id="attr-begins-div1" lang="fr"></div>
+	    <div id="attr-begins-div2" lang="en-AU"></div>
+	    <div id="attr-begins-div3" lang="es"></div>
+	    <div id="attr-begins-div4" lang="en-US"></div>
+	    <div id="attr-begins-div5" lang="en"></div>
+
+		<p id="attr-begins-p1" class=" apple"></p> <!-- Intentional space in class value " apple". -->
+	</div>
+
+	<div id="attr-ends">
+		<a id="attr-ends-a1" href="http://www.example.org"></a>
+		<a id="attr-ends-a2" href="http://example.org/"></a>
+		<a id="attr-ends-a3" href="http://www.example.org"></a>
+
+	    <div id="attr-ends-div1" lang="fr"></div>
+	    <div id="attr-ends-div2" lang="de-CH"></div>
+	    <div id="attr-ends-div3" lang="es"></div>
+	    <div id="attr-ends-div4" lang="fr-CH"></div>
+
+		<p id="attr-ends-p1" class="apple "></p> <!-- Intentional space in class value "apple ". -->
+	</div>
+
+	<div id="attr-contains">
+		<a id="attr-contains-a1" href="http://www.example.org"></a>
+		<a id="attr-contains-a2" href="http://example.org/"></a>
+		<a id="attr-contains-a3" href="http://www.example.com/"></a>
+
+	    <div id="attr-contains-div1" lang="fr"></div>
+	    <div id="attr-contains-div2" lang="en-AU"></div>
+	    <div id="attr-contains-div3" lang="de-CH"></div>
+	    <div id="attr-contains-div4" lang="es"></div>
+	    <div id="attr-contains-div5" lang="fr-CH"></div>
+	    <div id="attr-contains-div6" lang="en-US"></div>
+
+		<p id="attr-contains-p1" class=" apple banana orange "></p>
+	</div>
+
+	<div id="pseudo-nth">
+		<table id="pseudo-nth-table1">
+			<tr id="pseudo-nth-tr1"><td id="pseudo-nth-td1"></td><td id="pseudo-nth-td2"></td><td id="pseudo-nth-td3"></td><td id="pseudo-nth-td4"></td><td id="pseudo-nth--td5"></td><td id="pseudo-nth-td6"></td></tr>
+			<tr id="pseudo-nth-tr2"><td id="pseudo-nth-td7"></td><td id="pseudo-nth-td8"></td><td id="pseudo-nth-td9"></td><td id="pseudo-nth-td10"></td><td id="pseudo-nth-td11"></td><td id="pseudo-nth-td12"></td></tr>
+			<tr id="pseudo-nth-tr3"><td id="pseudo-nth-td13"></td><td id="pseudo-nth-td14"></td><td id="pseudo-nth-td15"></td><td id="pseudo-nth-td16"></td><td id="pseudo-nth-td17"></td><td id="pseudo-nth-td18"></td></tr>
+		</table>
+		
+		<ol id="pseudo-nth-ol1">
+			<li id="pseudo-nth-li1"></li>
+			<li id="pseudo-nth-li2"></li>
+			<li id="pseudo-nth-li3"></li>
+			<li id="pseudo-nth-li4"></li>
+			<li id="pseudo-nth-li5"></li>
+			<li id="pseudo-nth-li6"></li>
+			<li id="pseudo-nth-li7"></li>
+			<li id="pseudo-nth-li8"></li>
+			<li id="pseudo-nth-li9"></li>
+			<li id="pseudo-nth-li10"></li>
+			<li id="pseudo-nth-li11"></li>
+			<li id="pseudo-nth-li12"></li>
+		</ol>
+
+		<p id="pseudo-nth-p1">
+			<span id="pseudo-nth-span1">span1</span>
+			<em id="pseudo-nth-em1">em1</em>
+			<!-- comment node-->
+			<em id="pseudo-nth-em2">em2</em>
+			<span id="pseudo-nth-span2">span2</span>
+			<strong id="pseudo-nth-strong1">strong1</strong>
+			<em id="pseudo-nth-em3">em3</em>
+			<span id="pseudo-nth-span3">span3</span>
+			<span id="pseudo-nth-span4">span4</span>
+			<strong id="pseudo-nth-strong2">strong2</strong>
+			<em id="pseudo-nth-em4">em4</em>
+		</p>
+	</div>
+
+	<div id="pseudo-first-child">
+		<div id="pseudo-first-child-div1"></div>
+		<div id="pseudo-first-child-div2"></div>
+		<div id="pseudo-first-child-div3"></div>
+
+		<p id="pseudo-first-child-p1"><span id="pseudo-first-child-span1"></span><span id="pseudo-first-child-span2"></span></p>
+		<p id="pseudo-first-child-p2"><span id="pseudo-first-child-span3"></span><span id="pseudo-first-child-span4"></span></p>
+		<p id="pseudo-first-child-p3"><span id="pseudo-first-child-span5"></span><span id="pseudo-first-child-span6"></span></p>
+	</div>
+
+	<div id="pseudo-last-child">
+		<p id="pseudo-last-child-p1"><span id="pseudo-last-child-span1"></span><span id="pseudo-last-child-span2"></span></p>
+		<p id="pseudo-last-child-p2"><span id="pseudo-last-child-span3"></span><span id="pseudo-last-child-span4"></span></p>
+		<p id="pseudo-last-child-p3"><span id="pseudo-last-child-span5"></span><span id="pseudo-last-child-span6"></span></p>
+
+		<div id="pseudo-last-child-div1"></div>
+		<div id="pseudo-last-child-div2"></div>
+		<div id="pseudo-last-child-div3"></div>
+	</div>
+
+	<div id="pseudo-only">
+		<p id="pseudo-only-p1">
+			<span id="pseudo-only-span1"></span>
+		</p>
+		<p id="pseudo-only-p2">
+			<span id="pseudo-only-span2"></span>
+			<span id="pseudo-only-span3"></span>
+		</p>
+		<p id="pseudo-only-p3">
+			<span id="pseudo-only-span4"></span>
+			<em id="pseudo-only-em1"></em>
+			<span id="pseudo-only-span5"></span>
+		</p>
+	</div>>
+
+	<div id="pseudo-empty">
+		<p id="pseudo-empty-p1"></p>
+		<p id="pseudo-empty-p2"><!-- comment node --></p>
+		<p id="pseudo-empty-p3"> </p>
+		<p id="pseudo-empty-p4">Text node</p>
+		<p id="pseudo-empty-p5"><span id="pseudo-empty-span1"></span></p>
+	</div>
+
+	<div id="pseudo-link">
+		<a id="pseudo-link-a1" href="">with href</a>
+		<a id="pseudo-link-a2" href="http://example.org/">with href</a>
+		<a id="pseudo-link-a3">without href</a>
+		<map name="pseudo-link-map1" id="pseudo-link-map1">
+			<area id="pseudo-link-area1" href="">
+			<area id="pseudo-link-area2">
+		</map>
+	</div>
+
+	<div id="pseudo-lang">
+		<div id="pseudo-lang-div1"></div>
+	    <div id="pseudo-lang-div2" lang="fr"></div>
+	    <div id="pseudo-lang-div3" lang="en-AU"></div>
+	    <div id="pseudo-lang-div4" lang="es"></div>
+	</div>
+
+	<div id="pseudo-ui">
+		<input id="pseudo-ui-input1" type="text">
+		<input id="pseudo-ui-input2" type="password">
+		<input id="pseudo-ui-input3" type="radio">
+		<input id="pseudo-ui-input4" type="radio" checked="checked">
+		<input id="pseudo-ui-input5" type="checkbox">
+		<input id="pseudo-ui-input6" type="checkbox" checked="checked">
+		<input id="pseudo-ui-input7" type="submit">
+		<input id="pseudo-ui-input8" type="button">
+		<input id="pseudo-ui-input9" type="hidden">
+		<textarea id="pseudo-ui-textarea1"></textarea>
+		<button id="pseudo-ui-button1">Enabled</button>
+
+		<input id="pseudo-ui-input10" disabled="disabled" type="text">
+		<input id="pseudo-ui-input11" disabled="disabled" type="password">
+		<input id="pseudo-ui-input12" disabled="disabled" type="radio">
+		<input id="pseudo-ui-input13" disabled="disabled" type="radio" checked="checked">
+		<input id="pseudo-ui-input14" disabled="disabled" type="checkbox">
+		<input id="pseudo-ui-input15" disabled="disabled" type="checkbox" checked="checked">
+		<input id="pseudo-ui-input16" disabled="disabled" type="submit">
+		<input id="pseudo-ui-input17" disabled="disabled" type="button">
+		<input id="pseudo-ui-input18" disabled="disabled" type="hidden">
+		<textarea id="pseudo-ui-textarea2" disabled="disabled"></textarea>
+		<button id="pseudo-ui-button2" disabled="disabled">Disabled</button>
+	</div>
+
+	<div id="not">
+		<div id="not-div1"></div>
+		<div id="not-div2"></div>
+		<div id="not-div3"></div>
+
+		<p id="not-p1"><span id="not-span1"></span><em id="not-em1"></em></p>
+		<p id="not-p2"><span id="not-span2"></span><em id="not-em2"></em></p>
+		<p id="not-p3"><span id="not-span3"></span><em id="not-em3"></em></p>
+	</div>
+
+	<div id="pseudo-element">All pseudo-element tests</div>
+
+	<div id="class">
+		<p id="class-p1" class="foo class-p bar"></p>
+		<p id="class-p2" class="class-p foo bar"></p>
+		<p id="class-p3" class="foo bar class-p"></p>
+
+		<!-- All permutations of the classes should match -->
+		<div id="class-div1" class="apple orange banana"></div>
+		<div id="class-div2" class="apple banana orange"></div>
+		<p id="class-p4" class="orange apple banana"></p>
+		<div id="class-div3" class="orange banana apple"></div>
+		<p id="class-p6" class="banana apple orange"></p>
+		<div id="class-div4" class="banana orange apple"></div>
+		<div id="class-div5" class="apple orange"></div>
+		<div id="class-div6" class="apple banana"></div>
+		<div id="class-div7" class="orange banana"></div>
+
+		<span id="class-span1" class="台北Táiběi 台北"></span>
+		<span id="class-span2" class="台北"></span>
+
+		<span id="class-span3" class="foo:bar"></span>
+		<span id="class-span4" class="test.foo[5]bar"></span>
+	</div>
+
+	<div id="id">
+		<div id="id-div1"></div>
+		<div id="id-div2"></div>
+
+		<ul id="id-ul1">
+			<li id="id-li-duplicate"></li>
+			<li id="id-li-duplicate"></li>
+			<li id="id-li-duplicate"></li>
+			<li id="id-li-duplicate"></li>
+		</ul>
+
+		<span id="台北Táiběi"></span>
+		<span id="台北"></span>
+
+		<span id="#foo:bar"></span>
+		<span id="test.foo[5]bar"></span>
+	</div>
+
+	<div id="descendant">
+		<div id="descendant-div1" class="descendant-div1">
+			<div id="descendant-div2" class="descendant-div2">
+				<div id="descendant-div3" class="descendant-div3">
+				</div>				
+			</div>
+		</div>
+		<div id="descendant-div4" class="descendant-div4"></div>
+	</div>
+
+	<div id="child">
+		<div id="child-div1" class="child-div1">
+			<div id="child-div2" class="child-div2">
+				<div id="child-div3" class="child-div3">
+				</div>				
+			</div>
+		</div>
+		<div id="child-div4" class="child-div4"></div>
+	</div>
+
+	<div id="adjacent">
+		<div id="adjacent-div1" class="adjacent-div1"></div>
+		<div id="adjacent-div2" class="adjacent-div2">
+			<div id="adjacent-div3" class="adjacent-div3"></div>
+		</div>
+		<div id="adjacent-div4" class="adjacent-div4">
+			<p id="adjacent-p1" class="adjacent-p1"></p>
+			<div id="adjacent-div5" class="adjacent-div5"></div>
+		</div>
+		<div id="adjacent-div6" class="adjacent-div6"></div>
+		<p id="adjacent-p2" class="adjacent-p2"></p>
+		<p id="adjacent-p3" class="adjacent-p3"></p>
+	</div>
+
+	<div id="sibling">
+		<div id="sibling-div1" class="sibling-div"></div>
+		<div id="sibling-div2" class="sibling-div">
+			<div id="sibling-div3" class="sibling-div"></div>
+		</div>
+		<div id="sibling-div4" class="sibling-div">
+			<p id="sibling-p1" class="sibling-p"></p>
+			<div id="sibling-div5" class="sibling-div"></div>
+		</div>
+		<div id="sibling-div6" class="sibling-div"></div>
+		<p id="sibling-p2" class="sibling-p"></p>
+		<p id="sibling-p3" class="sibling-p"></p>
+	</div>
+
+	<div id="group">
+		<em id="group-em1"></em>
+		<strong id="group-strong1"></strong>
+	</div>
+</div>
+</body>
+</html>
diff --git a/pkg/third_party/html5lib/test/selectors/level1_baseline_test.dart b/pkg/third_party/html5lib/test/selectors/level1_baseline_test.dart
new file mode 100644
index 0000000..cf9373c
--- /dev/null
+++ b/pkg/third_party/html5lib/test/selectors/level1_baseline_test.dart
@@ -0,0 +1,117 @@
+/// Test for the Selectors API ported from
+/// <https://github.com/w3c/web-platform-tests/tree/master/selectors-api>
+///
+/// Note, unlike the original we don't operate in-browser on a DOM loaded into
+/// an iframe, but instead operate over a parsed DOM.
+library html5lib.test.selectors.level1_baseline_test;
+
+import 'dart:io';
+import 'package:html5lib/dom.dart';
+import 'package:html5lib/parser.dart';
+import 'package:unittest/unittest.dart';
+import 'level1_lib.dart' hide test;
+import 'selectors.dart';
+
+Document getTestContentDocument() {
+  var testPath = Platform.script.resolve('level1-content.html').toFilePath();
+  return parse(new File(testPath).readAsStringSync());
+}
+
+var testType = TEST_QSA_BASELINE; // Only run baseline tests.
+var docType  = "html"; // Only run tests suitable for HTML
+
+main() {
+  /*
+   * This test suite tests Selectors API methods in 4 different contexts:
+   * 1. Document node
+   * 2. In-document Element node
+   * 3. Detached Element node (an element with no parent, not in the document)
+   * 4. Document Fragment node
+   *
+   * For each context, the following tests are run:
+   *
+   * The interface check tests ensure that each type of node exposes the Selectors API methods
+   *
+   * The special selector tests verify the result of passing special values for the selector parameter,
+   * to ensure that the correct WebIDL processing is performed, such as stringification of null and
+   * undefined and missing parameter. The universal selector is also tested here, rather than with the
+   * rest of ordinary selectors for practical reasons.
+   *
+   * The static list verification tests ensure that the node lists returned by the method remain unchanged
+   * due to subsequent document modication, and that a new list is generated each time the method is
+   * invoked based on the current state of the document.
+   *
+   * The invalid selector tests ensure that SyntaxError is thrown for invalid forms of selectors
+   *
+   * The valid selector tests check the result from querying many different types of selectors, with a
+   * list of expected elements. This checks that querySelector() always returns the first result from
+   * querySelectorAll(), and that all matching elements are correctly returned in tree-order. The tests
+   * can be limited by specifying the test types to run, using the testType variable. The constants for this
+   * can be found in selectors.js.
+   *
+   * All the selectors tested for both the valid and invalid selector tests are found in selectors.js.
+   * See comments in that file for documentation of the format used.
+   *
+   * The level1-lib.js file contains all the common test functions for running each of the aforementioned tests
+   */
+
+  // Prepare the nodes for testing
+  //doc = frame.contentDocument;                 // Document Node tests
+  doc = getTestContentDocument();
+
+  var element = doc.getElementById("root");   // In-document Element Node tests
+
+  //Setup the namespace tests
+  setupSpecialElements(element);
+
+  var outOfScope = element.clone(true);   // Append this to the body before running the in-document
+                                               // Element tests, but after running the Document tests. This
+                                               // tests that no elements that are not descendants of element
+                                               // are selected.
+
+  traverse(outOfScope, (elem) {        // Annotate each element as being a clone; used for verifying
+    elem.attributes["data-clone"] = "";     // that none of these elements ever match.
+  });
+
+  var detached = element.clone(true);     // Detached Element Node tests
+
+  var fragment = doc.createDocumentFragment(); // Fragment Node tests
+  fragment.append(element.clone(true));
+
+  // Setup Tests
+  interfaceCheck("Document", doc);
+  interfaceCheck("Detached Element", detached);
+  interfaceCheck("Fragment", fragment);
+  interfaceCheck("In-document Element", element);
+
+  runSpecialSelectorTests("Document", doc);
+  runSpecialSelectorTests("Detached Element", detached);
+  runSpecialSelectorTests("Fragment", fragment);
+  runSpecialSelectorTests("In-document Element", element);
+
+  verifyStaticList("Document", doc);
+  verifyStaticList("Detached Element", detached);
+  verifyStaticList("Fragment", fragment);
+  verifyStaticList("In-document Element", element);
+
+  // TODO(jmesserly): fix negative tests
+  //runInvalidSelectorTest("Document", doc, invalidSelectors);
+  //runInvalidSelectorTest("Detached Element", detached, invalidSelectors);
+  //runInvalidSelectorTest("Fragment", fragment, invalidSelectors);
+  //runInvalidSelectorTest("In-document Element", element, invalidSelectors);
+
+  runValidSelectorTest("Document", doc, validSelectors, testType, docType);
+  runValidSelectorTest("Detached Element", detached, validSelectors, testType, docType);
+  runValidSelectorTest("Fragment", fragment, validSelectors, testType, docType);
+
+  group('out of scope', () {
+    setUp(() {
+      doc.body.append(outOfScope); // Append before in-document Element tests.
+                                   // None of these elements should match
+    });
+    tearDown(() {
+      outOfScope.remove();
+    });
+    runValidSelectorTest("In-document Element", element, validSelectors, testType, docType);
+  });
+}
diff --git a/pkg/third_party/html5lib/test/selectors/level1_lib.dart b/pkg/third_party/html5lib/test/selectors/level1_lib.dart
new file mode 100644
index 0000000..31e0faf
--- /dev/null
+++ b/pkg/third_party/html5lib/test/selectors/level1_lib.dart
@@ -0,0 +1,275 @@
+/// Test for the Selectors API ported from
+/// <https://github.com/w3c/web-platform-tests/tree/master/selectors-api>
+///
+/// Note: tried to make minimal changes possible here. Hence some oddities such
+/// as [test] arguments having a different order, long lines, etc.
+///
+/// As usual with ports: being faithful to the original style is more important
+/// than other style goals, as it reduces friction to integrating changes
+/// from upstream.
+library html5lib.test.selectors.level1_lib;
+
+import 'package:html5lib/dom.dart';
+import 'package:unittest/unittest.dart' as unittest;
+
+Document doc;
+
+/*
+ * Create and append special elements that cannot be created correctly with HTML markup alone.
+ */
+setupSpecialElements(parent) {
+  // Setup null and undefined tests
+  parent.append(doc.createElement("null"));
+  parent.append(doc.createElement("undefined"));
+
+  // Setup namespace tests
+  var anyNS = doc.createElement("div");
+  var noNS = doc.createElement("div");
+  anyNS.id = "any-namespace";
+  noNS.id = "no-namespace";
+
+  var div;
+  div = [doc.createElement("div"),
+         doc.createElementNS("http://www.w3.org/1999/xhtml", "div"),
+         doc.createElementNS("", "div"),
+         doc.createElementNS("http://www.example.org/ns", "div")];
+
+  div[0].id = "any-namespace-div1";
+  div[1].id = "any-namespace-div2";
+  div[2].attributes["id"] = "any-namespace-div3"; // Non-HTML elements can't use .id property
+  div[3].attributes["id"] = "any-namespace-div4";
+
+  for (var i = 0; i < div.length; i++) {
+    anyNS.append(div[i]);
+  }
+
+  div = [doc.createElement("div"),
+         doc.createElementNS("http://www.w3.org/1999/xhtml", "div"),
+         doc.createElementNS("", "div"),
+         doc.createElementNS("http://www.example.org/ns", "div")];
+
+  div[0].id = "no-namespace-div1";
+  div[1].id = "no-namespace-div2";
+  div[2].attributes["id"] = "no-namespace-div3"; // Non-HTML elements can't use .id property
+  div[3].attributes["id"] = "no-namespace-div4";
+
+  for (var i = 0; i < div.length; i++) {
+    noNS.append(div[i]);
+  }
+
+  parent.append(anyNS);
+  parent.append(noNS);
+}
+
+/*
+ * Check that the querySelector and querySelectorAll methods exist on the given Node
+ */
+interfaceCheck(type, obj) {
+  test(() {
+    var q = obj.querySelector is Function;
+    assert_true(q, type + " supports querySelector.");
+  }, type + " supports querySelector");
+
+  test(() {
+    var qa = obj.querySelectorAll is Function;
+    assert_true( qa, type + " supports querySelectorAll.");
+  }, type + " supports querySelectorAll");
+
+  test(() {
+    var list = obj.querySelectorAll("div");
+    // TODO(jmesserly): testing List<Element> for now. It should return an
+    // ElementList which has extra properties. Needed for dart:html compat.
+    assert_true(list is List<Element>, "The result should be an instance of a NodeList");
+  }, type + ".querySelectorAll returns NodeList instance");
+}
+
+/*
+ * Verify that the NodeList returned by querySelectorAll is static and and that a new list is created after
+ * each call. A static list should not be affected by subsequent changes to the DOM.
+ */
+verifyStaticList(type, root) {
+  var pre, post, preLength;
+
+  test(() {
+    pre = root.querySelectorAll("div");
+    preLength = pre.length;
+
+    var div = doc.createElement("div");
+    (root is Document ? root.body : root).append(div);
+
+    assert_equals(pre.length, preLength, "The length of the NodeList should not change.");
+  }, type + ": static NodeList");
+
+  test(() {
+    post = root.querySelectorAll("div");
+    assert_equals(post.length, preLength + 1, "The length of the new NodeList should be 1 more than the previous list.");
+  }, type + ": new NodeList");
+}
+
+/*
+ * Verify handling of special values for the selector parameter, including stringification of
+ * null and undefined, and the handling of the empty string.
+ */
+runSpecialSelectorTests(type, root) {
+  // Dart note: changed these tests because we don't have auto conversion to
+  // String like JavaScript does.
+  test(() { // 1
+    assert_equals(root.querySelectorAll('null').length, 1, "This should find one element with the tag name 'NULL'.");
+  }, type + ".querySelectorAll null");
+
+  test(() { // 2
+    assert_equals(root.querySelectorAll('undefined').length, 1, "This should find one element with the tag name 'UNDEFINED'.");
+  }, type + ".querySelectorAll undefined");
+
+  test(() { // 3
+    assert_throws((e) => e is NoSuchMethodError, () {
+      root.querySelectorAll();
+    }, "This should throw a TypeError.");
+  }, type + ".querySelectorAll no parameter");
+
+  test(() { // 4
+    var elm = root.querySelector('null');
+    assert_not_equals(elm, null, "This should find an element.");
+    // TODO(jmesserly): change "localName" back to "tagName" once implemented.
+    assert_equals(elm.localName.toUpperCase(), "NULL", "The tag name should be 'NULL'.");
+  }, type + ".querySelector null");
+
+  test(() { // 5
+    var elm = root.querySelector('undefined');
+    assert_not_equals(elm, 'undefined', "This should find an element.");
+    // TODO(jmesserly): change "localName" back to "tagName" once implemented.
+    assert_equals(elm.localName.toUpperCase(), "UNDEFINED", "The tag name should be 'UNDEFINED'.");
+  }, type + ".querySelector undefined");
+
+  test(() { // 6
+    assert_throws((e) => e is NoSuchMethodError, () {
+      root.querySelector();
+    }, "This should throw a TypeError.");
+  }, type + ".querySelector no parameter");
+
+  test(() { // 7
+    var result = root.querySelectorAll("*");
+    var i = 0;
+    traverse(root, (elem) {
+      if (!identical(elem, root)) {
+        assert_equals(elem, result[i], "The result in index $i should be in tree order.");
+        i++;
+      }
+    });
+  }, type + ".querySelectorAll tree order");
+}
+
+/*
+ * Execute queries with the specified valid selectors for both querySelector() and querySelectorAll()
+ * Only run these tests when results are expected. Don't run for syntax error tests.
+ */
+ runValidSelectorTest(type, root, selectors, testType, docType) {
+  var nodeType = "";
+  switch (root.nodeType) {
+    case Node.DOCUMENT_NODE:
+      nodeType = "document";
+      break;
+    case Node.ELEMENT_NODE:
+      nodeType = root.parentNode != null ? "element" : "detached";
+      break;
+    case Node.DOCUMENT_FRAGMENT_NODE:
+      nodeType = "fragment";
+      break;
+    default:
+      throw new StateError("Reached unreachable code path.");
+  }
+
+  for (var i = 0; i < selectors.length; i++) {
+    var s = selectors[i];
+    var n = s["name"];
+    var q = s["selector"];
+    var e = s["expect"];
+
+    if ((s["exclude"] is! List || (s["exclude"].indexOf(nodeType) == -1 && s["exclude"].indexOf(docType) == -1))
+     && (s["testType"] & testType != 0) ) {
+      //console.log("Running tests " + nodeType + ": " + s["testType"] + "&" + testType + "=" + (s["testType"] & testType) + ": " + JSON.stringify(s))
+      var foundall, found;
+
+      test(() {
+        foundall = root.querySelectorAll(q);
+        assert_not_equals(foundall, null, "The method should not return null.");
+        assert_equals(foundall.length, e.length, "The method should return the expected number of matches.");
+
+        for (var i = 0; i < e.length; i++) {
+          assert_not_equals(foundall[i], null, "The item in index $i should not be null.");
+          assert_equals(foundall[i].attributes["id"], e[i], "The item in index $i should have the expected ID.");
+          assert_false(foundall[i].attributes.containsKey("data-clone"), "This should not be a cloned element.");
+        }
+      }, type + ".querySelectorAll: " + n + ": " + q);
+
+      test(() {
+        found = root.querySelector(q);
+
+        if (e.length > 0) {
+          assert_not_equals(found, null, "The method should return a match.");
+          assert_equals(found.attributes["id"], e[0], "The method should return the first match.");
+          assert_equals(found, foundall[0], "The result should match the first item from querySelectorAll.");
+          assert_false(found.attributes.containsKey("data-clone"), "This should not be annotated as a cloned element.");
+        } else {
+          assert_equals(found, null, "The method should not match anything.");
+        }
+      }, type + ".querySelector: " + n + ": " + q);
+    } else {
+      //console.log("Excluding for " + nodeType + ": " + s["testType"] + "&" + testType + "=" + (s["testType"] & testType) + ": " + JSON.stringify(s))
+    }
+  }
+}
+
+/*
+ * Execute queries with the specified invalid selectors for both querySelector() and querySelectorAll()
+ * Only run these tests when errors are expected. Don't run for valid selector tests.
+ */
+ runInvalidSelectorTest(type, root, selectors) {
+  for (var i = 0; i < selectors.length; i++) {
+    var s = selectors[i];
+    var n = s["name"];
+    var q = s["selector"];
+
+    // Dart note: FormatException seems a reasonable mapping of SyntaxError
+    test(() {
+      assert_throws((e) => e is FormatException, () {
+        root.querySelector(q);
+      });
+    }, type + ".querySelector: " + n + ": " + q);
+
+    test(() {
+      assert_throws((e) => e is FormatException, () {
+        root.querySelectorAll(q);
+      });
+    }, type + ".querySelectorAll: " + n + ": " + q);
+  }
+}
+
+ traverse(Node elem, fn) {
+  if (elem.nodeType == Node.ELEMENT_NODE) {
+    fn(elem);
+  }
+
+  // Dart note: changed this since html5lib doens't support nextNode yet.
+  for (var node in elem.nodes) {
+    traverse(node, fn);
+  }
+}
+
+
+test(Function body, String name) => unittest.test(name, body);
+
+assert_true(value, String reason) =>
+    unittest.expect(value, true, reason: reason);
+
+assert_false(value, String reason) =>
+    unittest.expect(value, false, reason: reason);
+
+assert_equals(x, y, reason) =>
+    unittest.expect(x, y, reason: reason);
+
+assert_not_equals(x, y, reason) =>
+    unittest.expect(x, unittest.isNot(y), reason: reason);
+
+assert_throws(exception, body, [reason]) =>
+    unittest.expect(body, unittest.throwsA(exception), reason: reason);
diff --git a/pkg/third_party/html5lib/test/selectors/selectors.dart b/pkg/third_party/html5lib/test/selectors/selectors.dart
new file mode 100644
index 0000000..fd8bd96
--- /dev/null
+++ b/pkg/third_party/html5lib/test/selectors/selectors.dart
@@ -0,0 +1,363 @@
+/// Test for the Selectors API ported from
+/// <https://github.com/w3c/web-platform-tests/tree/master/selectors-api>
+library html5lib.test.selectors.selectors;
+
+// Bit-mapped flags to indicate which tests the selector is suitable for
+var TEST_QSA_BASELINE     = 0x01; // querySelector() and querySelectorAll() baseline tests
+var TEST_QSA_ADDITIONAL   = 0x02; // querySelector() and querySelectorAll() additional tests
+var TEST_FIND_BASELINE    = 0x04; // find() and findAll() baseline tests, may be unsuitable for querySelector[All]
+var TEST_FIND_ADDITIONAL  = 0x08; // find() and findAll() additional tests, may be unsuitable for querySelector[All]
+var TEST_MATCH_BASELINE   = 0x10; // matches() baseline tests
+var TEST_MATCH_ADDITIONAL = 0x20; // matches() additional tests
+
+
+/*
+ * All of these invalid selectors should result in a SyntaxError being thrown by the APIs.
+ *
+ *   name:     A descriptive name of the selector being tested
+ *   selector: The selector to test
+ */
+var invalidSelectors = [
+  {'name': "Empty String",                 'selector': ""},
+  {'name': "Invalid character",            'selector': "["},
+  {'name': "Invalid character",            'selector': "]"},
+  {'name': "Invalid character",            'selector': "("},
+  {'name': "Invalid character",            'selector': ")"},
+  {'name': "Invalid character",            'selector': "{"},
+  {'name': "Invalid character",            'selector': "}"},
+  {'name': "Invalid character",            'selector': "<"},
+  {'name': "Invalid character",            'selector': ">"},
+  {'name': "Invalid ID",                   'selector': "#"},
+  {'name': "Invalid group of selectors",   'selector': "div,"},
+  {'name': "Invalid class",                'selector': "."},
+  {'name': "Invalid class",                'selector': ".5cm"},
+  {'name': "Invalid class",                'selector': "..test"},
+  {'name': "Invalid class",                'selector': ".foo..quux"},
+  {'name': "Invalid class",                'selector': ".bar."},
+  {'name': "Invalid combinator",           'selector': "div & address, p"},
+  {'name': "Invalid combinator",           'selector': "div >> address, p"},
+  {'name': "Invalid combinator",           'selector': "div ++ address, p"},
+  {'name': "Invalid combinator",           'selector': "div ~~ address, p"},
+  {'name': "Invalid [att=value] selector", 'selector': "[*=test]"},
+  {'name': "Invalid [att=value] selector", 'selector': "[*|*=test]"},
+  {'name': "Invalid [att=value] selector", 'selector': "[class= space unquoted ]"},
+  {'name': "Unknown pseudo-class",         'selector': "div:example"},
+  {'name': "Unknown pseudo-class",         'selector': ":example"},
+  {'name': "Unknown pseudo-element",       'selector': "div::example"},
+  {'name': "Unknown pseudo-element",       'selector': "::example"},
+  {'name': "Invalid pseudo-element",       'selector': ":::before"},
+  {'name': "Undeclared namespace",         'selector': "ns|div"},
+  {'name': "Undeclared namespace",         'selector': ":not(ns|div)"},
+  {'name': "Invalid namespace",            'selector': "^|div"},
+  {'name': "Invalid namespace",            'selector': "\$|div"}
+];
+
+/*
+ * All of these should be valid selectors, expected to match zero or more elements in the document.
+ * None should throw any errors.
+ *
+ *   name:     A descriptive name of the selector being tested
+ *   selector: The selector to test
+ *   'expect':   A list of IDs of the elements expected to be matched. List must be given in tree order.
+ *   'exclude':  An array of contexts to exclude from testing. The valid values are:
+ *             ["document", "element", "fragment", "detached", "html", "xhtml"]
+ *             The "html" and "xhtml" values represent the type of document being queried. These are useful
+ *             for tests that are affected by differences between HTML and XML, such as case sensitivity.
+ *   'level':    An integer indicating the CSS or Selectors level in which the selector being tested was introduced.
+ *   'testType': A bit-mapped flag indicating the type of test.
+ *
+ * Note: Interactive pseudo-classes (:active :hover and :focus) have not been tested in this test suite.
+ */
+var validSelectors = [
+  // Type Selector
+  {'name': "Type selector, matching html element", 'selector': "html", 'expect': ["html"],          'exclude': ["element", "fragment", "detached"], 'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Type selector, matching html element", 'selector': "html", 'expect': [] /*no matches*/, 'exclude': ["document"],                        'level': 1, 'testType': TEST_QSA_BASELINE},
+  {'name': "Type selector, matching body element", 'selector': "body", 'expect': ["body"],          'exclude': ["element", "fragment", "detached"], 'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Type selector, matching body element", 'selector': "body", 'expect': [] /*no matches*/, 'exclude': ["document"],                        'level': 1, 'testType': TEST_QSA_BASELINE},
+
+  // Universal Selector
+  // Testing "*" for entire an entire context node is handled separately.
+  {'name': "Universal selector, matching all children of element with specified ID",       'selector': "#universal>*",   'expect': ["universal-p1", "universal-hr1", "universal-pre1", "universal-p2", "universal-address1"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Universal selector, matching all grandchildren of element with specified ID",  'selector': "#universal>*>*", 'expect': ["universal-code1", "universal-span1", "universal-a1", "universal-code2"],                 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Universal selector, matching all children of empty element with specified ID", 'selector': "#empty>*",       'expect': [] /*no matches*/,                                                                         'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "Universal selector, matching all descendants of element with specified ID",    'selector': "#universal *",   'expect': ["universal-p1", "universal-code1", "universal-hr1", "universal-pre1", "universal-span1", "universal-p2", "universal-a1", "universal-address1", "universal-code2", "universal-a2"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+
+  // Attribute Selectors
+  // - presence                  [att]
+  {'name': "Attribute presence selector, matching align attribute with value",                    'selector': ".attr-presence-div1[align]",                             'expect': ["attr-presence-div1"],                                             'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute presence selector, matching align attribute with empty value",              'selector': ".attr-presence-div2[align]",                             'expect': ["attr-presence-div2"],                                             'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute presence selector, matching title attribute, case insensitivity",           'selector': "#attr-presence [TiTlE]",                                 'expect': ["attr-presence-a1", "attr-presence-span1"], 'exclude': ["xhtml"],    'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute presence selector, not matching title attribute, case sensitivity",         'selector': "#attr-presence [TiTlE]",                                 'expect': [],                                          'exclude': ["html"],     'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute presence selector, matching custom data-* attribute",                       'selector': "[data-attr-presence]",                                   'expect': ["attr-presence-pre1", "attr-presence-blockquote1"],                'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute presence selector, not matching attribute with similar name",               'selector': ".attr-presence-div3[align], .attr-presence-div4[align]", 'expect': [] /*no matches*/,                                                  'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "Attribute presence selector, matching attribute with non-ASCII characters",           'selector': "ul[data-中文]",                                            'expect': ["attr-presence-ul1"],                                              'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute presence selector, not matching default option without selected attribute", 'selector': "#attr-presence-select1 option[selected]",                'expect': [] /* no matches */,                                                'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "Attribute presence selector, matching option with selected attribute",                'selector': "#attr-presence-select2 option[selected]",                'expect': ["attr-presence-select2-option4"],                                  'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute presence selector, matching multiple options with selected attributes",     'selector': "#attr-presence-select3 option[selected]",                'expect': ["attr-presence-select3-option2", "attr-presence-select3-option3"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+
+  // - value                     [att=val]
+  {'name': "Attribute value selector, matching align attribute with value",                                    'selector': "#attr-value [align=\"center\"]",                                     'expect': ["attr-value-div1"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute value selector, matching align attribute with empty value",                              'selector': "#attr-value [align=\"\"]",                                           'expect': ["attr-value-div2"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute value selector, not matching align attribute with partial value",                        'selector': "#attr-value [align=\"c\"]",                                          'expect': [] /*no matches*/,   'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "Attribute value selector, not matching align attribute with incorrect value",                      'selector': "#attr-value [align=\"centera\"]",                                    'expect': [] /*no matches*/,   'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "Attribute value selector, matching custom data-* attribute with unicode escaped value",            'selector': "[data-attr-value=\"\\e9\"]",                                         'expect': ["attr-value-div3"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute value selector, matching custom data-* attribute with escaped character",                'selector': "[data-attr-value\_foo=\"\\e9\"]",                                    'expect': ["attr-value-div4"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute value selector with single-quoted value, matching multiple inputs with type attributes", 'selector': "#attr-value input[type='hidden'],#attr-value input[type='radio']",   'expect': ["attr-value-input3", "attr-value-input4", "attr-value-input6", "attr-value-input8", "attr-value-input9"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute value selector with double-quoted value, matching multiple inputs with type attributes", 'selector': "#attr-value input[type=\"hidden\"],#attr-value input[type='radio']", 'expect': ["attr-value-input3", "attr-value-input4", "attr-value-input6", "attr-value-input8", "attr-value-input9"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute value selector with unquoted value, matching multiple inputs with type attributes",      'selector': "#attr-value input[type=hidden],#attr-value input[type=radio]",       'expect': ["attr-value-input3", "attr-value-input4", "attr-value-input6", "attr-value-input8", "attr-value-input9"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute value selector, matching attribute with value using non-ASCII characters",               'selector': "[data-attr-value=中文]",                                               'expect': ["attr-value-div5"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+
+  // - whitespace-separated list [att~=val]
+  {'name': "Attribute whitespace-separated list selector, matching class attribute with value",                                  'selector': "#attr-whitespace [class~=\"div1\"]",                                        'expect': ["attr-whitespace-div1"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute whitespace-separated list selector, not matching class attribute with empty value",                        'selector': "#attr-whitespace [class~=\"\"]",                                            'expect': [] /*no matches*/ ,       'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "Attribute whitespace-separated list selector, not matching class attribute with partial value",                      'selector': "[data-attr-whitespace~=\"div\"]",                                           'expect': [] /*no matches*/ ,       'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "Attribute whitespace-separated list selector, matching custom data-* attribute with unicode escaped value",          'selector': "[data-attr-whitespace~=\"\\0000e9\"]",                                      'expect': ["attr-whitespace-div4"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute whitespace-separated list selector, matching custom data-* attribute with escaped character",              'selector': "[data-attr-whitespace\_foo~=\"\\e9\"]",                                     'expect': ["attr-whitespace-div5"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute whitespace-separated list selector with single-quoted value, matching multiple links with rel attributes", 'selector': "#attr-whitespace a[rel~='bookmark'],  #attr-whitespace a[rel~='nofollow']", 'expect': ["attr-whitespace-a1", "attr-whitespace-a2", "attr-whitespace-a3", "attr-whitespace-a5", "attr-whitespace-a7"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute whitespace-separated list selector with double-quoted value, matching multiple links with rel attributes", 'selector': "#attr-whitespace a[rel~=\"bookmark\"],#attr-whitespace a[rel~='nofollow']", 'expect': ["attr-whitespace-a1", "attr-whitespace-a2", "attr-whitespace-a3", "attr-whitespace-a5", "attr-whitespace-a7"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute whitespace-separated list selector with unquoted value, matching multiple links with rel attributes",      'selector': "#attr-whitespace a[rel~=bookmark],    #attr-whitespace a[rel~=nofollow]",   'expect': ["attr-whitespace-a1", "attr-whitespace-a2", "attr-whitespace-a3", "attr-whitespace-a5", "attr-whitespace-a7"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute whitespace-separated list selector with double-quoted value, not matching value with space",               'selector': "#attr-whitespace a[rel~=\"book mark\"]",                                    'expect': [] /* no matches */,      'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "Attribute whitespace-separated list selector, matching title attribute with value using non-ASCII characters",       'selector': "#attr-whitespace [title~=中文]",                                              'expect': ["attr-whitespace-p1"],   'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+
+  // - hyphen-separated list     [att|=val]
+  {'name': "Attribute hyphen-separated list selector, not matching unspecified lang attribute",    'selector': "#attr-hyphen-div1[lang|=\"en\"]",    'expect': [] /*no matches*/,    'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "Attribute hyphen-separated list selector, matching lang attribute with exact value",   'selector': "#attr-hyphen-div2[lang|=\"fr\"]",    'expect': ["attr-hyphen-div2"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute hyphen-separated list selector, matching lang attribute with partial value", 'selector': "#attr-hyphen-div3[lang|=\"en\"]",    'expect': ["attr-hyphen-div3"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Attribute hyphen-separated list selector, not matching incorrect value",               'selector': "#attr-hyphen-div4[lang|=\"es-AR\"]", 'expect': [] /*no matches*/,    'level': 2, 'testType': TEST_QSA_BASELINE},
+
+  // - substring begins-with     [att^=val] (Level 3)
+  {'name': "Attribute begins with selector, matching href attributes beginning with specified substring",                             'selector': "#attr-begins a[href^=\"http://www\"]", 'expect': ["attr-begins-a1", "attr-begins-a3"],     'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute begins with selector, matching lang attributes beginning with specified substring, ",                           'selector': "#attr-begins [lang^=\"en-\"]",         'expect': ["attr-begins-div2", "attr-begins-div4"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute begins with selector, not matching class attribute not beginning with specified substring",                     'selector': "#attr-begins [class^=apple]",          'expect': [] /*no matches*/,                        'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+  {'name': "Attribute begins with selector with single-quoted value, matching class attribute beginning with specified substring",    'selector': "#attr-begins [class^=' apple']",       'expect': ["attr-begins-p1"],                       'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute begins with selector with double-quoted value, matching class attribute beginning with specified substring",    'selector': "#attr-begins [class^=\" apple\"]",     'expect': ["attr-begins-p1"],                       'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute begins with selector with unquoted value, not matching class attribute not beginning with specified substring", 'selector': "#attr-begins [class^= apple]",         'expect': [] /*no matches*/,                        'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+
+  // - substring ends-with       [att\$=val] (Level 3)
+  {'name': "Attribute ends with selector, matching href attributes ending with specified substring",                             'selector': "#attr-ends a[href\$=\".org\"]",   'expect': ["attr-ends-a1", "attr-ends-a3"],     'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute ends with selector, matching lang attributes ending with specified substring, ",                           'selector': "#attr-ends [lang\$=\"-CH\"]",     'expect': ["attr-ends-div2", "attr-ends-div4"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute ends with selector, not matching class attribute not ending with specified substring",                     'selector': "#attr-ends [class\$=apple]",      'expect': [] /*no matches*/,                    'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+  {'name': "Attribute ends with selector with single-quoted value, matching class attribute ending with specified substring",    'selector': "#attr-ends [class\$='apple ']",   'expect': ["attr-ends-p1"],                     'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute ends with selector with double-quoted value, matching class attribute ending with specified substring",    'selector': "#attr-ends [class\$=\"apple \"]", 'expect': ["attr-ends-p1"],                     'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute ends with selector with unquoted value, not matching class attribute not ending with specified substring", 'selector': "#attr-ends [class\$=apple ]",     'expect': [] /*no matches*/,                    'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+
+  // - substring contains        [att*=val] (Level 3)
+  {'name': "Attribute contains selector, matching href attributes beginning with specified substring",                          'selector': "#attr-contains a[href*=\"http://www\"]",     'expect': ["attr-contains-a1", "attr-contains-a3"],     'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute contains selector, matching href attributes ending with specified substring",                             'selector': "#attr-contains a[href*=\".org\"]",           'expect': ["attr-contains-a1", "attr-contains-a2"],     'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute contains selector, matching href attributes containing specified substring",                              'selector': "#attr-contains a[href*=\".example.\"]",      'expect': ["attr-contains-a1", "attr-contains-a3"],     'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute contains selector, matching lang attributes beginning with specified substring, ",                        'selector': "#attr-contains [lang*=\"en-\"]",             'expect': ["attr-contains-div2", "attr-contains-div6"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute contains selector, matching lang attributes ending with specified substring, ",                           'selector': "#attr-contains [lang*=\"-CH\"]",             'expect': ["attr-contains-div3", "attr-contains-div5"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute contains selector with single-quoted value, matching class attribute beginning with specified substring", 'selector': "#attr-contains [class*=' apple']",           'expect': ["attr-contains-p1"],                         'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute contains selector with single-quoted value, matching class attribute ending with specified substring",    'selector': "#attr-contains [class*='orange ']",          'expect': ["attr-contains-p1"],                         'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute contains selector with single-quoted value, matching class attribute containing specified substring",     'selector': "#attr-contains [class*='ple banana ora']",   'expect': ["attr-contains-p1"],                         'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute contains selector with double-quoted value, matching class attribute beginning with specified substring", 'selector': "#attr-contains [class*=\" apple\"]",         'expect': ["attr-contains-p1"],                         'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute contains selector with double-quoted value, matching class attribute ending with specified substring",    'selector': "#attr-contains [class*=\"orange \"]",        'expect': ["attr-contains-p1"],                         'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute contains selector with double-quoted value, matching class attribute containing specified substring",     'selector': "#attr-contains [class*=\"ple banana ora\"]", 'expect': ["attr-contains-p1"],                         'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute contains selector with unquoted value, matching class attribute beginning with specified substring",      'selector': "#attr-contains [class*= apple]",             'expect': ["attr-contains-p1"],                         'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute contains selector with unquoted value, matching class attribute ending with specified substring",         'selector': "#attr-contains [class*=orange ]",            'expect': ["attr-contains-p1"],                         'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "Attribute contains selector with unquoted value, matching class attribute containing specified substring",          'selector': "#attr-contains [class*= banana ]",           'expect': ["attr-contains-p1"],                         'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+
+  // Pseudo-classes
+  // - :root                 (Level 3)
+  {'name': ":root pseudo-class selector, matching document root element",      'selector': ":root", 'expect': ["html"],          'exclude': ["element", "fragment", "detached"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":root pseudo-class selector, not matching document root element",  'selector': ":root", 'expect': [] /*no matches*/, 'exclude': ["document"],                        'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+
+  // - :nth-child(n)         (Level 3)
+  {'name': ":nth-child selector, matching the third child element",                              'selector': "#pseudo-nth-table1 :nth-child(3)", 'expect': ["pseudo-nth-td3", "pseudo-nth-td9", "pseudo-nth-tr3", "pseudo-nth-td15"],                    'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":nth-child selector, matching every third child element",                            'selector': "#pseudo-nth li:nth-child(3n)",     'expect': ["pseudo-nth-li3", "pseudo-nth-li6", "pseudo-nth-li9", "pseudo-nth-li12"],                    'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":nth-child selector, matching every second child element, starting from the fourth", 'selector': "#pseudo-nth li:nth-child(2n+4)",   'expect': ["pseudo-nth-li4", "pseudo-nth-li6", "pseudo-nth-li8", "pseudo-nth-li10", "pseudo-nth-li12"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":nth-child selector, matching every fourth child element, starting from the third",  'selector': "#pseudo-nth-p1 :nth-child(4n-1)",  'expect': ["pseudo-nth-em2", "pseudo-nth-span3"],                                                       'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+
+  // - :nth-last-child       (Level 3)
+  {'name': ":nth-last-child selector, matching the third last child element",                                           'selector': "#pseudo-nth-table1 :nth-last-child(3)", 'expect': ["pseudo-nth-tr1", "pseudo-nth-td4", "pseudo-nth-td10", "pseudo-nth-td16"],                 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":nth-last-child selector, matching every third child element from the end",                                 'selector': "#pseudo-nth li:nth-last-child(3n)",     'expect': ["pseudo-nth-li1", "pseudo-nth-li4", "pseudo-nth-li7", "pseudo-nth-li10"],                  'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":nth-last-child selector, matching every second child element from the end, starting from the fourth last", 'selector': "#pseudo-nth li:nth-last-child(2n+4)",   'expect': ["pseudo-nth-li1", "pseudo-nth-li3", "pseudo-nth-li5", "pseudo-nth-li7", "pseudo-nth-li9"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":nth-last-child selector, matching every fourth element from the end, starting from the third last",        'selector': "#pseudo-nth-p1 :nth-last-child(4n-1)",  'expect': ["pseudo-nth-span2", "pseudo-nth-span4"],                                                   'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+
+  // - :nth-of-type(n)       (Level 3)
+  {'name': ":nth-of-type selector, matching the third em element",                                        'selector': "#pseudo-nth-p1 em:nth-of-type(3)",      'expect': ["pseudo-nth-em3"],                                                                                 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":nth-of-type selector, matching every second element of their type",                          'selector': "#pseudo-nth-p1 :nth-of-type(2n)",       'expect': ["pseudo-nth-em2", "pseudo-nth-span2", "pseudo-nth-span4", "pseudo-nth-strong2", "pseudo-nth-em4"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":nth-of-type selector, matching every second elemetn of their type, starting from the first", 'selector': "#pseudo-nth-p1 span:nth-of-type(2n-1)", 'expect': ["pseudo-nth-span1", "pseudo-nth-span3"],                                                           'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+
+  // - :nth-last-of-type(n)  (Level 3)
+  {'name': ":nth-last-of-type selector, matching the thrid last em element", 'selector': "#pseudo-nth-p1 em:nth-last-of-type(3)",      'expect': ["pseudo-nth-em2"],                                                                                 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":nth-last-of-type selector, matching every second last element of their type", 'selector': "#pseudo-nth-p1 :nth-last-of-type(2n)",       'expect': ["pseudo-nth-span1", "pseudo-nth-em1", "pseudo-nth-strong1", "pseudo-nth-em3", "pseudo-nth-span3"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":nth-last-of-type selector, matching every second last element of their type, starting from the last", 'selector': "#pseudo-nth-p1 span:nth-last-of-type(2n-1)", 'expect': ["pseudo-nth-span2", "pseudo-nth-span4"],                                                           'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+
+  // - :first-of-type        (Level 3)
+  {'name': ":first-of-type selector, matching the first em element", 'selector': "#pseudo-nth-p1 em:first-of-type",      'expect': ["pseudo-nth-em1"],                                           'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":first-of-type selector, matching the first of every type of element", 'selector': "#pseudo-nth-p1 :first-of-type",        'expect': ["pseudo-nth-span1", "pseudo-nth-em1", "pseudo-nth-strong1"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":first-of-type selector, matching the first td element in each table row", 'selector': "#pseudo-nth-table1 tr :first-of-type", 'expect': ["pseudo-nth-td1", "pseudo-nth-td7", "pseudo-nth-td13"],      'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+
+  // - :last-of-type         (Level 3)
+  {'name': ":last-of-type selector, matching the last em elemnet", 'selector': "#pseudo-nth-p1 em:last-of-type",      'expect': ["pseudo-nth-em4"],                                           'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":last-of-type selector, matching the last of every type of element", 'selector': "#pseudo-nth-p1 :last-of-type",        'expect': ["pseudo-nth-span4", "pseudo-nth-strong2", "pseudo-nth-em4"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":last-of-type selector, matching the last td element in each table row", 'selector': "#pseudo-nth-table1 tr :last-of-type", 'expect': ["pseudo-nth-td6", "pseudo-nth-td12", "pseudo-nth-td18"],     'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+
+  // - :first-child
+  {'name': ":first-child pseudo-class selector, matching first child div element",          'selector': "#pseudo-first-child div:first-child",                                        'expect': ["pseudo-first-child-div1"],                                                          'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': ":first-child pseudo-class selector, doesn't match non-first-child elements",    'selector': ".pseudo-first-child-div2:first-child, .pseudo-first-child-div3:first-child", 'expect': [] /*no matches*/,                                                                    'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': ":first-child pseudo-class selector, matching first-child of multiple elements", 'selector': "#pseudo-first-child span:first-child",                                       'expect': ["pseudo-first-child-span1", "pseudo-first-child-span3", "pseudo-first-child-span5"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+
+  // - :last-child           (Level 3)
+  {'name': ":last-child pseudo-class selector, matching last child div element",           'selector': "#pseudo-last-child div:last-child",                                       'expect': ["pseudo-last-child-div3"],                                                        'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":last-child pseudo-class selector, doesn't match non-last-child elements",     'selector': ".pseudo-last-child-div1:last-child, .pseudo-last-child-div2:first-child", 'expect': [] /*no matches*/,                                                                 'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+  {'name': ":last-child pseudo-class selector, matching first-child of multiple elements", 'selector': "#pseudo-last-child span:last-child",                                      'expect': ["pseudo-last-child-span2", "pseudo-last-child-span4", "pseudo-last-child-span6"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+
+  // - :only-child           (Level 3)
+  {'name': ":pseudo-only-child pseudo-class selector, matching all only-child elements", 'selector': "#pseudo-only :only-child", 'expect': ["pseudo-only-span1"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":pseudo-only-child pseudo-class selector, matching only-child em elements",  'selector': "#pseudo-only em:only-child", 'expect': [] /*no matches*/,   'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+
+  // - :only-of-type         (Level 3)
+  {'name': ":pseudo-only-of-type pseudo-class selector, matching all elements with no siblings of the same type", 'selector': "#pseudo-only :only-of-type", 'expect': ["pseudo-only-span1", "pseudo-only-em1"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":pseudo-only-of-type pseudo-class selector, matching em elements with no siblings of the same type",  'selector': "#pseudo-only em:only-of-type", 'expect': ["pseudo-only-em1"],                    'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+
+  // - :empty                (Level 3)
+  {'name': ":empty pseudo-class selector, matching empty p elements",   'selector': "#pseudo-empty p:empty", 'expect': ["pseudo-empty-p1", "pseudo-empty-p2"],                       'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":empty pseudo-class selector, matching all empty elements", 'selector': "#pseudo-empty :empty",  'expect': ["pseudo-empty-p1", "pseudo-empty-p2", "pseudo-empty-span1"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+
+  // - :link and :visited
+  // Implementations may treat all visited links as unvisited, so these cannot be tested separately.
+  // The only guarantee is that ":link,:visited" matches the set of all visited and unvisited links and that they are individually mutually exclusive sets.
+  {'name': ":link and :visited pseudo-class selectors, matching a and area elements with href attributes",        'selector': "#pseudo-link :link, #pseudo-link :visited", 'expect': ["pseudo-link-a1", "pseudo-link-a2", "pseudo-link-area1"],                                'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': ":link and :visited pseudo-class selectors, matching link elements with href attributes",              'selector': "#head :link, #head :visited",               'expect': ["pseudo-link-link1", "pseudo-link-link2"], 'exclude': ["element", "fragment", "detached"], 'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': ":link and :visited pseudo-class selectors, not matching link elements with href attributes",          'selector': "#head :link, #head :visited",               'expect': [] /*no matches*/,                          'exclude': ["document"],                        'level': 1, 'testType': TEST_QSA_BASELINE},
+  {'name': ":link and :visited pseudo-class selectors, chained, mutually exclusive pseudo-classes match nothing", 'selector': ":link:visited",                             'expect': [] /*no matches*/,                          'exclude': ["document"],                        'level': 1, 'testType': TEST_QSA_BASELINE},
+
+  // - :target               (Level 3)
+  {'name': ":target pseudo-class selector, matching the element referenced by the URL fragment identifier", 'selector': ":target", 'expect': [] /*no matches*/, 'exclude': ["document", "element"],  'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+  {'name': ":target pseudo-class selector, matching the element referenced by the URL fragment identifier", 'selector': ":target", 'expect': ["target"],        'exclude': ["fragment", "detached"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+
+  // - :lang()
+  {'name': ":lang pseudo-class selector, matching inherited language",                     'selector': "#pseudo-lang-div1:lang(en)",    'expect': ["pseudo-lang-div1"], 'exclude': ["detached", "fragment"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': ":lang pseudo-class selector, not matching element with no inherited language", 'selector': "#pseudo-lang-div1:lang(en)",    'expect': [] /*no matches*/,    'exclude': ["document", "element"],  'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': ":lang pseudo-class selector, matching specified language with exact value",    'selector': "#pseudo-lang-div2:lang(fr)",    'expect': ["pseudo-lang-div2"],                                    'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': ":lang pseudo-class selector, matching specified language with partial value",  'selector': "#pseudo-lang-div3:lang(en)",    'expect': ["pseudo-lang-div3"],                                    'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': ":lang pseudo-class selector, not matching incorrect language",                 'selector': "#pseudo-lang-div4:lang(es-AR)", 'expect': [] /*no matches*/,                                       'level': 2, 'testType': TEST_QSA_BASELINE},
+
+  // - :enabled              (Level 3)
+  {'name': ":enabled pseudo-class selector, matching all enabled form controls",  'selector': "#pseudo-ui :enabled",  'expect': ["pseudo-ui-input1", "pseudo-ui-input2", "pseudo-ui-input3", "pseudo-ui-input4", "pseudo-ui-input5", "pseudo-ui-input6",
+                                                                                                                           "pseudo-ui-input7", "pseudo-ui-input8", "pseudo-ui-input9", "pseudo-ui-textarea1", "pseudo-ui-button1"],    'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+
+  // - :disabled             (Level 3)
+  {'name': ":enabled pseudo-class selector, matching all disabled form controls", 'selector': "#pseudo-ui :disabled", 'expect': ["pseudo-ui-input10", "pseudo-ui-input11", "pseudo-ui-input12", "pseudo-ui-input13", "pseudo-ui-input14", "pseudo-ui-input15",
+                                                                                                                           "pseudo-ui-input16", "pseudo-ui-input17", "pseudo-ui-input18", "pseudo-ui-textarea2", "pseudo-ui-button2"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+
+  // - :checked              (Level 3)
+  {'name': ":checked pseudo-class selector, matching checked radio buttons and checkboxes", 'selector': "#pseudo-ui :checked", 'expect': ["pseudo-ui-input4", "pseudo-ui-input6", "pseudo-ui-input13", "pseudo-ui-input15"],  'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+
+  // - :not(s)               (Level 3)
+  {'name': ":not pseudo-class selector, matching ", 'selector': "#not>:not(div)",   'expect': ["not-p1", "not-p2", "not-p3"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":not pseudo-class selector, matching ", 'selector': "#not * :not(:first-child)",   'expect': ["not-em1", "not-em2", "not-em3"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': ":not pseudo-class selector, matching nothing", 'selector': ":not(*)",   'expect': [] /* no matches */, 'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+  {'name': ":not pseudo-class selector, matching nothing", 'selector': ":not(*|*)", 'expect': [] /* no matches */, 'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+
+  // Pseudo-elements
+  // - ::first-line
+  {'name': ":first-line pseudo-element (one-colon syntax) selector, not matching any elements",    'selector': "#pseudo-element:first-line",    'expect': [] /*no matches*/, 'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "::first-line pseudo-element (two-colon syntax) selector, not matching any elements",   'selector': "#pseudo-element::first-line",   'expect': [] /*no matches*/, 'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+
+  // - ::first-letter
+  {'name': ":first-letter pseudo-element (one-colon syntax) selector, not matching any elements",  'selector': "#pseudo-element:first-letter",  'expect': [] /*no matches*/, 'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "::first-letter pseudo-element (two-colon syntax) selector, not matching any elements", 'selector': "#pseudo-element::first-letter", 'expect': [] /*no matches*/, 'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+
+  // - ::before
+  {'name': ":before pseudo-element (one-colon syntax) selector, not matching any elements",        'selector': "#pseudo-element:before",        'expect': [] /*no matches*/, 'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "::before pseudo-element (two-colon syntax) selector, not matching any elements",       'selector': "#pseudo-element::before",       'expect': [] /*no matches*/, 'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+
+  // - ::after
+  {'name': ":after pseudo-element (one-colon syntax) selector, not matching any elements",         'selector': "#pseudo-element:after",         'expect': [] /*no matches*/, 'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "::after pseudo-element (two-colon syntax) selector, not matching any elements",        'selector': "#pseudo-element::after",        'expect': [] /*no matches*/, 'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+
+  // Class Selectors
+  {'name': "Class selector, matching element with specified class",                                           'selector': ".class-p",                'expect': ["class-p1","class-p2", "class-p3"],                                              'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Class selector, chained, matching only elements with all specified classes",                      'selector': "#class .apple.orange.banana",    'expect': ["class-div1", "class-div2", "class-p4", "class-div3", "class-p6", "class-div4"], 'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Class Selector, chained, with type selector",                                                     'selector': "div.apple.banana.orange", 'expect': ["class-div1", "class-div2", "class-div3", "class-div4"],                         'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  // Caution: If copying and pasting the folowing non-ASCII classes, ensure unicode normalisation is not performed in the process.
+  {'name': "Class selector, matching element with class value using non-ASCII characters",                    'selector': ".台北Táiběi",             'expect': ["class-span1"],               'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Class selector, matching multiple elements with class value using non-ASCII characters",          'selector': ".台北",                     'expect': ["class-span1","class-span2"], 'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Class selector, chained, matching element with multiple class values using non-ASCII characters", 'selector': ".台北Táiběi.台北",          'expect': ["class-span1"],               'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Class selector, matching element with class with escaped character",                              'selector': ".foo\\:bar",              'expect': ["class-span3"],               'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Class selector, matching element with class with escaped character",                              'selector': ".test\\.foo\\[5\\]bar",   'expect': ["class-span4"],               'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+
+  // ID Selectors
+  {'name': "ID selector, matching element with specified id",           'selector': "#id #id-div1",              'expect': ["id-div1"],            'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "ID selector, chained, matching element with specified id",  'selector': "#id-div1, #id-div1",        'expect': ["id-div1"],            'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "ID selector, chained, matching element with specified id",  'selector': "#id-div1, #id-div2",        'expect': ["id-div1", "id-div2"], 'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "ID Selector, chained, with type selector",                  'selector': "div#id-div1, div#id-div2",  'expect': ["id-div1", "id-div2"], 'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "ID selector, not matching non-existent descendant",         'selector': "#id #none",                 'expect': [] /*no matches*/,      'level': 1, 'testType': TEST_QSA_BASELINE},
+  {'name': "ID selector, not matching non-existent ancestor",           'selector': "#none #id-div1",            'expect': [] /*no matches*/,      'level': 1, 'testType': TEST_QSA_BASELINE},
+  {'name': "ID selector, matching multiple elements with duplicate id", 'selector': "#id-li-duplicate",          'expect': ["id-li-duplicate", "id-li-duplicate", "id-li-duplicate", "id-li-duplicate"], 'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+
+  // Caution: If copying and pasting the folowing non-ASCII IDs, ensure unicode normalisation is not performed in the process.
+  {'name': "ID selector, matching id value using non-ASCII characters",    'selector': "#台北Táiběi",           'expect': ["台北Táiběi"],       'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "ID selector, matching id value using non-ASCII characters",    'selector': "#台北",                   'expect': ["台北"],               'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "ID selector, matching id values using non-ASCII characters",   'selector': "#台北Táiběi, #台北",      'expect': ["台北Táiběi", "台北"], 'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+
+  // XXX runMatchesTest() in level2-lib.js can't handle this because obtaining the expected nodes requires escaping characters when generating the selector from 'expect' values
+  {'name': "ID selector, matching element with id with escaped character", 'selector': "#\\#foo\\:bar",         'expect': ["#foo:bar"],         'level': 1, 'testType': TEST_QSA_BASELINE},
+  {'name': "ID selector, matching element with id with escaped character", 'selector': "#test\\.foo\\[5\\]bar", 'expect': ["test.foo[5]bar"],   'level': 1, 'testType': TEST_QSA_BASELINE},
+
+  // Namespaces
+  // XXX runMatchesTest() in level2-lib.js can't handle these because non-HTML elements don't have a recognised id
+  {'name': "Namespace selector, matching element with any namespace",        'selector': "#any-namespace *|div", 'expect': ["any-namespace-div1", "any-namespace-div2", "any-namespace-div3", "any-namespace-div4"], 'level': 3, 'testType': TEST_QSA_BASELINE},
+  {'name': "Namespace selector, matching div elements in no namespace only", 'selector': "#no-namespace |div",   'expect': ["no-namespace-div3"], 'level': 3, 'testType': TEST_QSA_BASELINE},
+  {'name': "Namespace selector, matching any elements in no namespace only", 'selector': "#no-namespace |*",     'expect': ["no-namespace-div3"], 'level': 3, 'testType': TEST_QSA_BASELINE},
+
+  // Combinators
+  // - Descendant combinator ' '
+  {'name': "Descendant combinator, matching element that is a descendant of an element with id",                 'selector': "#descendant div",                   'expect': ["descendant-div1", "descendant-div2", "descendant-div3", "descendant-div4"], 'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Descendant combinator, matching element with id that is a descendant of an element",                 'selector': "body #descendant-div1",             'expect': ["descendant-div1"], 'exclude': ["detached", "fragment"], 'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Descendant combinator, matching element with id that is a descendant of an element",                 'selector': "div #descendant-div1",              'expect': ["descendant-div1"],                                    'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Descendant combinator, matching element with id that is a descendant of an element with id",         'selector': "#descendant #descendant-div2",      'expect': ["descendant-div2"],                                    'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Descendant combinator, matching element with class that is a descendant of an element with id",      'selector': "#descendant .descendant-div2",      'expect': ["descendant-div2"],                                    'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Descendant combinator, matching element with class that is a descendant of an element with class",   'selector': ".descendant-div1 .descendant-div3", 'expect': ["descendant-div3"],                                    'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Descendant combinator, not matching element with id that is not a descendant of an element with id", 'selector': "#descendant-div1 #descendant-div4", 'expect': [] /*no matches*/,                                      'level': 1, 'testType': TEST_QSA_BASELINE},
+  {'name': "Descendant combinator, whitespace characters",                                                       'selector': "#descendant\t\r\n#descendant-div2", 'expect': ["descendant-div2"],                                    'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+
+  // - Child combinator '>'
+  {'name': "Child combinator, matching element that is a child of an element with id",                       'selector': "#child>div",                          'expect': ["child-div1", "child-div4"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Child combinator, matching element with id that is a child of an element",                       'selector': "div>#child-div1",                     'expect': ["child-div1"],               'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Child combinator, matching element with id that is a child of an element with id",               'selector': "#child>#child-div1",                  'expect': ["child-div1"],               'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Child combinator, matching element with id that is a child of an element with class",            'selector': "#child-div1>.child-div2",             'expect': ["child-div2"],               'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Child combinator, matching element with class that is a child of an element with class",         'selector': ".child-div1>.child-div2",             'expect': ["child-div2"],               'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Child combinator, not matching element with id that is not a child of an element with id",       'selector': "#child>#child-div3",                  'expect': [] /*no matches*/,            'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "Child combinator, not matching element with id that is not a child of an element with class",    'selector': "#child-div1>.child-div3",             'expect': [] /*no matches*/,            'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "Child combinator, not matching element with class that is not a child of an element with class", 'selector': ".child-div1>.child-div3",             'expect': [] /*no matches*/,            'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "Child combinator, surrounded by whitespace",                                                     'selector': "#child-div1\t\r\n>\t\r\n#child-div2", 'expect': ["child-div2"],               'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Child combinator, whitespace after",                                                             'selector': "#child-div1>\t\r\n#child-div2",       'expect': ["child-div2"],               'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Child combinator, whitespace before",                                                            'selector': "#child-div1\t\r\n>#child-div2",       'expect': ["child-div2"],               'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Child combinator, no whitespace",                                                                'selector': "#child-div1>#child-div2",             'expect': ["child-div2"],               'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+
+  // - Adjacent sibling combinator '+'
+  {'name': "Adjacent sibling combinator, matching element that is an adjacent sibling of an element with id",                 'selector': "#adjacent-div2+div",                                         'expect': ["adjacent-div4"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Adjacent sibling combinator, matching element with id that is an adjacent sibling of an element",                 'selector': "div+#adjacent-div4",                                         'expect': ["adjacent-div4"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Adjacent sibling combinator, matching element with id that is an adjacent sibling of an element with id",         'selector': "#adjacent-div2+#adjacent-div4",                              'expect': ["adjacent-div4"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Adjacent sibling combinator, matching element with class that is an adjacent sibling of an element with id",      'selector': "#adjacent-div2+.adjacent-div4",                              'expect': ["adjacent-div4"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Adjacent sibling combinator, matching element with class that is an adjacent sibling of an element with class",   'selector': ".adjacent-div2+.adjacent-div4",                              'expect': ["adjacent-div4"], 'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Adjacent sibling combinator, matching p element that is an adjacent sibling of a div element",                    'selector': "#adjacent div+p",                                            'expect': ["adjacent-p2"],   'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Adjacent sibling combinator, not matching element with id that is not an adjacent sibling of an element with id", 'selector': "#adjacent-div2+#adjacent-p2, #adjacent-div2+#adjacent-div1", 'expect': [] /*no matches*/, 'level': 2, 'testType': TEST_QSA_BASELINE},
+  {'name': "Adjacent sibling combinator, surrounded by whitespace",                                                           'selector': "#adjacent-p2\t\r\n+\t\r\n#adjacent-p3",                      'expect': ["adjacent-p3"],   'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Adjacent sibling combinator, whitespace after",                                                                   'selector': "#adjacent-p2+\t\r\n#adjacent-p3",                            'expect': ["adjacent-p3"],   'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Adjacent sibling combinator, whitespace before",                                                                  'selector': "#adjacent-p2\t\r\n+#adjacent-p3",                            'expect': ["adjacent-p3"],   'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Adjacent sibling combinator, no whitespace",                                                                      'selector': "#adjacent-p2+#adjacent-p3",                                  'expect': ["adjacent-p3"],   'level': 2, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+
+  // - General sibling combinator ~ (Level 3)
+  {'name': "General sibling combinator, matching element that is a sibling of an element with id",                    'selector': "#sibling-div2~div",                                        'expect': ["sibling-div4", "sibling-div6"], 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "General sibling combinator, matching element with id that is a sibling of an element",                    'selector': "div~#sibling-div4",                                        'expect': ["sibling-div4"],                 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "General sibling combinator, matching element with id that is a sibling of an element with id",            'selector': "#sibling-div2~#sibling-div4",                              'expect': ["sibling-div4"],                 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "General sibling combinator, matching element with class that is a sibling of an element with id",         'selector': "#sibling-div2~.sibling-div",                               'expect': ["sibling-div4", "sibling-div6"],                 'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "General sibling combinator, matching p element that is a sibling of a div element",                       'selector': "#sibling div~p",                                           'expect': ["sibling-p2", "sibling-p3"],                   'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "General sibling combinator, not matching element with id that is not a sibling after a p element",        'selector': "#sibling>p~div",                                           'expect': [] /*no matches*/,                'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+  {'name': "General sibling combinator, not matching element with id that is not a sibling after an element with id", 'selector': "#sibling-div2~#sibling-div3, #sibling-div2~#sibling-div1", 'expect': [] /*no matches*/,                'level': 3, 'testType': TEST_QSA_ADDITIONAL},
+  {'name': "General sibling combinator, surrounded by whitespace",                                                    'selector': "#sibling-p2\t\r\n~\t\r\n#sibling-p3",                      'expect': ["sibling-p3"],                   'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "General sibling combinator, whitespace after",                                                            'selector': "#sibling-p2~\t\r\n#sibling-p3",                            'expect': ["sibling-p3"],                   'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "General sibling combinator, whitespace before",                                                           'selector': "#sibling-p2\t\r\n~#sibling-p3",                            'expect': ["sibling-p3"],                   'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+  {'name': "General sibling combinator, no whitespace",                                                               'selector': "#sibling-p2~#sibling-p3",                                  'expect': ["sibling-p3"],                   'level': 3, 'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE},
+
+  // Group of selectors (comma)
+  {'name': "Syntax, group of selectors separator, surrounded by whitespace", 'selector': "#group em\t\r \n,\t\r \n#group strong", 'expect': ["group-em1", "group-strong1"], 'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Syntax, group of selectors separator, whitespace after",         'selector': "#group em,\t\r\n#group strong",         'expect': ["group-em1", "group-strong1"], 'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Syntax, group of selectors separator, whitespace before",        'selector': "#group em\t\r\n,#group strong",         'expect': ["group-em1", "group-strong1"], 'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+  {'name': "Syntax, group of selectors separator, no whitespace",            'selector': "#group em,#group strong",               'expect': ["group-em1", "group-strong1"], 'level': 1, 'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE},
+];
diff --git a/pkg/third_party/html5lib/test/support.dart b/pkg/third_party/html5lib/test/support.dart
index 4d2cb5a..0118ecf 100644
--- a/pkg/third_party/html5lib/test/support.dart
+++ b/pkg/third_party/html5lib/test/support.dart
@@ -90,7 +90,7 @@
 }
 
 /// Serialize the [document] into the html5 test data format.
-testSerializer(Document document) {
+testSerializer(document) {
   return (new TestSerializer()..visit(document)).toString();
 }
 
@@ -134,12 +134,14 @@
     indent -= 2;
   }
 
-  visitDocument(Document node) {
+  visitDocument(node) {
     indent += 1;
     for (var child in node.nodes) visit(child);
     indent -= 1;
   }
 
+  visitDocumentFragment(DocumentFragment node) => visitDocument(node);
+
   visitElement(Element node) {
     _newline();
     _str.write(node);
diff --git a/pkg/typed_mock/LICENSE b/pkg/typed_mock/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/pkg/typed_mock/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/typed_mock.dart b/pkg/typed_mock/lib/typed_mock.dart
similarity index 80%
rename from pkg/analysis_server/test/typed_mock.dart
rename to pkg/typed_mock/lib/typed_mock.dart
index d2b91dd..3cde9a6 100644
--- a/pkg/analysis_server/test/typed_mock.dart
+++ b/pkg/typed_mock/lib/typed_mock.dart
@@ -3,10 +3,28 @@
 
 _InvocationMatcher _lastMatcher;
 
-
 /// Enables stubbing methods.
-/// Use it when you want the mock to return particular value when particular
-/// method is called.
+///
+/// Use it when you want the mock to return a particular value when a particular
+/// method, getter or setter is called.
+///
+///     when(obj.testProperty).thenReturn(10);
+///     expect(obj.testProperty, 10); // pass
+///
+/// You can specify multiple matchers, which are checked one after another.
+///
+///     when(obj.testMethod(anyInt)).thenReturn('was int');
+///     when(obj.testMethod(anyString)).thenReturn('was String');
+///     expect(obj.testMethod(42), 'was int'); // pass
+///     expect(obj.testMethod('foo'), 'was String'); // pass
+///
+/// You can even provide a function to calculate results.
+/// Function can be also used to capture invocation arguments (if you test some
+/// consumer).
+///
+///     when(obj.testMethod(anyInt)).thenInvoke((int p) => 10 + p);
+///     expect(obj.testMethod(1), 11); // pass
+///     expect(obj.testMethod(5), 15); // pass
 Behavior when(_ignored) {
   try {
     var mock = _lastMatcher._mock;
@@ -111,7 +129,7 @@
     for (int i = 0; i < _matchers.length; i++) {
       var matcher = _matchers[i];
       var argument = arguments[i];
-      if (!matcher.match(argument)) {
+      if (!matcher.matches(argument)) {
         return false;
       }
     }
@@ -138,6 +156,7 @@
   bool _throwExceptionEnabled = false;
   var _throwException;
 
+  /// Invokes the given [function] with actual arguments and returns its result.
   Behavior thenInvoke(Function function) {
     _reset();
     _thenFunctionEnabled = true;
@@ -145,6 +164,7 @@
     return this;
   }
 
+  /// Returns the specific value.
   Behavior thenReturn(value) {
     _reset();
     _returnAlwaysEnabled = true;
@@ -152,6 +172,8 @@
     return this;
   }
 
+  /// Returns values from the [list] starting from first to the last.
+  /// If the end of list is reached a [StateError] is thrown.
   Behavior thenReturnList(List list) {
     _reset();
     _returnListEnabled = true;
@@ -160,6 +182,7 @@
     return this;
   }
 
+  /// Throws the specified [exception] object.
   Behavior thenThrow(exception) {
     _reset();
     _throwExceptionEnabled = true;
@@ -283,6 +306,17 @@
 }
 
 
+/// A class to extend mocks from.
+/// It supports specifying behavior using [when] and validation of interactions
+/// using [verify].
+///
+///     abstract class Name {
+///       String get firstName;
+///       String get lastName;
+///     }
+///     class NameMock extends TypedMock implements Name {
+///       noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+///     }
 class TypedMock {
   final Map<Symbol, List<_InvocationMatcher>> _matchersMap = {};
 
@@ -327,8 +361,11 @@
 }
 
 
+/// [ArgumentMatcher] checks whether the given argument satisfies some
+/// condition.
 abstract class ArgumentMatcher {
-  bool match(val);
+  /// Checks whether this matcher accepts the given argument.
+  bool matches(val);
 }
 
 
@@ -338,11 +375,12 @@
   _ArgumentMatcher_equals(this.expected);
 
   @override
-  bool match(val) {
+  bool matches(val) {
     return val == expected;
   }
 }
 
+/// Matches an argument that is equal to the given [expected] value.
 equals(expected) {
   return new _ArgumentMatcher_equals(expected);
 }
@@ -350,39 +388,43 @@
 
 class _ArgumentMatcher_anyBool extends ArgumentMatcher {
   @override
-  bool match(val) {
+  bool matches(val) {
     return val is bool;
   }
 }
 
+/// Matches any [bool] value.
 final anyBool = new _ArgumentMatcher_anyBool();
 
 
 class _ArgumentMatcher_anyInt extends ArgumentMatcher {
   @override
-  bool match(val) {
+  bool matches(val) {
     return val is int;
   }
 }
 
+/// Matches any [int] value.
 final anyInt = new _ArgumentMatcher_anyInt();
 
 
 class _ArgumentMatcher_anyObject extends ArgumentMatcher {
   @override
-  bool match(val) {
+  bool matches(val) {
     return true;
   }
 }
 
+/// Matches any [Object] (or subclass) value.
 final anyObject = new _ArgumentMatcher_anyObject();
 
 
 class _ArgumentMatcher_anyString extends ArgumentMatcher {
   @override
-  bool match(val) {
+  bool matches(val) {
     return val is String;
   }
 }
 
+/// Matches any [String] value.
 final anyString = new _ArgumentMatcher_anyString();
diff --git a/pkg/typed_mock/pubspec.yaml b/pkg/typed_mock/pubspec.yaml
new file mode 100644
index 0000000..c2e2cdc
--- /dev/null
+++ b/pkg/typed_mock/pubspec.yaml
@@ -0,0 +1,9 @@
+name: typed_mock
+version: 0.0.1
+author: Dart Team <misc@dartlang.org>
+description: A library for mocking classes using Mockito-like syntax
+homepage: http://www.dartlang.org
+environment:
+  sdk: '>=1.0.0 <2.0.0'
+dev_dependencies:
+  unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/analysis_server/test/typed_mock_test.dart b/pkg/typed_mock/test/typed_mock_test.dart
similarity index 90%
rename from pkg/analysis_server/test/typed_mock_test.dart
rename to pkg/typed_mock/test/typed_mock_test.dart
index 3b120f5..76add8e 100644
--- a/pkg/analysis_server/test/typed_mock_test.dart
+++ b/pkg/typed_mock/test/typed_mock_test.dart
@@ -2,8 +2,8 @@
 
 import 'package:unittest/unittest.dart';
 
-import 'typed_mock.dart' hide equals;
-import 'typed_mock.dart' as typed_mocks show equals;
+import 'package:typed_mock/typed_mock.dart' hide equals;
+import 'package:typed_mock/typed_mock.dart' as typed_mocks show equals;
 
 
 abstract class TestInterface {
@@ -37,39 +37,39 @@
 
   group('Matchers', () {
     test('equals', () {
-      expect(typed_mocks.equals(10).match(10), true);
-      expect(typed_mocks.equals(10).match(20), false);
-      expect(typed_mocks.equals('abc').match('abc'), true);
-      expect(typed_mocks.equals('abc').match('xyz'), false);
+      expect(typed_mocks.equals(10).matches(10), true);
+      expect(typed_mocks.equals(10).matches(20), false);
+      expect(typed_mocks.equals('abc').matches('abc'), true);
+      expect(typed_mocks.equals('abc').matches('xyz'), false);
     });
 
     test('anyBool', () {
-      expect(anyBool.match(true), true);
-      expect(anyBool.match(false), true);
-      expect(anyBool.match(0), false);
-      expect(anyBool.match('0'), false);
+      expect(anyBool.matches(true), true);
+      expect(anyBool.matches(false), true);
+      expect(anyBool.matches(0), false);
+      expect(anyBool.matches('0'), false);
     });
 
     test('anyInt', () {
-      expect(anyInt.match(true), false);
-      expect(anyInt.match(-99), true);
-      expect(anyInt.match(0), true);
-      expect(anyInt.match(42), true);
-      expect(anyInt.match('0'), false);
+      expect(anyInt.matches(true), false);
+      expect(anyInt.matches(-99), true);
+      expect(anyInt.matches(0), true);
+      expect(anyInt.matches(42), true);
+      expect(anyInt.matches('0'), false);
     });
 
     test('anyObject', () {
-      expect(anyObject.match(true), true);
-      expect(anyObject.match(0), true);
-      expect(anyObject.match('0'), true);
+      expect(anyObject.matches(true), true);
+      expect(anyObject.matches(0), true);
+      expect(anyObject.matches('0'), true);
     });
 
     test('anyString', () {
-      expect(anyString.match(true), false);
-      expect(anyString.match(0), false);
-      expect(anyString.match(''), true);
-      expect(anyString.match('0'), true);
-      expect(anyString.match('abc'), true);
+      expect(anyString.matches(true), false);
+      expect(anyString.matches(0), false);
+      expect(anyString.matches(''), true);
+      expect(anyString.matches('0'), true);
+      expect(anyString.matches('abc'), true);
     });
   });
 
diff --git a/pkg/unittest/CHANGELOG.md b/pkg/unittest/CHANGELOG.md
index aff56ca..bc09b95 100644
--- a/pkg/unittest/CHANGELOG.md
+++ b/pkg/unittest/CHANGELOG.md
@@ -1,3 +1,16 @@
+##0.11.0
+
+* Deprecated methods have been removed:
+    * `expectAsync0`, `expectAsync1`, and `expectAsync2` - use `expectAsync`
+      instead
+    * `expectAsyncUntil0`, `expectAsyncUntil1`, and `expectAsyncUntil2` - use
+      `expectAsyncUntil` instead
+    * `guardAsync` - no longer needed
+    * `protectAsync0`, `protectAsync1`, and `protectAsync2` - no longer needed
+* `matcher.dart` and `mirror_matchers.dart` have been removed. They are now in
+  the `matcher` package.
+* `mock.dart` has been removed. It is now in the `mock` package.
+
 ##0.10.1+2
 
 * Fixed deprecation message for `mock`.
diff --git a/pkg/unittest/lib/matcher.dart b/pkg/unittest/lib/matcher.dart
deleted file mode 100644
index 3fd692e..0000000
--- a/pkg/unittest/lib/matcher.dart
+++ /dev/null
@@ -1,12 +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.
-
-/// `unittest.matcher` has been moved to the `matcher` package.
-///
-/// Add `matcher` to your `pubspec.yaml` file and import it via
-/// `import 'package:matcher/matcher.dart';`
-@deprecated
-library unittest.matcher;
-
-export 'package:matcher/matcher.dart';
diff --git a/pkg/unittest/lib/mirror_matchers.dart b/pkg/unittest/lib/mirror_matchers.dart
deleted file mode 100644
index d144554..0000000
--- a/pkg/unittest/lib/mirror_matchers.dart
+++ /dev/null
@@ -1,12 +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.
-
-/// `unittest.mirror_matchers` has been moved to the `matcher` package.
-///
-/// Add `matcher` to your `pubspec.yaml` file and import it via
-/// `import 'package:matcher/mirror_matchers.dart';`
-@deprecated
-library unittest.mirror_matchers;
-
-export 'package:matcher/mirror_matchers.dart';
diff --git a/pkg/unittest/lib/mock.dart b/pkg/unittest/lib/mock.dart
deleted file mode 100644
index 18b6537..0000000
--- a/pkg/unittest/lib/mock.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2012, 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.
-
-/// `unittest.mock` has been moved to the `mock` package.
-///
-/// Add `mock` to your `pubspec.yaml` file and import it via
-/// `import 'package:mock/mock.dart';`
-@deprecated
-library unittest.mock;
-
-export 'package:mock/mock.dart';
diff --git a/pkg/unittest/lib/src/configuration.dart b/pkg/unittest/lib/src/configuration.dart
index 6893adc..ca90132 100644
--- a/pkg/unittest/lib/src/configuration.dart
+++ b/pkg/unittest/lib/src/configuration.dart
@@ -2,7 +2,9 @@
 // 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 unittest;
+library unittest.configuration;
+
+import 'package:unittest/unittest.dart' show TestCase, SimpleConfiguration;
 
 /// Describes the interface used by the unit test system for communicating the
 /// results of a test run.
diff --git a/pkg/unittest/lib/src/simple_configuration.dart b/pkg/unittest/lib/src/simple_configuration.dart
index 1d9d46e..aa24977 100644
--- a/pkg/unittest/lib/src/simple_configuration.dart
+++ b/pkg/unittest/lib/src/simple_configuration.dart
@@ -121,7 +121,7 @@
       try {
         throw '';
       } catch (_, stack) {
-        var trace = _getTrace(stack);
+        var trace = getTrace(stack, formatStacks, filterStacks);
         if (trace == null) trace = stack;
         _testLogBuffer.add(new Pair<String, StackTrace>(reason, trace));
       }
diff --git a/pkg/unittest/lib/src/spread_args_helper.dart b/pkg/unittest/lib/src/spread_args_helper.dart
index cf024f3..9367201 100644
--- a/pkg/unittest/lib/src/spread_args_helper.dart
+++ b/pkg/unittest/lib/src/spread_args_helper.dart
@@ -8,8 +8,6 @@
 }
 
 /// Simulates spread arguments using named arguments.
-// TODO(sigmund): remove this class and simply use a closure with named
-// arguments (if still applicable).
 class _SpreadArgsHelper {
   final Function callback;
   final int minExpectedCalls;
diff --git a/pkg/unittest/lib/src/test_case.dart b/pkg/unittest/lib/src/test_case.dart
index 0948e79..03eafd2 100644
--- a/pkg/unittest/lib/src/test_case.dart
+++ b/pkg/unittest/lib/src/test_case.dart
@@ -120,7 +120,7 @@
   // is the first time the result is being set.
   void _setResult(String testResult, String messageText, StackTrace stack) {
     _message = messageText;
-    _stackTrace = _getTrace(stack);
+    _stackTrace = getTrace(stack, formatStacks, filterStacks);
     if (_stackTrace == null) _stackTrace = stack;
     if (result == null) {
       _result = testResult;
diff --git a/pkg/unittest/lib/src/utils.dart b/pkg/unittest/lib/src/utils.dart
index 9aaae5b..877cfb2 100644
--- a/pkg/unittest/lib/src/utils.dart
+++ b/pkg/unittest/lib/src/utils.dart
@@ -4,43 +4,7 @@
 
 library unittest.utils;
 
-/// Returns the name of the type of [x], or "Unknown" if the type name can't be
-/// determined.
-String typeName(x) {
-  // dart2js blows up on some objects (e.g. window.navigator).
-  // So we play safe here.
-  try {
-    if (x == null) return "null";
-    var type = x.runtimeType.toString();
-    // TODO(nweiz): if the object's type is private, find a public superclass to
-    // display once there's a portable API to do that.
-    return type.startsWith("_") ? "?" : type;
-  } catch (e) {
-    return "?";
-  }
-}
-
-/// Returns [source] with any control characters replaced by their escape
-/// sequences.
-///
-/// This doesn't add quotes to the string, but it does escape single quote
-/// characters so that single quotes can be applied externally.
-String escapeString(String source) =>
-    source.split("").map(_escapeChar).join("");
-
-/// Return the escaped form of a character [ch].
-String _escapeChar(String ch) {
-  if (ch == "'")
-    return "\\'";
-  else if (ch == '\n')
-    return '\\n';
-  else if (ch == '\r')
-    return '\\r';
-  else if (ch == '\t')
-    return '\\t';
-  else
-    return ch;
-}
+import 'package:stack_trace/stack_trace.dart';
 
 /// Indent each line in [str] by two spaces.
 String indent(String str) =>
@@ -63,3 +27,25 @@
   int get hashCode => first.hashCode ^ last.hashCode;
 }
 
+/// Returns a Trace object from a StackTrace object or a String, or the
+/// unchanged input if formatStacks is false;
+Trace getTrace(stack, bool formatStacks, bool filterStacks) {
+  Trace trace;
+  if (stack == null || !formatStacks) return null;
+  if (stack is String) {
+    trace = new Trace.parse(stack);
+  } else if (stack is StackTrace) {
+    trace = new Trace.from(stack);
+  } else {
+    throw new Exception('Invalid stack type ${stack.runtimeType} for $stack.');
+  }
+
+  if (!filterStacks) return trace;
+
+  // Format the stack trace by removing everything above TestCase._runTest,
+  // which is usually going to be irrelevant. Also fold together unittest and
+  // core library calls so only the function the user called is visible.
+  return new Trace(trace.frames.takeWhile((frame) {
+    return frame.package != 'unittest' || frame.member != 'TestCase._runTest';
+  })).terse.foldFrames((frame) => frame.package == 'unittest' || frame.isCore);
+}
diff --git a/pkg/unittest/lib/unittest.dart b/pkg/unittest/lib/unittest.dart
index b736c6e..05eca70 100644
--- a/pkg/unittest/lib/unittest.dart
+++ b/pkg/unittest/lib/unittest.dart
@@ -137,7 +137,6 @@
 import 'dart:async';
 import 'dart:collection';
 import 'dart:isolate';
-import 'package:stack_trace/stack_trace.dart';
 
 import 'package:matcher/matcher.dart' show DefaultFailureHandler,
     configureExpectFailureHandler, TestFailure, wrapAsync;
@@ -145,9 +144,11 @@
 
 import 'src/utils.dart';
 
-part 'src/configuration.dart';
-part 'src/group_context.dart';
+import 'src/configuration.dart';
+export 'src/configuration.dart';
+
 part 'src/simple_configuration.dart';
+part 'src/group_context.dart';
 part 'src/spread_args_helper.dart';
 part 'src/test_case.dart';
 
@@ -300,30 +301,6 @@
     {int count: 1, int max: 0, String id}) =>
   new _SpreadArgsHelper(callback, count, max, id).func;
 
-/// *Deprecated*
-///
-/// Use [expectAsync] instead.
-@deprecated
-Function expectAsync0(Function callback,
-                     {int count: 1, int max: 0, String id}) =>
-    expectAsync(callback, count: count, max: max, id: id);
-
-/// *Deprecated*
-///
-/// Use [expectAsync] instead.
-@deprecated
-Function expectAsync1(Function callback,
-                     {int count: 1, int max: 0, String id}) =>
-    expectAsync(callback, count: count, max: max, id: id);
-
-/// *Deprecated*
-///
-/// Use [expectAsync] instead.
-@deprecated
-Function expectAsync2(Function callback,
-                     {int count: 1, int max: 0, String id}) =>
-    expectAsync(callback, count: count, max: max, id: id);
-
 /// Indicate that [callback] is expected to be called until [isDone] returns
 /// true. The unittest framework check [isDone] after each callback and only
 /// when it returns true will it continue with the following test. Using
@@ -335,57 +312,6 @@
 Function expectAsyncUntil(Function callback, bool isDone(), {String id}) =>
     new _SpreadArgsHelper(callback, 0, -1, id, isDone: isDone).func;
 
-/// *Deprecated*
-///
-/// Use [expectAsyncUntil] instead.
-@deprecated
-Function expectAsyncUntil0(Function callback, Function isDone, {String id}) =>
-    expectAsyncUntil(callback, isDone, id: id);
-
-/// *Deprecated*
-///
-/// Use [expectAsyncUntil] instead.
-@deprecated
-Function expectAsyncUntil1(Function callback, Function isDone, {String id}) =>
-    expectAsyncUntil(callback, isDone, id: id);
-
-/// *Deprecated*
-///
-/// Use [expectAsyncUntil] instead.
-@deprecated
-Function expectAsyncUntil2(Function callback, Function isDone, {String id}) =>
-    expectAsyncUntil(callback, isDone, id: id);
-
-/// *Deprecated*
-///
-/// All tests are now run an isolated [Zone].
-///
-/// You can safely remove calls to this method.
-@deprecated
-Function protectAsync0(Function callback, {String id}) {
-  return callback;
-}
-
-/// *Deprecated*
-///
-/// All tests are now run an isolated [Zone].
-///
-/// You can safely remove calls to this method.
-@deprecated
-Function protectAsync1(Function callback, {String id}) {
-  return callback;
-}
-
-/// *Deprecated*
-///
-/// All tests are now run an isolated [Zone].
-///
-/// You can safely remove calls to this method.
-@deprecated
-Function protectAsync2(Function callback, {String id}) {
-  return callback;
-}
-
 /// Creates a new named group of tests. Calls to group() or test() within the
 /// body of the function passed to this will inherit this group's description.
 void group(String description, void body()) {
@@ -488,16 +414,6 @@
   _runTest();
 }
 
-/// *Deprecated*
-///
-/// All tests are now run an isolated [Zone].
-///
-/// You can safely remove calls to this method.
-@deprecated
-guardAsync(Function tryBody) {
-  return tryBody();
-}
-
 /// Registers that an exception was caught for the current test.
 void registerException(e, [trace]) {
   _registerException(currentTestCase, e, trace);
@@ -646,26 +562,3 @@
     throw new StateError('Not allowed when tests are running.');
   }
 }
-
-/// Returns a Trace object from a StackTrace object or a String, or the
-/// unchanged input if formatStacks is false;
-Trace _getTrace(stack) {
-  Trace trace;
-  if (stack == null || !formatStacks) return null;
-  if (stack is String) {
-    trace = new Trace.parse(stack);
-  } else if (stack is StackTrace) {
-    trace = new Trace.from(stack);
-  } else {
-    throw new Exception('Invalid stack type ${stack.runtimeType} for $stack.');
-  }
-
-  if (!filterStacks) return trace;
-
-  // Format the stack trace by removing everything above TestCase._runTest,
-  // which is usually going to be irrelevant. Also fold together unittest and
-  // core library calls so only the function the user called is visible.
-  return new Trace(trace.frames.takeWhile((frame) {
-    return frame.package != 'unittest' || frame.member != 'TestCase._runTest';
-  })).terse.foldFrames((frame) => frame.package == 'unittest' || frame.isCore);
-}
diff --git a/pkg/unittest/pubspec.yaml b/pkg/unittest/pubspec.yaml
index 0370e35..b7fa187 100644
--- a/pkg/unittest/pubspec.yaml
+++ b/pkg/unittest/pubspec.yaml
@@ -1,5 +1,5 @@
 name: unittest
-version: 0.10.1+2
+version: 0.11.0
 author: Dart Team <misc@dartlang.org>
 description: A library for writing dart unit tests.
 homepage: http://www.dartlang.org
@@ -8,5 +8,4 @@
 documentation: http://api.dartlang.org/docs/pkg/unittest
 dependencies:
   matcher: '>=0.10.0 <0.11.0'
-  mock: '>=0.10.0 <0.11.0'
   stack_trace: '>=0.9.0 <0.10.0'
diff --git a/pkg/web_components/pubspec.yaml b/pkg/web_components/pubspec.yaml
index 7a3fa76..82efc01 100644
--- a/pkg/web_components/pubspec.yaml
+++ b/pkg/web_components/pubspec.yaml
@@ -1,11 +1,13 @@
 name: web_components
-version: 0.3.3
+version: 0.3.4
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: https://www.dartlang.org/polymer-dart/
 description: >
+  Polyfills for Shadow DOM, Custom Elements, and HTML Imports.
   Custom Elements let authors define their own elements. Authors associate code
   with custom tag names, and then use those custom tag names as they would any
   standard tag. Shadow DOM is designed to provide encapsulation for custom
-  elements, by hiding DOM subtrees under shadow roots.
+  elements, by hiding DOM subtrees under shadow roots. HTML Imports let authors
+  bundle code and HTML as if they were libraries.
 environment:
-  sdk: ">=1.2.0 <2.0.0"
+  sdk: ">=1.4.0-dev.6.6 <2.0.0"
diff --git a/pkg/web_components/test/location_wrapper_test.dart b/pkg/web_components/test/location_wrapper_test.dart
new file mode 100644
index 0000000..a1c531a
--- /dev/null
+++ b/pkg/web_components/test/location_wrapper_test.dart
@@ -0,0 +1,17 @@
+// 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 template_wrappers_test;
+
+import 'dart:html';
+import 'package:unittest/html_config.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+  useHtmlConfiguration();
+
+  test('OK to access location with platform.js', () {
+    expect(window.location.toString(), window.location.href);
+  });
+}
diff --git a/pkg/web_components/test/location_wrapper_test.html b/pkg/web_components/test/location_wrapper_test.html
new file mode 100644
index 0000000..b5f20b6
--- /dev/null
+++ b/pkg/web_components/test/location_wrapper_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> location_wrappers_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.js"></script>
+  <script src="/packages/web_components/dart_support.js"></script>
+</head>
+<body>
+  <h1> Running template_wrappers_test </h1>
+  <script type="text/javascript"
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  %TEST_SCRIPTS%
+</body>
+</html>
diff --git a/pkg/yaml/CHANGELOG.md b/pkg/yaml/CHANGELOG.md
new file mode 100644
index 0000000..7d1fafd
--- /dev/null
+++ b/pkg/yaml/CHANGELOG.md
@@ -0,0 +1,9 @@
+## 0.9.0+2
+
+* Ensure that maps are order-independent when used as map keys.
+
+## 0.9.0+1
+
+* The `YamlMap` class is deprecated. In a future version, maps returned by
+  `loadYaml` and `loadYamlStream` will be Dart `HashMap`s with a custom equality
+  operation.
diff --git a/pkg/yaml/README.md b/pkg/yaml/README.md
index 47a5419..531162f 100644
--- a/pkg/yaml/README.md
+++ b/pkg/yaml/README.md
@@ -3,21 +3,27 @@
 Use `loadYaml` to load a single document, or `loadYamlStream` to load a
 stream of documents. For example:
 
-    import 'package:yaml/yaml.dart';
-    main() {
-      var doc = loadYaml("YAML: YAML Ain't Markup Language");
-      print(doc['YAML']);
-    }
+```dart
+import 'package:yaml/yaml.dart';
+
+main() {
+  var doc = loadYaml("YAML: YAML Ain't Markup Language");
+  print(doc['YAML']);
+}
+```
 
 This library currently doesn't support dumping to YAML. You should use
 `JSON.encode` from `dart:convert` instead:
 
-    import 'dart:convert';
-    import 'package:yaml/yaml.dart';
-    main() {
-      var doc = loadYaml("YAML: YAML Ain't Markup Language");
-      print(JSON.encode(doc));
-    }
+```dart
+import 'dart:convert';
+import 'package:yaml/yaml.dart';
+
+main() {
+  var doc = loadYaml("YAML: YAML Ain't Markup Language");
+  print(JSON.encode(doc));
+}
+```
 
 The source code for this package is at <http://code.google.com/p/dart>.
 Please file issues at <http://dartbug.com>. Other questions or comments can be
diff --git a/pkg/yaml/lib/src/composer.dart b/pkg/yaml/lib/src/composer.dart
index 40b7667..3178096 100644
--- a/pkg/yaml/lib/src/composer.dart
+++ b/pkg/yaml/lib/src/composer.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 composer;
+library yaml.composer;
 
 import 'model.dart';
 import 'visitor.dart';
@@ -19,10 +19,11 @@
   /// that anchor.
   final _anchors = <String, Node>{};
 
-  /// The next id to use for the represenation graph's anchors. The spec doesn't
-  /// use anchors in the representation graph, but we do so that the constructor
-  /// can ensure that the same node in the representation graph produces the
-  /// same native object.
+  /// The next id to use for the represenation graph's anchors.
+  ///
+  /// The spec doesn't use anchors in the representation graph, but we do so
+  /// that the constructor can ensure that the same node in the representation
+  /// graph produces the same native object.
   var _idCounter = 0;
 
   Composer(this._root);
@@ -33,13 +34,15 @@
   /// Returns the anchor to which an alias node refers.
   Node visitAlias(AliasNode alias) {
     if (!_anchors.containsKey(alias.anchor)) {
-      throw new YamlException("no anchor for alias ${alias.anchor}");
+      throw new YamlException("No anchor for alias ${alias.anchor}.");
     }
     return _anchors[alias.anchor];
   }
 
   /// Parses a scalar node according to its tag, or auto-detects the type if no
-  /// tag exists. Currently this only supports the YAML core type schema.
+  /// tag exists.
+  ///
+  /// Currently this only supports the YAML core type schema.
   Node visitScalar(ScalarNode scalar) {
     if (scalar.tag.name == "!") {
       return setAnchor(scalar, parseString(scalar.content));
@@ -51,30 +54,31 @@
       return setAnchor(scalar, parseString(scalar.content));
     }
 
-    // TODO(nweiz): support the full YAML type repository
-    var tagParsers = {
-      'null': parseNull, 'bool': parseBool, 'int': parseInt,
-      'float': parseFloat, 'str': parseString
-    };
+    var result = _parseByTag(scalar);
+    if (result != null) return setAnchor(scalar, result);
+    throw new YamlException('Invalid literal for ${scalar.tag}: '
+        '"${scalar.content}".');
+  }
 
-    for (var key in tagParsers.keys) {
-      if (scalar.tag.name != Tag.yaml(key)) continue;
-      var result = tagParsers[key](scalar.content);
-      if (result != null) return setAnchor(scalar, result);
-      throw new YamlException('invalid literal for $key: "${scalar.content}"');
+  ScalarNode _parseByTag(ScalarNode scalar) {
+    switch (scalar.tag.name) {
+      case "null": return parseNull(scalar.content);
+      case "bool": return parseBool(scalar.content);
+      case "int": return parseInt(scalar.content);
+      case "float": return parseFloat(scalar.content);
+      case "str": return parseString(scalar.content);
     }
-
-    throw new YamlException('undefined tag: "${scalar.tag.name}"');
+    throw new YamlException('Undefined tag: ${scalar.tag}.');
   }
 
   /// Assigns a tag to the sequence and recursively composes its contents.
   Node visitSequence(SequenceNode seq) {
     var tagName = seq.tag.name;
     if (tagName != "!" && tagName != "?" && tagName != Tag.yaml("seq")) {
-      throw new YamlException("invalid tag for sequence: ${tagName}");
+      throw new YamlException("Invalid tag for sequence: ${seq.tag}.");
     }
 
-    var result = setAnchor(seq, new SequenceNode(Tag.yaml("seq"), null));
+    var result = setAnchor(seq, new SequenceNode(Tag.yaml('seq'), null));
     result.content = super.visitSequence(seq);
     return result;
   }
@@ -83,10 +87,10 @@
   Node visitMapping(MappingNode map) {
     var tagName = map.tag.name;
     if (tagName != "!" && tagName != "?" && tagName != Tag.yaml("map")) {
-      throw new YamlException("invalid tag for mapping: ${tagName}");
+      throw new YamlException("Invalid tag for mapping: ${map.tag}.");
     }
 
-    var result = setAnchor(map, new MappingNode(Tag.yaml("map"), null));
+    var result = setAnchor(map, new MappingNode(Tag.yaml('map'), null));
     result.content = super.visitMapping(map);
     return result;
   }
diff --git a/pkg/yaml/lib/src/constructor.dart b/pkg/yaml/lib/src/constructor.dart
index 428c476..116809d 100644
--- a/pkg/yaml/lib/src/constructor.dart
+++ b/pkg/yaml/lib/src/constructor.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 constructor;
+library yaml.constructor;
 
 import 'model.dart';
 import 'visitor.dart';
diff --git a/pkg/yaml/lib/src/deep_equals.dart b/pkg/yaml/lib/src/deep_equals.dart
index bce4aad..68fb236 100644
--- a/pkg/yaml/lib/src/deep_equals.dart
+++ b/pkg/yaml/lib/src/deep_equals.dart
@@ -2,71 +2,80 @@
 // 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 deep_equals;
+library yaml.deep_equals;
 
-/// Returns whether two objects are structurally equivalent. This considers NaN
-/// values to be equivalent. It also handles self-referential structures.
-bool deepEquals(obj1, obj2, [List parents1, List parents2]) {
-  if (identical(obj1, obj2)) return true;
-  if (parents1 == null) {
-    parents1 = [];
-    parents2 = [];
-  }
+/// Returns whether two objects are structurally equivalent.
+///
+/// This considers `NaN` values to be equivalent. It also handles
+/// self-referential structures.
+bool deepEquals(obj1, obj2) => new _DeepEquals().equals(obj1, obj2);
 
-  // parents1 and parents2 are guaranteed to be the same size.
-  for (var i = 0; i < parents1.length; i++) {
-    var loop1 = identical(obj1, parents1[i]);
-    var loop2 = identical(obj2, parents2[i]);
-    // If both structures loop in the same place, they're equal at that point in
-    // the structure. If one loops and the other doesn't, they're not equal.
-    if (loop1 && loop2) return true;
-    if (loop1 || loop2) return false;
-  }
+/// A class that provides access to the list of parent objects used for loop
+/// detection.
+class _DeepEquals {
+  final _parents1 = [];
+  final _parents2 = [];
 
-  parents1.add(obj1);
-  parents2.add(obj2);
-  try {
-    if (obj1 is List && obj2 is List) {
-      return _listEquals(obj1, obj2, parents1, parents2);
-    } else if (obj1 is Map && obj2 is Map) {
-      return _mapEquals(obj1, obj2, parents1, parents2);
-    } else if (obj1 is double && obj2 is double) {
-      return _doubleEquals(obj1, obj2);
-    } else {
-      return obj1 == obj2;
+  /// Returns whether [obj1] and [obj2] are structurally equivalent.
+  bool equals(obj1, obj2) {
+    // _parents1 and _parents2 are guaranteed to be the same size.
+    for (var i = 0; i < _parents1.length; i++) {
+      var loop1 = identical(obj1, _parents1[i]);
+      var loop2 = identical(obj2, _parents2[i]);
+      // If both structures loop in the same place, they're equal at that point
+      // in the structure. If one loops and the other doesn't, they're not
+      // equal.
+      if (loop1 && loop2) return true;
+      if (loop1 || loop2) return false;
     }
-  } finally {
-    parents1.removeLast();
-    parents2.removeLast();
-  }
-}
 
-/// Returns whether [list1] and [list2] are structurally equal. 
-bool _listEquals(List list1, List list2, List parents1, List parents2) {
-  if (list1.length != list2.length) return false;
-
-  for (var i = 0; i < list1.length; i++) {
-    if (!deepEquals(list1[i], list2[i], parents1, parents2)) return false;
+    _parents1.add(obj1);
+    _parents2.add(obj2);
+    try {
+      if (obj1 is List && obj2 is List) {
+        return _listEquals(obj1, obj2);
+      } else if (obj1 is Map && obj2 is Map) {
+        return _mapEquals(obj1, obj2);
+      } else if (obj1 is num && obj2 is num) {
+        return _numEquals(obj1, obj2);
+      } else {
+        return obj1 == obj2;
+      }
+    } finally {
+      _parents1.removeLast();
+      _parents2.removeLast();
+    }
   }
 
-  return true;
-}
+  /// Returns whether [list1] and [list2] are structurally equal. 
+  bool _listEquals(List list1, List list2) {
+    if (list1.length != list2.length) return false;
 
-/// Returns whether [map1] and [map2] are structurally equal. 
-bool _mapEquals(Map map1, Map map2, List parents1, List parents2) {
-  if (map1.length != map2.length) return false;
+    for (var i = 0; i < list1.length; i++) {
+      if (!equals(list1[i], list2[i])) return false;
+    }
 
-  for (var key in map1.keys) {
-    if (!map2.containsKey(key)) return false;
-    if (!deepEquals(map1[key], map2[key], parents1, parents2)) return false;
+    return true;
   }
 
-  return true;
-}
+  /// Returns whether [map1] and [map2] are structurally equal. 
+  bool _mapEquals(Map map1, Map map2) {
+    if (map1.length != map2.length) return false;
 
-/// Returns whether two doubles are equivalent. This differs from `d1 == d2` in
-/// that it considers NaN to be equal to itself.
-bool _doubleEquals(double d1, double d2) {
-  if (d1.isNaN && d2.isNaN) return true;
-  return d1 == d2;
+    for (var key in map1.keys) {
+      if (!map2.containsKey(key)) return false;
+      if (!equals(map1[key], map2[key])) return false;
+    }
+
+    return true;
+  }
+
+  /// Returns whether two numbers are equivalent.
+  ///
+  /// This differs from `n1 == n2` in that it considers `NaN` to be equal to
+  /// itself.
+  bool _numEquals(num n1, num n2) {
+    if (n1.isNaN && n2.isNaN) return true;
+    return n1 == n2;
+  }
 }
diff --git a/pkg/yaml/lib/src/model.dart b/pkg/yaml/lib/src/model.dart
index 37247f0..564cac6 100644
--- a/pkg/yaml/lib/src/model.dart
+++ b/pkg/yaml/lib/src/model.dart
@@ -5,39 +5,38 @@
 /// This file contains the node classes for the internal representations of YAML
 /// documents. These nodes are used for both the serialization tree and the
 /// representation graph.
-library model;
+library yaml.model;
 
 import 'parser.dart';
 import 'utils.dart';
 import 'visitor.dart';
 import 'yaml_exception.dart';
 
+/// The prefix for tag types defined by the YAML spec.
+const _YAML_URI_PREFIX = "tag:yaml.org,2002:";
+
 /// A tag that indicates the type of a YAML node.
 class Tag {
-  // TODO(nweiz): it would better match the semantics of the spec if there were
-  // a singleton instance of this class for each tag.
-
-  static const SCALAR_KIND = 0;
-  static const SEQUENCE_KIND = 1;
-  static const MAPPING_KIND = 2;
-
-  static const String YAML_URI_PREFIX = 'tag:yaml.org,2002:';
-
   /// The name of the tag, either a URI or a local tag beginning with "!".
   final String name;
 
-  /// The kind of the tag: SCALAR_KIND, SEQUENCE_KIND, or MAPPING_KIND.
-  final int kind;
-
-  Tag(this.name, this.kind);
-
-  Tag.scalar(String name) : this(name, SCALAR_KIND);
-  Tag.sequence(String name) : this(name, SEQUENCE_KIND);
-  Tag.mapping(String name) : this(name, MAPPING_KIND);
+  /// The kind of the tag.
+  final TagKind kind;
 
   /// Returns the standard YAML tag URI for [type].
   static String yaml(String type) => "tag:yaml.org,2002:$type";
 
+  const Tag(this.name, this.kind);
+
+  const Tag.scalar(String name)
+      : this(name, TagKind.SCALAR);
+
+  const Tag.sequence(String name)
+      : this(name, TagKind.SEQUENCE);
+
+  const Tag.mapping(String name)
+      : this(name, TagKind.MAPPING);
+
   /// Two tags are equal if their URIs are equal.
   operator ==(other) {
     if (other is! Tag) return false;
@@ -45,8 +44,8 @@
   }
 
   String toString() {
-    if (name.startsWith(YAML_URI_PREFIX)) {
-      return '!!${name.substring(YAML_URI_PREFIX.length)}';
+    if (name.startsWith(_YAML_URI_PREFIX)) {
+      return '!!${name.substring(_YAML_URI_PREFIX.length)}';
     } else {
       return '!<$name>';
     }
@@ -55,6 +54,24 @@
   int get hashCode => name.hashCode;
 }
 
+/// An enum for kinds of tags.
+class TagKind {
+  /// A tag indicating that the value is a scalar.
+  static const SCALAR = const TagKind._("scalar");
+
+  /// A tag indicating that the value is a sequence.
+  static const SEQUENCE = const TagKind._("sequence");
+
+  /// A tag indicating that the value is a mapping.
+  static const MAPPING = const TagKind._("mapping");
+
+  final String name;
+
+  const TagKind._(this.name);
+
+  String toString() => name;
+}
+
 /// The abstract class for YAML nodes.
 abstract class Node {
   /// Every YAML node has a tag that describes its type.
@@ -185,7 +202,7 @@
       return '"${escapedValue.join()}"';
     }
 
-    throw new YamlException("unknown scalar value: $value");
+    throw new YamlException('Unknown scalar value: "$value".');
   }
 
   String toString() => '$tag "$content"';
diff --git a/pkg/yaml/lib/src/parser.dart b/pkg/yaml/lib/src/parser.dart
index 2616038..d1e20ff 100644
--- a/pkg/yaml/lib/src/parser.dart
+++ b/pkg/yaml/lib/src/parser.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 parser;
+library yaml.parser;
 
 import 'dart:collection';
 
@@ -407,23 +407,24 @@
   error(String message) {
     // Line and column should be one-based.
     throw new SyntaxError(_line + 1, _column + 1,
-        "$message (in $_farthestContext)");
+        "$message (in $_farthestContext).");
   }
 
   /// If [result] is falsey, throws an error saying that [expected] was
   /// expected.
   expect(result, String expected) {
     if (truth(result)) return result;
-    error("expected $expected");
+    error("Expected $expected");
   }
 
   /// Throws an error saying that the parse failed. Uses [_farthestLine],
-  /// [_farthestColumn], and [_farthestContext] to provide additional information.
+  /// [_farthestColumn], and [_farthestContext] to provide additional
+  /// information.
   parseFailed() {
-    var message = "invalid YAML in $_farthestContext";
+    var message = "Invalid YAML in $_farthestContext";
     var extraError = _errorAnnotations[_farthestPos];
     if (extraError != null) message = "$message ($extraError)";
-    throw new SyntaxError(_farthestLine + 1, _farthestColumn + 1, message);
+    throw new SyntaxError(_farthestLine + 1, _farthestColumn + 1, "$message.");
   }
 
   /// Returns the number of spaces after the current position.
@@ -788,7 +789,7 @@
     case BLOCK_KEY:
     case FLOW_KEY:
       return s_separateInLine();
-    default: throw 'invalid context "$ctx"';
+    default: throw 'Invalid context "$ctx".';
     }
   }
 
@@ -1014,7 +1015,7 @@
     var char = peek();
     var indicator = indicatorType(char);
     if (indicator == C_RESERVED) {
-      error("reserved indicators can't start a plain scalar");
+      error("Reserved indicators can't start a plain scalar");
     }
     var match = (isNonSpace(char) && indicator == null) ||
       ((indicator == C_MAPPING_KEY ||
@@ -1037,7 +1038,7 @@
     case FLOW_KEY:
       // 129
       return isNonSpace(char) && !isFlowIndicator(char);
-    default: throw 'invalid context "$ctx"';
+    default: throw 'Invalid context "$ctx".';
     }
   }
 
@@ -1066,7 +1067,7 @@
       case BLOCK_KEY:
       case FLOW_KEY:
         return ns_plainOneLine(ctx);
-      default: throw 'invalid context "$ctx"';
+      default: throw 'Invalid context "$ctx".';
       }
     });
   });
@@ -1106,13 +1107,14 @@
   // 136
   int inFlow(int ctx) {
     switch (ctx) {
-    case FLOW_OUT:
-    case FLOW_IN:
-      return FLOW_IN;
-    case BLOCK_KEY:
-    case FLOW_KEY:
-      return FLOW_KEY;
+      case FLOW_OUT:
+      case FLOW_IN:
+        return FLOW_IN;
+      case BLOCK_KEY:
+      case FLOW_KEY:
+        return FLOW_KEY;
     }
+    throw "unreachable";
   }
 
   // 137
@@ -1434,6 +1436,7 @@
     case CHOMPING_KEEP:
       return b_asLineFeed();
     }
+    throw "unreachable";
   }
 
   // 166
diff --git a/pkg/yaml/lib/src/utils.dart b/pkg/yaml/lib/src/utils.dart
index a87555d..463af70 100644
--- a/pkg/yaml/lib/src/utils.dart
+++ b/pkg/yaml/lib/src/utils.dart
@@ -2,38 +2,35 @@
 // 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 utils;
+library yaml.utils;
 
-/// Returns the hash code for [obj]. This includes null, true, false, maps, and
-/// lists. Also handles self-referential structures.
-int hashCodeFor(obj, [List parents]) {
-  if (parents == null) {
-    parents = [];
-  } else if (parents.any((p) => identical(p, obj))) {
-    return -1;
-  }
+import 'package:collection/collection.dart';
 
-  parents.add(obj);
-  try {
-    if (obj == null) return 0;
-    if (obj == true) return 1;
-    if (obj == false) return 2;
-    if (obj is Map) {
-      return hashCodeFor(obj.keys, parents) ^
-        hashCodeFor(obj.values, parents);
-    }
-    if (obj is Iterable) {
-      // This is probably a really bad hash function, but presumably we'll get
-      // this in the standard library before it actually matters.
-      int hash = 0;
-      for (var e in obj) {
-        hash ^= hashCodeFor(e, parents);
+/// Returns a hash code for [obj] such that structurally equivalent objects
+/// will have the same hash code.
+///
+/// This supports deep equality for maps and lists, including those with
+/// self-referential structures.
+int hashCodeFor(obj) {
+  var parents = [];
+
+  _hashCodeFor(value) {
+    if (parents.any((parent) => identical(parent, value))) return -1;
+
+    parents.add(value);
+    try {
+      if (value is Map) {
+        var equality = const UnorderedIterableEquality();
+        return equality.hash(value.keys.map(_hashCodeFor)) ^
+            equality.hash(value.values.map(_hashCodeFor));
+      } else if (value is Iterable) {
+        return const IterableEquality().hash(value.map(hashCodeFor));
       }
-      return hash;
+      return value.hashCode;
+    } finally {
+      parents.removeLast();
     }
-    return obj.hashCode;
-  } finally {
-    parents.removeLast();
   }
-}
 
+  return _hashCodeFor(obj);
+}
diff --git a/pkg/yaml/lib/src/visitor.dart b/pkg/yaml/lib/src/visitor.dart
index 4a9c54f..7095268 100644
--- a/pkg/yaml/lib/src/visitor.dart
+++ b/pkg/yaml/lib/src/visitor.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 visitor;
+library yaml.visitor;
 
 import 'model.dart';
 import 'yaml_map.dart';
diff --git a/pkg/yaml/lib/src/yaml_exception.dart b/pkg/yaml/lib/src/yaml_exception.dart
index 66697a1..a863274 100644
--- a/pkg/yaml/lib/src/yaml_exception.dart
+++ b/pkg/yaml/lib/src/yaml_exception.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 yaml_exception;
+library yaml.exception;
 
 /// An error thrown by the YAML processor.
 class YamlException implements Exception {
diff --git a/pkg/yaml/lib/src/yaml_map.dart b/pkg/yaml/lib/src/yaml_map.dart
index ab07c72..ff3da36 100644
--- a/pkg/yaml/lib/src/yaml_map.dart
+++ b/pkg/yaml/lib/src/yaml_map.dart
@@ -2,86 +2,39 @@
 // 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 yaml_map;
+library yaml.map;
+
+import 'dart:collection';
+
+import 'package:collection/collection.dart';
 
 import 'deep_equals.dart';
 import 'utils.dart';
 
-/// This class wraps behaves almost identically to the normal Dart Map
+/// This class behaves almost identically to the normal Dart [Map]
 /// implementation, with the following differences:
 ///
-///  *  It allows null, NaN, boolean, list, and map keys.
+///  *  It allows NaN, list, and map keys.
 ///  *  It defines `==` structurally. That is, `yamlMap1 == yamlMap2` if they
 ///     have the same contents.
 ///  *  It has a compatible [hashCode] method.
-class YamlMap implements Map {
-  final Map _map;
+///
+/// This class is deprecated. In future releases, this package will use
+/// a [HashMap] with a custom equality operation rather than a custom class.
+@Deprecated('1.0.0')
+class YamlMap extends DelegatingMap {
+  YamlMap()
+      : super(new HashMap(equals: deepEquals, hashCode: hashCodeFor));
 
-  YamlMap() : _map = new Map();
-
-  YamlMap.from(Map map) : _map = new Map.from(map);
-
-  YamlMap._wrap(this._map);
-
-  void addAll(Map other) {
-    other.forEach((key, value) {
-      this[key] = value;
-    });
+  YamlMap.from(Map map)
+      : super(new HashMap(equals: deepEquals, hashCode: hashCodeFor)) {
+    addAll(map);
   }
 
-  bool containsValue(value) => _map.containsValue(value);
-  bool containsKey(key) => _map.containsKey(_wrapKey(key));
-  operator [](key) => _map[_wrapKey(key)];
-  operator []=(key, value) { _map[_wrapKey(key)] = value; }
-  putIfAbsent(key, ifAbsent()) => _map.putIfAbsent(_wrapKey(key), ifAbsent);
-  remove(key) => _map.remove(_wrapKey(key));
-  void clear() => _map.clear();
-  void forEach(void f(key, value)) =>
-    _map.forEach((k, v) => f(_unwrapKey(k), v));
-  Iterable get keys => _map.keys.map(_unwrapKey);
-  Iterable get values => _map.values;
-  int get length => _map.length;
-  bool get isEmpty => _map.isEmpty;
-  bool get isNotEmpty => _map.isNotEmpty;
-  String toString() => _map.toString();
-
-  int get hashCode => hashCodeFor(_map);
+  int get hashCode => hashCodeFor(this);
 
   bool operator ==(other) {
     if (other is! YamlMap) return false;
     return deepEquals(this, other);
   }
-
-  /// Wraps an object for use as a key in the map.
-  _wrapKey(obj) {
-    if (obj != null && obj is! bool && obj is! List &&
-        (obj is! double || !obj.isNan) &&
-        (obj is! Map || obj is YamlMap)) {
-      return obj;
-    } else if (obj is Map) {
-      return new YamlMap._wrap(obj);
-    }
-    return new _WrappedHashKey(obj);
-  }
-
-  /// Unwraps an object that was used as a key in the map.
-  _unwrapKey(obj) => obj is _WrappedHashKey ? obj.value : obj;
-}
-
-/// A class for wrapping normally-unhashable objects that are being used as keys
-/// in a YamlMap.
-class _WrappedHashKey {
-  final value;
-
-  _WrappedHashKey(this.value);
-
-  int get hashCode => hashCodeFor(value);
-
-  String toString() => value.toString();
-
-  /// This is defined as both values being structurally equal.
-  bool operator ==(other) {
-    if (other is! _WrappedHashKey) return false;
-    return deepEquals(this.value, other.value);
-  }
 }
diff --git a/pkg/yaml/lib/yaml.dart b/pkg/yaml/lib/yaml.dart
index fa52861..dc895e6 100644
--- a/pkg/yaml/lib/yaml.dart
+++ b/pkg/yaml/lib/yaml.dart
@@ -2,44 +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.
 
-/// A parser for [YAML](http://www.yaml.org/).
-///
-/// ## Installing ##
-///
-/// Use [pub][] to install this package. Add the following to your
-/// `pubspec.yaml` file.
-///
-///     dependencies:
-///       yaml: any
-///
-/// Then run `pub install`.
-///
-/// For more information, see the
-/// [yaml package on pub.dartlang.org][pkg].
-///
-/// ## Using ##
-///
-/// Use [loadYaml] to load a single document, or [loadYamlStream] to load a
-/// stream of documents. For example:
-///
-///     import 'package:yaml/yaml.dart';
-///     main() {
-///       var doc = loadYaml("YAML: YAML Ain't Markup Language");
-///       print(doc['YAML']);
-///     }
-///
-/// This library currently doesn't support dumping to YAML. You should use
-/// `JSON.encode` from `dart:convert` instead:
-///
-///     import 'dart:convert';
-///     import 'package:yaml/yaml.dart';
-///     main() {
-///       var doc = loadYaml("YAML: YAML Ain't Markup Language");
-///       print(JSON.encode(doc));
-///     }
-///
-/// [pub]: http://pub.dartlang.org
-/// [pkg]: http://pub.dartlang.org/packages/yaml
 library yaml;
 
 import 'src/composer.dart';
@@ -50,18 +12,23 @@
 export 'src/yaml_exception.dart';
 export 'src/yaml_map.dart';
 
-/// Loads a single document from a YAML string. If the string contains more than
-/// one document, this throws an error.
+/// Loads a single document from a YAML string.
+///
+/// If the string contains more than one document, this throws a
+/// [YamlException]. In future releases, this will become an [ArgumentError].
 ///
 /// The return value is mostly normal Dart objects. However, since YAML mappings
 /// support some key types that the default Dart map implementation doesn't
-/// (null, NaN, booleans, lists, and maps), all maps in the returned document
-/// are [YamlMap]s. These have a few small behavioral differences from the
-/// default Map implementation; for details, see the [YamlMap] class.
+/// (NaN, lists, and maps), all maps in the returned document are [YamlMap]s.
+/// These have a few small behavioral differences from the default Map
+/// implementation; for details, see the [YamlMap] class.
+///
+/// In future versions, maps will instead be [HashMap]s with a custom equality
+/// operation.
 loadYaml(String yaml) {
   var stream = loadYamlStream(yaml);
   if (stream.length != 1) {
-    throw new YamlException("Expected 1 document, were ${stream.length}");
+    throw new YamlException("Expected 1 document, were ${stream.length}.");
   }
   return stream[0];
 }
@@ -70,9 +37,12 @@
 ///
 /// The return value is mostly normal Dart objects. However, since YAML mappings
 /// support some key types that the default Dart map implementation doesn't
-/// (null, NaN, booleans, lists, and maps), all maps in the returned document
-/// are [YamlMap]s. These have a few small behavioral differences from the
-/// default Map implementation; for details, see the [YamlMap] class.
+/// (NaN, lists, and maps), all maps in the returned document are [YamlMap]s.
+/// These have a few small behavioral differences from the default Map
+/// implementation; for details, see the [YamlMap] class.
+///
+/// In future versions, maps will instead be [HashMap]s with a custom equality
+/// operation.
 List loadYamlStream(String yaml) {
   return new Parser(yaml).l_yamlStream()
       .map((doc) => new Constructor(new Composer(doc).compose()).construct())
diff --git a/pkg/yaml/pubspec.yaml b/pkg/yaml/pubspec.yaml
index 1fb4c8d..7186de0 100644
--- a/pkg/yaml/pubspec.yaml
+++ b/pkg/yaml/pubspec.yaml
@@ -1,8 +1,10 @@
 name: yaml
-version: 0.9.0
+version: 0.9.0+2
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: A parser for YAML.
+dependencies:
+  collection: ">=0.9.2 <0.10.0"
 dev_dependencies:
   unittest: ">=0.9.0 <0.10.0"
 environment:
diff --git a/pkg/yaml/test/utils.dart b/pkg/yaml/test/utils.dart
new file mode 100644
index 0000000..0bac9f9
--- /dev/null
+++ b/pkg/yaml/test/utils.dart
@@ -0,0 +1,83 @@
+// 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 yaml.test.utils;
+
+import 'package:unittest/unittest.dart';
+import 'package:yaml/src/deep_equals.dart' as de;
+import 'package:yaml/yaml.dart';
+
+/// A matcher that validates that a closure or Future throws a [YamlException].
+final Matcher throwsYamlException = throwsA(new isInstanceOf<YamlException>());
+
+/// Returns a matcher that asserts that the value equals [expected].
+///
+/// This handles recursive loops and considers `NaN` to equal itself.
+Matcher deepEquals(expected) =>
+    predicate((actual) => de.deepEquals(actual, expected), "equals $expected");
+
+/// Constructs a new yaml.YamlMap, optionally from a normal Map.
+Map yamlMap([Map from]) =>
+    from == null ? new YamlMap() : new YamlMap.from(from);
+
+/// Asserts that a string containing a single YAML document produces a given
+/// value when loaded.
+void expectYamlLoads(expected, String source) {
+  var actual = loadYaml(cleanUpLiteral(source));
+  expect(expected, deepEquals(actual));
+}
+
+/// Asserts that a string containing a stream of YAML documents produces a given
+/// list of values when loaded.
+void expectYamlStreamLoads(List expected, String source) {
+  var actual = loadYamlStream(cleanUpLiteral(source));
+  expect(expected, deepEquals(actual));
+}
+
+/// Asserts that a string containing a single YAML document throws a
+/// [YamlException].
+void expectYamlFails(String source) {
+  expect(() => loadYaml(cleanUpLiteral(source)), throwsYamlException);
+}
+
+/// Removes eight spaces of leading indentation from a multiline string.
+///
+/// Note that this is very sensitive to how the literals are styled. They should
+/// be:
+///     '''
+///     Text starts on own line. Lines up with subsequent lines.
+///     Lines are indented exactly 8 characters from the left margin.
+///     Close is on the same line.'''
+///
+/// This does nothing if text is only a single line.
+String cleanUpLiteral(String text) {
+  var lines = text.split('\n');
+  if (lines.length <= 1) return text;
+
+  for (var j = 0; j < lines.length; j++) {
+    if (lines[j].length > 8) {
+      lines[j] = lines[j].substring(8, lines[j].length);
+    } else {
+      lines[j] = '';
+    }
+  }
+
+  return lines.join('\n');
+}
+
+/// Indents each line of [text] so that, when passed to [cleanUpLiteral], it
+/// will produce output identical to [text].
+///
+/// This is useful for literals that need to include newlines but can't be
+/// conveniently represented as multi-line strings.
+String indentLiteral(String text) {
+  var lines = text.split('\n');
+  if (lines.length <= 1) return text;
+
+  for (var i = 0; i < lines.length; i++) {
+    lines[i] = "        ${lines[i]}";
+  }
+
+  return lines.join("\n");
+}
diff --git a/pkg/yaml/test/yaml_test.dart b/pkg/yaml/test/yaml_test.dart
index 42cb613..fcfc12e 100644
--- a/pkg/yaml/test/yaml_test.dart
+++ b/pkg/yaml/test/yaml_test.dart
@@ -2,36 +2,13 @@
 // 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 yaml_test;
+library yaml.test;
 
 // TODO(rnystrom): rewrite tests so that they don't need "Expect".
-import "package:expect/expect.dart";
 import 'package:unittest/unittest.dart';
 import 'package:yaml/yaml.dart';
-import 'package:yaml/src/deep_equals.dart';
-// TODO(jmesserly): we should not be reaching outside the YAML package
-// The http package has a similar problem.
-import '../../../tests/utils/test_utils.dart';
 
-/// Constructs a new yaml.YamlMap, optionally from a normal Map.
-Map yamlMap([Map from]) =>
-    from == null ? new YamlMap() : new YamlMap.from(from);
-
-/// Asserts that a string containing a single YAML document produces a given
-/// value when loaded.
-expectYamlLoads(expected, String source) {
-  var actual = loadYaml(cleanUpLiteral(source));
-  Expect.isTrue(deepEquals(expected, actual), 
-      'expectYamlLoads(expected: <$expected>, actual: <$actual>)');
-}
-
-/// Asserts that a string containing a stream of YAML documents produces a given
-/// list of values when loaded.
-expectYamlStreamLoads(List expected, String source) {
-  var actual = loadYamlStream(cleanUpLiteral(source));
-  Expect.isTrue(deepEquals(expected, actual), 
-      'expectYamlStreamLoads(expected: <$expected>, actual: <$actual>)');
-}
+import 'utils.dart';
 
 main() {
   var infinity = double.parse("Infinity");
@@ -500,7 +477,7 @@
 
     expectDisallowsCharacter(int charCode) {
       var char = new String.fromCharCodes([charCode]);
-      Expect.throws(() => loadYaml('The character "$char" is disallowed'));
+      expectYamlFails('The character "$char" is disallowed');
     }
 
     test("doesn't include C0 control characters", () {
@@ -598,8 +575,8 @@
     // });
 
     test('[Example 5.10]', () {
-      Expect.throws(() => loadYaml("commercial-at: @text"));
-      Expect.throws(() => loadYaml("commercial-at: `text"));
+      expectYamlFails("commercial-at: @text");
+      expectYamlFails("commercial-at: `text");
     });
   });
 
@@ -610,7 +587,7 @@
     });
 
     group('do not include', () {
-      test('form feed', () => Expect.throws(() => loadYaml("- 1\x0C- 2")));
+      test('form feed', () => expectYamlFails("- 1\x0C- 2"));
       test('NEL', () => expectYamlLoads(["1\x85- 2"], "- 1\x85- 2"));
       test('0x2028', () => expectYamlLoads(["1\u2028- 2"], "- 1\u2028- 2"));
       test('0x2029', () => expectYamlLoads(["1\u2029- 2"], "- 1\u2029- 2"));
@@ -669,27 +646,27 @@
     });
 
     test('[Example 5.14]', () {
-      Expect.throws(() => loadYaml('Bad escape: "\\c"'));
-      Expect.throws(() => loadYaml('Bad escape: "\\xq-"'));
+      expectYamlFails('Bad escape: "\\c"');
+      expectYamlFails('Bad escape: "\\xq-"');
     });
   });
 
   // Chapter 6: Basic Structures
   group('6.1: Indentation Spaces', () {
     test('may not include TAB characters', () {
-      Expect.throws(() => loadYaml(cleanUpLiteral(
+      expectYamlFails(
         """
         -
         \t- foo
-        \t- bar""")));
+        \t- bar""");
     });
 
     test('must be the same for all sibling nodes', () {
-      Expect.throws(() => loadYaml(cleanUpLiteral(
+      expectYamlFails(
         """
         -
           - foo
-         - bar""")));
+         - bar""");
     });
 
     test('may be different for the children of sibling nodes', () {
@@ -916,10 +893,10 @@
 
   group('6.7: Separation Lines', () {
     test('may not be used within implicit keys', () {
-      Expect.throws(() => loadYaml(cleanUpLiteral(
+      expectYamlFails(
         """
         [1,
-         2]: 3""")));
+         2]: 3""");
     });
 
     test('[Example 6.12]', () {
@@ -960,11 +937,11 @@
     // });
 
     // test('[Example 6.15]', () {
-    //   Expect.throws(() => loadYaml(cleanUpLiteral(
+    //   expectYamlFails(
     //     """
     //     %YAML 1.2
     //     %YAML 1.1
-    //     foo""")));
+    //     foo""");
     // });
 
     // test('[Example 6.16]', () {
@@ -976,11 +953,11 @@
     // });
 
     // test('[Example 6.17]', () {
-    //   Expect.throws(() => loadYaml(cleanUpLiteral(
+    //   ExpectYamlFails(
     //     """
     //     %TAG ! !foo
     //     %TAG ! !foo
-    //     bar""")));
+    //     bar""");
     // });
 
     // Examples 6.18 through 6.22 test custom tag URIs, which this
@@ -1010,8 +987,8 @@
     // // doesn't plan to support.
 
     // test('[Example 6.25]', () {
-    //   Expect.throws(() => loadYaml("- !<!> foo"));
-    //   Expect.throws(() => loadYaml("- !<\$:?> foo"));
+    //   expectYamlFails("- !<!> foo");
+    //   expectYamlFails("- !<\$:?> foo");
     // });
 
     // // Examples 6.26 and 6.27 test custom tag URIs, which this implementation
@@ -1040,10 +1017,10 @@
   // Chapter 7: Flow Styles
   group('7.1: Alias Nodes', () {
     // test("must not use an anchor that doesn't previously occur", () {
-    //   Expect.throws(() => loadYaml(cleanUpLiteral(
+    //   expectYamlFails(
     //     """
     //     - *anchor
-    //     - &anchor foo"""));
+    //     - &anchor foo""");
     // });
 
     // test("don't have to exist for a given anchor node", () {
@@ -1051,18 +1028,17 @@
     // });
 
     // group('must not specify', () {
-    //   test('tag properties', () => Expect.throws(() => loadYaml(cleanUpLiteral(
+    //   test('tag properties', () => expectYamlFails(
     //     """
     //     - &anchor foo
-    //     - !str *anchor""")));
+    //     - !str *anchor""");
 
-    //   test('anchor properties', () => Expect.throws(
-    //           () => loadYaml(cleanUpLiteral(
+    //   test('anchor properties', () => expectYamlFails(
     //     """
     //     - &anchor foo
-    //     - &anchor2 *anchor""")));
+    //     - &anchor2 *anchor""");
 
-    //   test('content', () => Expect.throws(() => loadYaml(cleanUpLiteral(
+    //   test('content', () => expectYamlFails(
     //     """
     //     - &anchor foo
     //     - *anchor bar""")));
@@ -1075,9 +1051,7 @@
     //     alias: *anchor""");
     //   var anchorList = doc['anchor'];
     //   var aliasList = doc['alias'];
-    //   Expect.isTrue(anchorList === aliasList);
-    //   anchorList.add('d');
-    //   Expect.listEquals(['a', 'b', 'c', 'd'], aliasList);
+    //   expect(anchorList, same(aliasList));
 
     //   doc = loadYaml(cleanUpLiteral(
     //     """
@@ -1086,9 +1060,7 @@
     //       : bar""");
     //   anchorList = doc.keys[0];
     //   aliasList = doc[['a', 'b', 'c']].keys[0];
-    //   Expect.isTrue(anchorList === aliasList);
-    //   anchorList.add('d');
-    //   Expect.listEquals(['a', 'b', 'c', 'd'], aliasList);
+    //   expect(anchorList, same(aliasList));
     // });
 
     // test('[Example 7.1]', () {
@@ -1344,15 +1316,15 @@
     });
 
     test('[Example 7.22]', () {
-      Expect.throws(() => loadYaml(cleanUpLiteral(
+      expectYamlFails(
         """
         [ foo
-         bar: invalid ]""")));
+         bar: invalid ]""");
 
       // TODO(nweiz): enable this when we throw an error for long keys
       // var dotList = new List.filled(1024, ' ');
       // var dots = dotList.join();
-      // Expect.throws(() => loadYaml('[ "foo...$dots...bar": invalid ]'));
+      // expectYamlFails('[ "foo...$dots...bar": invalid ]');
     });
   });
 
@@ -1421,22 +1393,22 @@
     });
 
     test('[Example 8.3]', () {
-      Expect.throws(() => loadYaml(cleanUpLiteral(
+      expectYamlFails(
         """
         - |
           
-         text""")));
+         text""");
 
-      Expect.throws(() => loadYaml(cleanUpLiteral(
+      expectYamlFails(
         """
         - >
           text
-         text""")));
+         text""");
 
-      Expect.throws(() => loadYaml(cleanUpLiteral(
+      expectYamlFails(
         """
         - |2
-         text""")));
+         text""");
     });
 
     test('[Example 8.4]', () {
diff --git a/runtime/bin/builtin.cc b/runtime/bin/builtin.cc
index 9927ee8..596ea15 100644
--- a/runtime/bin/builtin.cc
+++ b/runtime/bin/builtin.cc
@@ -86,6 +86,23 @@
 }
 
 
+Dart_Handle Builtin::LoadLibrary(Dart_Handle url, BuiltinLibraryId id) {
+  Dart_Handle library = Dart_LoadLibrary(url, Source(id));
+  if (!Dart_IsError(library) && (builtin_libraries_[id].has_natives_)) {
+    // Setup the native resolver for built in library functions.
+    DART_CHECK_VALID(
+        Dart_SetNativeResolver(library, NativeLookup, NativeSymbol));
+  }
+  if (builtin_libraries_[id].patch_url_ != NULL) {
+    ASSERT(builtin_libraries_[id].patch_paths_ != NULL);
+    LoadPatchFiles(library,
+                   builtin_libraries_[id].patch_url_,
+                   builtin_libraries_[id].patch_paths_);
+  }
+  return library;
+}
+
+
 Dart_Handle Builtin::LoadAndCheckLibrary(BuiltinLibraryId id) {
   ASSERT((sizeof(builtin_libraries_) / sizeof(builtin_lib_props)) ==
          kInvalidLibrary);
@@ -93,18 +110,7 @@
   Dart_Handle url = DartUtils::NewString(builtin_libraries_[id].url_);
   Dart_Handle library = Dart_LookupLibrary(url);
   if (Dart_IsError(library)) {
-    library = Dart_LoadLibrary(url, Source(id));
-    if (!Dart_IsError(library) && (builtin_libraries_[id].has_natives_)) {
-      // Setup the native resolver for built in library functions.
-      DART_CHECK_VALID(
-          Dart_SetNativeResolver(library, NativeLookup, NativeSymbol));
-    }
-    if (builtin_libraries_[id].patch_url_ != NULL) {
-      ASSERT(builtin_libraries_[id].patch_paths_ != NULL);
-      LoadPatchFiles(library,
-                     builtin_libraries_[id].patch_url_,
-                     builtin_libraries_[id].patch_paths_);
-    }
+    library = LoadLibrary(url, id);
   }
   DART_CHECK_VALID(library);
   return library;
diff --git a/runtime/bin/builtin.h b/runtime/bin/builtin.h
index 6e03854..5808126 100644
--- a/runtime/bin/builtin.h
+++ b/runtime/bin/builtin.h
@@ -43,6 +43,8 @@
   // Setup native resolver method built in library specified in 'id'.
   static void SetNativeResolver(BuiltinLibraryId id);
 
+  static Dart_Handle LoadLibrary(Dart_Handle url, BuiltinLibraryId id);
+
   // Check if built in library specified in 'id' is already loaded, if not
   // load it.
   static Dart_Handle LoadAndCheckLibrary(BuiltinLibraryId id);
diff --git a/runtime/bin/builtin_nolib.cc b/runtime/bin/builtin_nolib.cc
index e4ad4ce7..1662cd6 100644
--- a/runtime/bin/builtin_nolib.cc
+++ b/runtime/bin/builtin_nolib.cc
@@ -53,6 +53,12 @@
 }
 
 
+Dart_Handle Builtin::LoadLibrary(Dart_Handle url, BuiltinLibraryId id) {
+  return DartUtils::NewError(
+      "Unreachable code in Builtin::LoadLibrary (%d).", id);
+}
+
+
 Dart_Handle Builtin::LoadAndCheckLibrary(BuiltinLibraryId id) {
   ASSERT((sizeof(builtin_libraries_) / sizeof(builtin_lib_props)) ==
          kInvalidLibrary);
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 14f6711..ec1696c 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -174,38 +174,6 @@
 }
 
 
-Dart_Handle DartUtils::CanonicalizeURL(CommandLineOptions* url_mapping,
-                                       Dart_Handle library,
-                                       const char* url_str) {
-  // Get the url of the including library.
-  Dart_Handle library_url = Dart_LibraryUrl(library);
-  if (Dart_IsError(library_url)) {
-    return Dart_NewApiError("accessing library url failed");
-  }
-  if (!Dart_IsString(library_url)) {
-    return Dart_NewApiError("library url is not a string");
-  }
-  const char* library_url_str = NULL;
-  Dart_Handle result = Dart_StringToCString(library_url, &library_url_str);
-  if (Dart_IsError(result)) {
-    return Dart_NewApiError("accessing library url characters failed");
-  }
-  if (url_mapping != NULL) {
-    const char* mapped_library_url_str = MapLibraryUrl(url_mapping,
-                                                       library_url_str);
-    if (mapped_library_url_str != NULL) {
-      library_url_str = mapped_library_url_str;
-    }
-  }
-  // Calculate the canonical path.
-  const char* canon_url_str = GetCanonicalPath(library_url_str, url_str);
-  Dart_Handle canon_url = NewString(canon_url_str);
-  free(const_cast<char*>(canon_url_str));
-
-  return canon_url;
-}
-
-
 void* DartUtils::OpenFile(const char* name, bool write) {
   File* file = File::Open(name, write ? File::kWriteTruncate : File::kRead);
   return reinterpret_cast<void*>(file);
@@ -508,7 +476,7 @@
     if (tag == Dart_kImportTag) {
       // Handle imports of other built-in libraries present in the SDK.
       if (DartUtils::IsDartIOLibURL(url_string)) {
-        return Builtin::LoadAndCheckLibrary(Builtin::kIOLibrary);
+        return Builtin::LoadLibrary(url, Builtin::kIOLibrary);
       }
       return NewError("The built-in library '%s' is not available"
                       " on the stand-alone VM.\n", url_string);
@@ -568,11 +536,7 @@
     }
     const char* final_path = NULL;
     Dart_StringToCString(file_path, &final_path);
-    result = DartUtils::LoadSource(NULL,
-                                   library,
-                                   url,
-                                   tag,
-                                   final_path);
+    result = DartUtils::LoadSource(library, url, tag, final_path);
     return result;
   }
 }
@@ -670,21 +634,11 @@
 }
 
 
-Dart_Handle DartUtils::LoadSource(CommandLineOptions* url_mapping,
-                                  Dart_Handle library,
+Dart_Handle DartUtils::LoadSource(Dart_Handle library,
                                   Dart_Handle url,
                                   Dart_LibraryTag tag,
                                   const char* url_string) {
   bool is_http_scheme_url = DartUtils::IsHttpSchemeURL(url_string);
-  if (url_mapping != NULL && IsDartSchemeURL(url_string)) {
-    const char* mapped_url_string = MapLibraryUrl(url_mapping, url_string);
-    if (mapped_url_string == NULL) {
-      return NewError("Do not know how to load %s", url_string);
-    }
-    // We have a URL mapping specified, just read the file that the
-    // URL mapping specifies and load it.
-    url_string = mapped_url_string;
-  }
   Dart_Handle source;
   if (is_http_scheme_url) {
     // Read the file over http.
@@ -791,42 +745,6 @@
 }
 
 
-const char* DartUtils::GetCanonicalPath(const char* reference_dir,
-                                        const char* filename) {
-  if (File::IsAbsolutePath(filename)) {
-    return strdup(filename);
-  }
-
-  char* canonical_path = File::GetCanonicalPath(reference_dir);
-  if  (canonical_path == NULL) {
-    canonical_path = strdup(reference_dir);
-    ASSERT(canonical_path != NULL);
-  }
-  ASSERT(File::PathSeparator() != NULL && strlen(File::PathSeparator()) == 1);
-  char* path_sep = strrchr(canonical_path, File::PathSeparator()[0]);
-  if (path_sep == NULL) {
-    // No separator found: Reference is a file in local directory.
-    free(canonical_path);
-    return strdup(filename);
-  }
-  *path_sep = '\0';
-  intptr_t len = snprintf(NULL, 0, "%s%s%s",
-                          canonical_path, File::PathSeparator(), filename);
-  char* absolute_filename = reinterpret_cast<char*>(malloc(len + 1));
-  ASSERT(absolute_filename != NULL);
-
-  snprintf(absolute_filename, len + 1, "%s%s%s",
-           canonical_path, File::PathSeparator(), filename);
-  free(canonical_path);
-  canonical_path = File::GetCanonicalPath(absolute_filename);
-  if (canonical_path == NULL) {
-    return absolute_filename;
-  }
-  free(absolute_filename);
-  return canonical_path;
-}
-
-
 bool DartUtils::PostNull(Dart_Port port_id) {
   // Post a message with just the null object.
   return Dart_PostCObject(port_id, CObject::Null()->AsApiCObject());
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index f8e9999..25e549b 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -113,9 +113,6 @@
   static bool IsDartIOLibURL(const char* url_name);
   static bool IsDartBuiltinLibURL(const char* url_name);
   static bool IsHttpSchemeURL(const char* url_name);
-  static Dart_Handle CanonicalizeURL(CommandLineOptions* url_mapping,
-                                     Dart_Handle library,
-                                     const char* url_str);
   static void* OpenFile(const char* name, bool write);
   static void ReadFile(const uint8_t** data, intptr_t* file_len, void* stream);
   static void WriteFile(const void* buffer, intptr_t num_bytes, void* stream);
@@ -131,8 +128,7 @@
                                 Dart_Handle builtin_lib);
   static Dart_Handle LoadScriptHttp(Dart_Handle script_uri,
                                     Dart_Handle builtin_lib);
-  static Dart_Handle LoadSource(CommandLineOptions* url_mapping,
-                                Dart_Handle library,
+  static Dart_Handle LoadSource(Dart_Handle library,
                                 Dart_Handle url,
                                 Dart_LibraryTag tag,
                                 const char* filename);
@@ -223,9 +219,6 @@
   static uint8_t magic_number[];
 
  private:
-  static const char* GetCanonicalPath(const char* reference_dir,
-                                      const char* filename);
-
   DISALLOW_ALLOCATION();
   DISALLOW_IMPLICIT_CONSTRUCTORS(DartUtils);
 };
diff --git a/runtime/bin/dbg_connection.cc b/runtime/bin/dbg_connection.cc
index 0d92133..3695e2a 100644
--- a/runtime/bin/dbg_connection.cc
+++ b/runtime/bin/dbg_connection.cc
@@ -297,11 +297,18 @@
 }
 
 
+// The vm service relies on certain debugger functionality.
+void DebuggerConnectionHandler::InitForVmService() {
+  MonitorLocker ml(handler_lock_);
+  DbgMsgQueueList::Initialize();
+}
+
+
 int DebuggerConnectionHandler::StartHandler(const char* address,
                                             int port_number) {
   ASSERT(handler_lock_ != NULL);
   MonitorLocker ml(handler_lock_);
-  if (listener_fd_ != -1) {
+  if (IsListening()) {
     // The debugger connection handler was already started.
     return Socket::GetPort(listener_fd_);
   }
@@ -333,6 +340,11 @@
 void DebuggerConnectionHandler::WaitForConnection() {
   ASSERT(handler_lock_ != NULL);
   MonitorLocker ml(handler_lock_);
+  if (!IsListening()) {
+    // If we are only running the vm service, don't wait for
+    // connections.
+    return;
+  }
   while (!IsConnected()) {
     dart::Monitor::WaitResult res = ml.Wait();
     ASSERT(res == dart::Monitor::kNotified);
@@ -350,6 +362,11 @@
 void DebuggerConnectionHandler::BroadcastMsg(dart::TextBuffer* msg) {
   ASSERT(handler_lock_ != NULL);
   MonitorLocker ml(handler_lock_);
+  if (!IsListening()) {
+    // If we are only running the vm service, don't try to broadcast
+    // to debugger clients.
+    return;
+  }
   // TODO(asiva): Once we support connection to multiple debuggers
   // we need to send the message to all of them.
   ASSERT(singleton_handler != NULL);
diff --git a/runtime/bin/dbg_connection.h b/runtime/bin/dbg_connection.h
index 8fd0860..7efc3f2 100644
--- a/runtime/bin/dbg_connection.h
+++ b/runtime/bin/dbg_connection.h
@@ -51,6 +51,11 @@
   // from the client.
   static int StartHandler(const char* address, int port_number);
 
+  // Initializes the parts of the debugger which are needed by the vm
+  // service.  This function should only be called when StartHandler
+  // is not called.
+  static void InitForVmService();
+
   // Called by Isolates when they need to wait for a connection
   // from debugger clients.
   static void WaitForConnection();
@@ -99,6 +104,10 @@
   // a debugger to be attached when that is requested on the command line.
   static dart::Monitor* handler_lock_;
 
+  static bool IsListening() {
+    return listener_fd_ != -1;
+  }
+
   // The socket that is listening for incoming debugger connections.
   // This descriptor is created and closed by a native thread.
   static int listener_fd_;
diff --git a/runtime/bin/directory_win.cc b/runtime/bin/directory_win.cc
index ecfa7e9..e7cd895 100644
--- a/runtime/bin/directory_win.cc
+++ b/runtime/bin/directory_win.cc
@@ -302,32 +302,32 @@
   WIN32_FIND_DATAW find_file_data;
   HANDLE find_handle = FindFirstFileW(path->AsStringW(), &find_file_data);
 
-  // Adjust the path by removing the '*' used for the search.
-  int path_length = path->length() - 1;
-  path->Reset(path_length);
-
   if (find_handle == INVALID_HANDLE_VALUE) {
     return false;
   }
 
+  // Adjust the path by removing the '*' used for the search.
+  int path_length = path->length() - 1;
+  path->Reset(path_length);
+
   do {
     if (!DeleteEntry(&find_file_data, path)) {
-      DWORD last_error = GetLastError();
-      FindClose(find_handle);
-      SetLastError(last_error);
-      return false;
+      break;
     }
     path->Reset(path_length);  // DeleteEntry adds to the path.
   } while (FindNextFileW(find_handle, &find_file_data) != 0);
 
-  path->Reset(path_length - 1);  // Drop the "\" from the end of the path.
-  if ((GetLastError() != ERROR_NO_MORE_FILES) ||
-      (FindClose(find_handle) == 0) ||
-      (RemoveDirectoryW(path->AsStringW()) == 0)) {
+  DWORD last_error = GetLastError();
+  // Always close handle.
+  FindClose(find_handle);
+  if (last_error != ERROR_NO_MORE_FILES) {
+    // Unexpected error, set and return.
+    SetLastError(last_error);
     return false;
   }
-
-  return true;
+  // All content deleted succesfully, try to delete directory.
+  path->Reset(path_length - 1);  // Drop the "\" from the end of the path.
+  return RemoveDirectoryW(path->AsStringW()) != 0;
 }
 
 
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc
index fbc5623..3b12d94 100644
--- a/runtime/bin/eventhandler_win.cc
+++ b/runtime/bin/eventhandler_win.cc
@@ -344,8 +344,10 @@
   handle->set_last_error(WSAGetLastError());
   handle->MarkError();
   if (!handle->IsClosing()) {
-    int event_mask = 1 << kErrorEvent;
-    DartUtils::PostInt32(handle->port(), event_mask);
+    Dart_Port port = handle->port();
+    if (port != ILLEGAL_PORT) {
+      DartUtils::PostInt32(port, 1 << kErrorEvent);
+    }
   }
 }
 
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 9c0ab87..06f3884 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -351,8 +351,7 @@
     return file_path;
   }
 
-  return DartUtils::LoadSource(NULL,
-                               library,
+  return DartUtils::LoadSource(library,
                                url,
                                tag,
                                DartUtils::GetStringValue(file_path));
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 8cba49d..4ae0c26 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -943,7 +943,7 @@
 
   if (!DartUtils::SetOriginalWorkingDirectory()) {
     OSError err;
-    fprintf(stderr, "Error determinig current directory: %s\n", err.message());
+    fprintf(stderr, "Error determining current directory: %s\n", err.message());
     fflush(stderr);
     exit(kErrorExitCode);
   }
@@ -979,6 +979,9 @@
   ASSERT(Dart_CurrentIsolate() == NULL);
   // Start the VM service isolate, if necessary.
   if (start_vm_service) {
+    if (!start_debugger) {
+      DebuggerConnectionHandler::InitForVmService();
+    }
     ASSERT(vm_service_server_ip != NULL && vm_service_server_port >= 0);
     bool r = VmService::Start(vm_service_server_ip , vm_service_server_port);
     if (!r) {
diff --git a/runtime/bin/process.h b/runtime/bin/process.h
index 154347d..618256d 100644
--- a/runtime/bin/process.h
+++ b/runtime/bin/process.h
@@ -138,7 +138,7 @@
 
 class SignalInfo {
  public:
-  SignalInfo(int fd, int signal, SignalInfo* next = NULL)
+  SignalInfo(int fd, int signal, SignalInfo* next)
       : fd_(fd),
         signal_(signal),
         // SignalInfo is expected to be created when in a isolate.
diff --git a/runtime/bin/resources_sources.gypi b/runtime/bin/resources_sources.gypi
index 46c3888..e8f1529 100644
--- a/runtime/bin/resources_sources.gypi
+++ b/runtime/bin/resources_sources.gypi
@@ -16,6 +16,7 @@
     'vmservice/client/deployed/web/packages/mutation_observer/mutation_observer.js',
     'vmservice/client/deployed/web/packages/mutation_observer/mutation_observer.min.js',
     'vmservice/client/deployed/web/packages/observatory/elements.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html',
     'vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html',
     'vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html',
     'vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html',
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index dee1033..425434f 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -10,7 +10,156 @@
   <script src="index.html_bootstrap.dart.js"></script>
   
 </head>
-<body><polymer-element name="observatory-element">
+<body><polymer-element name="curly-block">
+  <template>
+    <style>
+      .idle {
+        display: inline-block;
+        color: #0489c3;
+        cursor: pointer;
+      }
+      .busy {
+        display: inline-block;
+        color: white;
+        cursor: wait;
+      }
+    </style>
+    <template if="{{ expanded }}">
+      <template if="{{ busy }}">
+        {<div class="busy">&nbsp;&nbsp;⊟&nbsp;&nbsp;</div>
+        <br>
+        <content></content>
+        }
+      </template>
+      <template if="{{ !busy }}">
+        {<a on-click="{{ toggleExpand }}"><div class="idle">&nbsp;&nbsp;⊟&nbsp;&nbsp;</div></a>
+        <br>
+        <content></content>
+        }
+      </template>
+    </template>
+
+    <template if="{{ !expanded }}">
+      <template if="{{ busy }}">
+        {<div class="busy">&nbsp;&nbsp;⊞&nbsp;&nbsp;</div>}
+      </template>
+      <template if="{{ !busy }}">
+        {<a on-click="{{ toggleExpand }}"><div class="idle">&nbsp;&nbsp;⊞&nbsp;&nbsp;</div></a>}
+      </template>
+    </template>
+  </template>
+  
+</polymer-element>
+<polymer-element name="observatory-element">
+  
+</polymer-element>
+<polymer-element name="service-ref" extends="observatory-element">
+  
+</polymer-element><polymer-element name="instance-ref" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <style>
+      .errorBox {
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: pre;
+      }
+    </style>
+    <span>
+      <template if="{{ isError(ref.serviceType) }}">
+        <pre class="errorBox">{{ ref.message }}</pre>
+      </template>
+
+      <template if="{{ isUnexpected(ref.serviceType) }}">
+        unexpected reference type &lt;{{ ref.serviceType }}&gt;
+      </template>
+
+      <template if="{{ isNull(ref.serviceType) }}">
+        <div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
+      </template>
+
+      <template if="{{ (isString(ref.serviceType) ||
+                        isBool(ref.serviceType) ||
+                        isInt(ref.serviceType)) ||
+                        isDouble(ref.serviceType)) }}">
+        <a href="{{ url }}">{{ ref['valueAsString'] }}</a>
+      </template>
+
+      <template if="{{ (isType(ref.serviceType)) }}">
+        <a href="{{ url }}">{{ ref['user_name'] }}</a>
+      </template>
+
+      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
+                       ref['closureFunc'] != null}}">
+        <a href="{{ url }}">
+          <!-- TODO(turnidge): Switch this to fully-qualified function -->
+          {{ ref['closureFunc']['user_name'] }}
+        </a>
+      </template>
+
+      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
+                       ref['closureFunc'] == null}}">
+        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
+        <curly-block callback="{{ expander() }}">
+          <div class="memberList">
+            <template repeat="{{ field in ref['fields'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  {{ field['decl']['user_name'] }}
+                </div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block>
+      </template>
+
+      <template if="{{ isList(ref.serviceType) }}">
+        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
+        <curly-block callback="{{ expander() }}">
+          <div class="memberList">
+            <template repeat="{{ element in ref['elements'] }}">
+              <div class="memberItem">
+                <div class="memberName">[{{ element['index']}}]</div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block>
+      </template>
+    </span>
+  </template>
+  
+</polymer-element>
+<polymer-element name="action-link">
+  <template>
+    <style>
+      .idle {
+        color: #0489c3;
+        cursor: pointer;
+      }
+      .busy {
+        color: #aaa;
+        cursor: wait;
+      }
+    </style>
+
+    <template if="{{ busy }}">
+      <span class="busy">[{{ label }}]</span>
+    </template>
+    <template if="{{ !busy }}">
+      <span class="idle"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+    </template>
+
+  </template>
   
 </polymer-element>
 <polymer-element name="nav-bar" extends="observatory-element">
@@ -91,7 +240,8 @@
       }
     </style>
 
-    <li class="menu"><a href="{{ link }}">{{ anchor }}</a>
+    <li class="menu">
+      <a href="{{ link }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
     <template if="{{ !last }}">
@@ -239,138 +389,12 @@
   </template>
   
 </polymer-element>
-<polymer-element name="service-ref" extends="observatory-element">
-  
-</polymer-element><polymer-element name="class-ref" extends="service-ref">
+<polymer-element name="class-ref" extends="service-ref">
 
 <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
 
 </polymer-element>
-<polymer-element name="curly-block">
-  <template>
-    <style>
-      .idle {
-        display: inline-block;
-        color: #0489c3;
-        cursor: pointer;
-      }
-      .busy {
-        display: inline-block;
-        color: white;
-        cursor: wait;
-      }
-    </style>
-    <template if="{{ expanded }}">
-      <template if="{{ busy }}">
-        {<div class="busy">&nbsp;&nbsp;⊟&nbsp;&nbsp;</div>
-        <br>
-        <content></content>
-        }
-      </template>
-      <template if="{{ !busy }}">
-        {<a on-click="{{ toggleExpand }}"><div class="idle">&nbsp;&nbsp;⊟&nbsp;&nbsp;</div></a>
-        <br>
-        <content></content>
-        }
-      </template>
-    </template>
-
-    <template if="{{ !expanded }}">
-      <template if="{{ busy }}">
-        {<div class="busy">&nbsp;&nbsp;⊞&nbsp;&nbsp;</div>}
-      </template>
-      <template if="{{ !busy }}">
-        {<a on-click="{{ toggleExpand }}"><div class="idle">&nbsp;&nbsp;⊞&nbsp;&nbsp;</div></a>}
-      </template>
-    </template>
-  </template>
-  
-</polymer-element>
-<polymer-element name="instance-ref" extends="service-ref">
-  <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
-    <style>
-      .errorBox {
-        background-color: #f5f5f5;
-        border: 1px solid #ccc;
-        padding: 10px;
-        font-family: consolas, courier, monospace;
-        font-size: 1em;
-        line-height: 1.2em;
-        white-space: pre;
-      }
-    </style>
-    <span>
-      <template if="{{ isError(ref.serviceType) }}">
-        <pre class="errorBox">{{ ref.message }}</pre>
-      </template>
-
-      <template if="{{ isUnexpected(ref.serviceType) }}">
-        unexpected reference type &lt;{{ ref.serviceType }}&gt;
-      </template>
-
-      <template if="{{ isNull(ref.serviceType) }}">
-        <div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
-      </template>
-
-      <template if="{{ (isString(ref.serviceType) ||
-                        isBool(ref.serviceType) ||
-                        isInt(ref.serviceType)) ||
-                        isDouble(ref.serviceType)) }}">
-        <a href="{{ url }}">{{ ref['valueAsString'] }}</a>
-      </template>
-
-      <template if="{{ (isType(ref.serviceType)) }}">
-        <a href="{{ url }}">{{ ref['user_name'] }}</a>
-      </template>
-
-      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
-                       ref['closureFunc'] != null}}">
-        <a href="{{ url }}">
-          <!-- TODO(turnidge): Switch this to fully-qualified function -->
-          {{ ref['closureFunc']['user_name'] }}
-        </a>
-      </template>
-
-      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
-                       ref['closureFunc'] == null}}">
-        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
-        <curly-block callback="{{ expander() }}">
-          <div class="memberList">
-            <template repeat="{{ field in ref['fields'] }}">
-              <div class="memberItem">
-                <div class="memberName">
-                  {{ field['decl']['user_name'] }}
-                </div>
-                <div class="memberValue">
-                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
-                </div>
-              </div>
-            </template>
-          </div>
-        </curly-block>
-      </template>
-
-      <template if="{{ isList(ref.serviceType) }}">
-        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
-        <curly-block callback="{{ expander() }}">
-          <div class="memberList">
-            <template repeat="{{ element in ref['elements'] }}">
-              <div class="memberItem">
-                <div class="memberName">[{{ element['index']}}]</div>
-                <div class="memberValue">
-                  <instance-ref ref="{{ element['value'] }}"></instance-ref>
-                </div>
-              </div>
-            </template>
-          </div>
-        </curly-block>
-      </template>
-    </span>
-  </template>
-  
-</polymer-element>
 <polymer-element name="eval-box" extends="observatory-element">
   <template>
     <style>
@@ -1149,64 +1173,173 @@
 <polymer-element name="isolate-summary" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
-    <style>
-      .counters {
-        display: flex;
-        flex-direction: row;
-        justify-content: center;
-      }
-      .counter {
-        margin: 10px;
-      }
-    </style>
     <div class="flex-row">
-      <div class="flex-item-fixed-1-12"><img src="packages/observatory/src/elements/img/isolate_icon.png"></div>
-      <div class="flex-item-fixed-1-12">{{ isolate.mainPort }}</div>
-      <div class="flex-item-fixed-4-12">
-        <div class="flex-row">
-          <isolate-ref ref="{{ isolate }}"></isolate-ref>
-        </div>
-        <div class="flex-row">
-          <small>
-            (<a href="{{ isolate.rootLib.hashLink }}">library</a>)
-            (<a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>)
-            (<a href="{{ isolate.relativeHashLink('profile') }}">profile</a>)
-          </small>
-        </div>
+      <div class="flex-item-10-percent">
+        <img src="packages/observatory/src/elements/img/isolate_icon.png">
       </div>
-
-      <div class="flex-item-fixed-2-12">
-        <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
-          {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
-        </a>
-        ( <a href="{{ isolate.relativeHashLink('heapmap') }}">map</a> )
+      <div class="flex-item-10-percent">
+        <isolate-ref ref="{{ isolate }}"></isolate-ref>
       </div>
-      <div class="flex-item-fixed-2-12">
-        <template if="{{ isolate.topFrame == null }}">
-          idle
-        </template>
-        <template if="{{ isolate.topFrame != null }}">
-          run
-        </template>
-        ( <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a> )
+      <div class="flex-item-20-percent">
+        <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
+      </div>
+      <div class="flex-item-50-percent">
+        <isolate-location isolate="{{ isolate }}"></isolate-location>
+      </div>
+      <div class="flex-item-10-percent">
       </div>
     </div>
 
-    <div class="counters">
-      <template repeat="{{ key in isolate.counters.keys }}">
-        <div class="counter">{{ key }} ({{ isolate.counters[key] }})</div>
-      </template>
+    <div class="flex-row">
+      <div class="flex-item-20-percent"></div>
+      <div class="flex-item-60-percent">
+        <hr>
+      </div>
+      <div class="flex-item-20-percent"></div>
     </div>
 
-    <template if="{{ isolate.topFrame != null }}">
-      <script-inset script="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}">
-        <function-ref ref="{{ isolate.topFrame['function'] }}"></function-ref>
-        (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
-      </script-inset>
+    <isolate-shared-summary isolate="{{ isolate }}"></isolate-shared-summary>
+
+  </template>
+</polymer-element>
+
+<polymer-element name="isolate-run-state" extends="observatory-element">
+  <template>
+    <template if="{{ isolate.pauseEvent != null }}">
+      <strong>paused</strong>
+      <action-link callback="{{ resume }}" label="resume"></action-link>
+    </template>
+
+    <template if="{{ isolate.running }}">
+      <strong>running</strong>
+      <action-link callback="{{ pause }}" label="pause"></action-link>
+    </template>
+
+    <template if="{{ isolate.idle }}">
+      <strong>idle</strong>
+    </template>
+
+    <template if="{{ isolate.loading }}">
+      <strong>loading...</strong>
     </template>
   </template>
-  
 </polymer-element>
+
+<polymer-element name="isolate-location" extends="observatory-element">
+  <template>
+    <template if="{{ isolate.pauseEvent != null }}">
+      <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateCreated' }}">
+        at isolate start
+      </template>
+      <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateShutdown' }}">
+        at isolate exit
+      </template>
+      <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateInterrupted' }}">
+        at
+        <function-ref ref="{{ isolate.topFrame['function'] }}">
+        </function-ref>
+        (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+      </template>
+      <template if="{{ isolate.pauseEvent['eventType'] == 'BreakpointReached' }}">
+        at breakpoint {{ isolate.pauseEvent['breakpoint']['id'] }}
+        <function-ref ref="{{ isolate.topFrame['function'] }}">
+        </function-ref>
+        (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+      </template>
+    </template>
+
+    <template if="{{ isolate.running }}">
+      at
+      <function-ref ref="{{ isolate.topFrame['function'] }}">
+      </function-ref>
+      (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+    </template>
+
+  </template>
+</polymer-element>
+
+<polymer-element name="isolate-shared-summary" extends="observatory-element">
+  <template>
+    <style>
+      .errorBox {
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: pre;
+      }
+    </style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <template if="{{ isolate.error != null }}">
+      <div class="content-centered">
+        <pre class="errorBox">{{ isolate.error.message }}</pre>
+        <br>
+      </div>
+    </template>
+    <div class="flex-row">
+      <div class="flex-item-10-percent">
+      </div>
+      <div class="flex-item-40-percent">
+        <isolate-counter-chart counters="{{ isolate.counters }}"></isolate-counter-chart>
+      </div>
+      <div class="flex-item-40-percent">
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberName">new heap</div>
+              <div class="memberValue">
+                {{ isolate.newHeapUsed | formatSize }}
+                of
+                {{ isolate.newHeapCapacity | formatSize }}
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberName">old heap</div>
+              <div class="memberValue">
+                {{ isolate.oldHeapUsed | formatSize }}
+                of
+                {{ isolate.oldHeapCapacity | formatSize }}
+              </div>
+            </div>
+          </div>
+          <br>
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+            </div>
+          </div>
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+              </div>
+            </div>
+          </div>
+      </div>
+      <div class="flex-item-10-percent">
+      </div>
+    </div>
+  </template>
+</polymer-element>
+
+<polymer-element name="isolate-counter-chart" extends="observatory-element">
+  <template>
+    <div id="counterPieChart" style="height: 200px"></div>
+  </template>
+</polymer-element>
+
+
 <polymer-element name="isolate-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
@@ -1229,85 +1362,48 @@
 
     <div class="content">
       <h1>isolate '{{ isolate.name }}'</h1>
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberName">status</div>
-          <div class="memberValue">
-            <template if="{{ isolate.pausedOnStart }}">
-              <strong style="color:darkred;">paused</strong> @ isolate start
-              <span style="padding-left:20px;">
-                [<a on-click="{{ resume }}">resume</a>]
-              </span>
-            </template>
-
-            <template if="{{ isolate.pausedOnExit }}">
-              <strong style="color:darkred;">paused</strong> @ isolate exit
-              <span style="padding-left:20px;">
-                [<a on-click="{{ resume }}">resume</a>]
-              </span>
-            </template>
-
-            <template if="{{ isolate.running }}">
-              <strong>running</strong>
-              @
-              <function-ref ref="{{ isolate.topFrame['function'] }}">
-              </function-ref>
-              (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}">
-              </script-ref>)
-            </template>
-
-            <template if="{{ isolate.idle }}">
-              <strong>idle</strong>
-            </template>
-          </div>
-        </div>
-      </div>
     </div>
 
-    <template if="{{ isolate.error != null }}">
-      <div class="content">
-        <h1>Error</h1>
-        <div class="memberList">
-          <div class="memberItem">
-            <div class="memberName">message</div>
-            <div class="memberValue">
-              <pre>{{ isolate.error.message }}</pre>
-            </div>
-          </div>
-          <div class="memberItem">
-            <template if="{{ isolate.error.exception != null }}">
-              <div class="memberName">exception</div>
-              <div class="memberValue">
-                <instance-ref ref="{{ isolate.error.exception }}"></instance-ref>
-              </div>
-            </template>
-          </div>
-          <div class="memberItem">
-            <template if="{{ isolate.error.stacktrace != null }}">
-            <div class="memberName">stacktrace</div>
-            <div class="memberValue">
-              <instance-ref ref="{{ isolate.error.stacktrace }}"></instance-ref>
-            </div>
-            </template>
-          </div>
-        </div>
+    <br>
+    <div class="flex-row">
+      <div class="flex-item-10-percent">
       </div>
-      <hr>
-    </template>
-
+      <div class="flex-item-20-percent">
+        <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
+      </div>
+      <div class="flex-item-60-percent">
+        <isolate-location isolate="{{ isolate }}"></isolate-location>
+      </div>
+      <div class="flex-item-10-percent">
+      </div>
+    </div>
     <br>
 
     <template if="{{ isolate.topFrame != null }}">
+      <br>
       <script-inset script="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}">
       </script-inset>
     </template>
 
+    <div class="flex-row">
+      <div class="flex-item-20-percent"></div>
+      <div class="flex-item-60-percent"><hr></div>
+      <div class="flex-item-20-percent"></div>
+    </div>
+
     <br>
 
+    <isolate-shared-summary isolate="{{ isolate }}"></isolate-shared-summary>
+
+    <div class="flex-row">
+      <div class="flex-item-20-percent"></div>
+      <div class="flex-item-60-percent"><hr></div>
+      <div class="flex-item-20-percent"></div>
+    </div>
+
     <div class="content-centered">
       <div class="flex-row">
-
-        <div class="flex-item-fixed-6-12">
+        <div class="flex-item-50-percent">
           <div class="memberList">
             <div class="memberItem">
               <div class="memberName">root library</div>
@@ -1324,65 +1420,20 @@
               </template>
             </div>
             <div class="memberItem">
-              <div class="memberName">id</div>
+              <div class="memberName">isolate id</div>
               <div class="memberValue">{{ isolate.mainPort }}</div>
             </div>
-            <br>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
-
-              </div>
+          </div>
+        </div>
+        <div class="flex-item-50-percent">
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
             </div>
           </div>
         </div>
-
-        <div class="flex-item-fixed-6-12">
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberName">new heap</div>
-              <div class="memberValue">
-                {{ isolate.newHeapUsed | formatSize }}
-                of
-                {{ isolate.newHeapCapacity | formatSize }}
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberName">old heap</div>
-              <div class="memberValue">
-                {{ isolate.oldHeapUsed | formatSize }}
-                of
-                {{ isolate.oldHeapCapacity | formatSize }}
-              </div>
-            </div>
-          </div>
-          <br>
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
-              </div>
-            </div>
-          </div>
-        </div>
-
-      </div> <!-- flex row -->
-    </div> <!-- content -->
+      </div>
+    </div>
 
     <hr>
 
@@ -1404,13 +1455,6 @@
     <hr>
 
     <div class="content">
-      <div class="memberValue">Isolate execution</div>
-      <template repeat="{{ key in isolate.counters.keys }}">
-        <div class="memberValue">{{ key }} ({{ isolate.counters[key] }})</div>
-      </template>
-    </div>
-
-    <div class="content">
       <div id="tagProfileChart" class="miniProfileChart" style="height: 600px"></div>
     </div>
 
@@ -2087,6 +2131,7 @@
 </polymer-element>
 <polymer-element name="script-view" extends="observatory-element">
 <template>
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
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 87017fc..18e2653 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
@@ -53,7 +53,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDD:"classes",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJJ:"imports",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gMz:"__$pad",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPl:"__$busy",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXR:"scripts",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ3:"variables",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gmu:"functions",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goM:"__$expand",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",VnP:"hitStyleNotExecuted",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function(a){"use strict"
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDD:"classes",gDe:"__$function",gDu:"exclusiveTicks",gE1:"__$counters",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJJ:"imports",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gKW:"__$label",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gMz:"__$pad",gNT:"__$refreshTime",gNo:"__$uncheckedText",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXR:"scripts",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ3:"variables",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdB:"__$callback",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",gfi:"__$busy",ghX:"__$endPos",ghi:"_fragmentationCanvas",giF:"chart",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gmu:"functions",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goM:"__$expand",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",VnP:"hitStyleNotExecuted",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function(a){"use strict"
 function map(b){b={x:b}
 delete b.x
 return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
@@ -154,9 +154,9 @@
 HT:{
 "^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
 "^":"",
-x:function(a){return void 0},
-Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-ks:function(a){var z,y,x,w
+x:[function(a){return void 0},"$1","Ue",2,0,null,6,[]],
+Qu:[function(a,b,c,d){return{i:a,p:b,e:c,x:d}},"$4","yC",8,0,null,7,[],8,[],9,[],10,[]],
+ks:[function(a){var z,y,x,w
 z=a[init.dispatchPropertyName]
 if(z==null)if($.Bv==null){H.XD()
 z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
@@ -167,54 +167,57 @@
 if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.w3(a)
 if(w==null){y=Object.getPrototypeOf(a)
 if(y==null||y===Object.prototype)return C.ZQ
-else return C.vB}return w},
-e1:function(a){var z,y,x,w
+else return C.vB}return w},"$1","mz",2,0,null,6,[]],
+e1:[function(a){var z,y,x,w
 z=$.Au
 if(z==null)return
 y=z
 for(z=y.length,x=J.x(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
-if(x.n(a,y[w]))return w}return},
-Xr:function(a){var z,y,x
+if(x.n(a,y[w]))return w}return},"$1","kC",2,0,null,11,[]],
+Xr:[function(a){var z,y,x
 z=J.e1(a)
 if(z==null)return
 y=$.Au
 x=z+1
 if(x>=y.length)return H.e(y,x)
-return y[x]},
-Nq:function(a,b){var z,y,x
+return y[x]},"$1","Tj",2,0,null,11,[]],
+Nq:[function(a,b){var z,y,x
 z=J.e1(a)
 if(z==null)return
 y=$.Au
 x=z+2
 if(x>=y.length)return H.e(y,x)
-return y[x][b]},
+return y[x][b]},"$2","BJ",4,0,null,11,[],12,[]],
 Gv:{
 "^":"a;",
 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,74,[]],
+T:function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},
+gbx:function(a){return new H.cu(H.dJ(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
-yEe:{
-"^":"Gv;",
+kn:{
+"^":"bool/Gv;",
 bu:function(a){return String(a)},
 giO:function(a){return a?519018:218159},
-$isa2:true},
+gbx:function(a){return C.HL},
+$isbool:true},
 Jh:{
-"^":"Gv;",
+"^":"Null/Gv;",
 n:function(a,b){return null==b},
 bu:function(a){return"null"},
 giO:function(a){return 0},
-T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,74,[]]},
+gbx:function(a){return C.Qf}},
 Ue1:{
 "^":"Gv;",
-giO:function(a){return 0}},
+giO:function(a){return 0},
+gbx:function(a){return C.CS}},
 FP:{
 "^":"Ue1;"},
 is:{
 "^":"Ue1;"},
 Q:{
-"^":"Gv;",
+"^":"List/Gv;",
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
 a.push(b)},
 KI:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
@@ -230,12 +233,12 @@
 for(z=0;z<a.length;++z)if(J.de(a[z],b)){a.splice(z,1)
 return!0}return!1},
 ev:function(a,b){return H.VM(new H.U5(a,b),[null])},
-Ft:[function(a,b){return H.VM(new H.kV(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")}],
+Ft:[function(a,b){return H.VM(new H.kV(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},128,[]],
 FV:function(a,b){var z
 for(z=J.GP(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
 aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")}],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},128,[]],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -308,9 +311,9 @@
 if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
 a[b]=c},
-$isQ:true,
-$iszM:true,
-$aszM:null,
+$isList:true,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -324,11 +327,11 @@
 $isnM:true},
 iY:{
 "^":"nM;"},
-Ib:{
+H6:{
 "^":"nM;",
-$isIb:true},
+$isH6:true},
 P:{
-"^":"Gv;",
+"^":"num/Gv;",
 iM:function(a,b){var z
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a<b)return-1
@@ -403,25 +406,27 @@
 return a<=b},
 F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return a>=b},
-$islf:true,
-static:{"^":"SAz,yc"}},
-imn:{
-"^":"P;",
-$isCP:true,
-$islf:true,
-$isKN:true},
+$isnum:true,
+static:{"^":"SAz,N6l"}},
+bU:{
+"^":"int/P;",
+gbx:function(a){return C.yw},
+$isdouble:true,
+$isnum:true,
+$isint:true},
 Pp:{
-"^":"P;",
-$isCP:true,
-$islf:true},
+"^":"double/P;",
+gbx:function(a){return C.O4},
+$isdouble:true,
+$isnum:true},
 x1:{
-"^":"imn;"},
+"^":"bU;"},
 VP:{
 "^":"x1;"},
 qa:{
 "^":"VP;"},
 O:{
-"^":"Gv;",
+"^":"String/Gv;",
 j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
@@ -518,27 +523,28 @@
 y^=y>>6}y=536870911&y+((67108863&y)<<3>>>0)
 y^=y>>11
 return 536870911&y+((16383&y)<<15>>>0)},
+gbx:function(a){return C.Db},
 gB:function(a){return a.length},
 t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
 return a[b]},
-$isqU:true,
-static:{Ga:function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
+$isString:true,
+static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},mm:function(a,b){var z,y
+default:return!1}},"$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
 for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
 y=a.charCodeAt(b)
-if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},r9:function(a,b){var z,y,x
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
 for(z=a.length;b>0;b=y){y=b-1
 if(y>=z)H.vh(P.N(y))
 x=a.charCodeAt(y)
-if(x!==32&&x!==13&&!J.Ga(x))break}return b}}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+if(x!==32&&x!==13&&!J.Ga(x))break}return b},"$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
 "^":"",
-zd:function(a,b){var z=a.vV(0,b)
+zd:[function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
-return z},
-ox:function(){--init.globalState.Xz.GL},
-oT:function(a,b){var z,y,x,w,v,u
+return z},"$2","RTQ",4,0,null,16,[],17,[]],
+ox:[function(){--init.globalState.Xz.GL},"$0","q4",0,0,null],
+oT:[function(a,b){var z,y,x,w,v,u
 z={}
 z.a=b
 b=b
@@ -546,14 +552,14 @@
 if(b==null){b=[]
 z.a=b
 y=b}else y=b
-if(!J.x(y).$iszM)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
+if(!J.x(y).$isList)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
 y=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
 y.i6(a)
 init.globalState=y
 if(init.globalState.EF===!0)return
 y=init.globalState.Hg++
-x=P.L5(null,null,null,P.KN,H.yo)
-w=P.Ls(null,null,null,P.KN)
+x=P.L5(null,null,null,J.bU,H.yo)
+w=P.Ls(null,null,null,J.bU)
 v=new H.yo(0,null,!1)
 u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
 w.h(0,0)
@@ -565,21 +571,21 @@
 if(x)u.vV(0,new H.PK(z,a))
 else{y=H.KT(y,[y,y]).BD(a)
 if(y)u.vV(0,new H.JO(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},
-yl:function(){var z=init.currentScript
+else u.vV(0,a)}init.globalState.Xz.bL()},"$2","wr",4,0,null,18,[],19,[]],
+yl:[function(){var z=init.currentScript
 if(z!=null)return String(z.src)
 if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.fU()
 if(typeof version=="function"&&typeof system=="function")return thisFilename()
 if(init.globalState.EF===!0)return H.fU()
-return},
-fU:function(){var z,y
+return},"$0","dY",0,0,null],
+fU:[function(){var z,y
 z=new Error().stack
 if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
 if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
 if(y!=null)return y[1]
 y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
 if(y!=null)return y[1]
-throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
+throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},"$0","mZ",0,0,null],
 Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=H.Hh(b.data)
 y=J.U6(z)
@@ -592,8 +598,8 @@
 s=y.t(z,"startPaused")
 r=H.Hh(y.t(z,"replyTo"))
 y=init.globalState.Hg++
-q=P.L5(null,null,null,P.KN,H.yo)
-p=P.Ls(null,null,null,P.KN)
+q=P.L5(null,null,null,J.bU,H.yo)
+p=P.Ls(null,null,null,J.bU)
 o=new H.yo(0,null,!1)
 n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
 p.h(0,0)
@@ -631,15 +637,15 @@
 y.toString
 self.postMessage(q)}else P.JS(y.t(z,"msg"))
 break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,6,[],7,[]],
-ZF:function(a){var z,y,x,w
+case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,20,[],21,[]],
+ZF:[function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.vd
 x=H.Gy(P.EF(["command","log","msg",a],null,null))
 y.toString
 self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
 z=new H.XO(w,null)
-throw H.b(P.FM(z))}},
-Ws:function(a,b,c,d,e,f){var z,y,x,w
+throw H.b(P.FM(z))}},"$1","eR",2,0,null,22,[]],
+Ws:[function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
 $.te=$.te+("_"+y)
@@ -650,24 +656,24 @@
 J.Sq(f,["spawned",new H.Z6(y,x),w,z.PX])
 x=new H.Vg(a,b,c,d)
 if(e===!0){z.v8(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},
-Gy:function(a){var z
+init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},"$6","op",12,0,null,23,[],19,[],24,[],25,[],26,[],27,[]],
+Gy:[function(a){var z
 if(init.globalState.ji===!0){z=new H.NA(0,new H.X1())
 z.il=new H.fP(null)
 return z.h7(a)}else{z=new H.NO(new H.X1())
 z.il=new H.fP(null)
-return z.h7(a)}},
-Hh:function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},
-VO: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"},
+return z.h7(a)}},"$1","YH",2,0,null,24,[]],
+Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
+else return a},"$1","m6",2,0,null,24,[]],
+VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","lF",2,0,null,28,[]],
+ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","dD",2,0,null,28,[]],
 PK:{
-"^":"Tp:22;a,b",
-$0:function(){this.b.$1(this.a.a)},
+"^":"Tp:115;a,b",
+$0:[function(){this.b.$1(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 JO:{
-"^":"Tp:22;a,c",
-$0:function(){this.c.$2(this.a.a,null)},
+"^":"Tp:115;a,c",
+$0:[function(){this.c.$2(this.a.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 f0:{
 "^":"a;Hg,oL,hJ,N0,Nr,Xz,vu,EF,ji,i2<,vd,XC,w2<",
@@ -681,8 +687,8 @@
 this.ji=y
 this.vu=z&&!x
 this.Xz=new H.cC(P.NZ(null,H.IY),0)
-this.i2=P.L5(null,null,null,P.KN,H.aX)
-this.XC=P.L5(null,null,null,P.KN,null)
+this.i2=P.L5(null,null,null,J.bU,H.aX)
+this.XC=P.L5(null,null,null,J.bU,null)
 if(this.EF===!0){z=new H.JH()
 this.vd=z
 w=function(b,c){return function(d){b(c,d)}}(H.Mg,z)
@@ -779,10 +785,10 @@
 init.globalState.i2.Rz(0,this.jO)
 z=this.Jp
 if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)
-this.Jp=null}},"$0","gQb",0,0,21],
+this.Jp=null}},"$0","gQb",0,0,126],
 $isaX:true},
 NY:{
-"^":"Tp:21;a",
+"^":"Tp:126;a",
 $0:[function(){J.Sq(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
@@ -811,23 +817,23 @@
 w.toString
 self.postMessage(v)}}},
 RA:{
-"^":"Tp:21;a",
+"^":"Tp:126;a",
 $0:[function(){if(!this.a.xB())return
 P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;F1*,i3,G1*",
 VU:function(){if(this.F1.gRW()){this.F1.gC9().push(this)
-return}J.nG(this.F1,this.i3)},
+return}J.yn(this.F1,this.i3)},
 $isIY:true},
 JH:{
 "^":"a;"},
 jl:{
-"^":"Tp:22;a,b,c,d,e,f",
+"^":"Tp:115;a,b,c,d,e,f",
 $0:[function(){H.Ws(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Vg:{
-"^":"Tp:21;a,b,c,d",
+"^":"Tp:126;a,b,c,d",
 $0:[function(){var z,y,x
 if(this.d!==!0)this.a.$1(this.c)
 else{z=this.a
@@ -865,7 +871,7 @@
 $isbC:true,
 $ishq:true},
 Ua:{
-"^":"Tp:22;a,b,c",
+"^":"Tp:115;a,b,c",
 $0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
@@ -881,8 +887,8 @@
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},
 giO:function(a){var z,y,x
-z=J.c1(this.hQ,16)
-y=J.c1(this.Jz,8)
+z=J.Eh(this.hQ,16)
+y=J.Eh(this.Jz,8)
 x=this.bv
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
@@ -922,7 +928,7 @@
 yf:function(a){if(!!a.$isku)return new H.ku(a.ng)
 throw H.b("Capability not serializable: "+a.bu(0))}},
 II:{
-"^":"lY;RZ",
+"^":"Xb;RZ",
 Vf:function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.t(a,1)
@@ -960,7 +966,7 @@
 I8:function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
-if(!!z.$iszM)return this.wb(a)
+if(!!z.$isList)return this.wb(a)
 if(!!z.$isZ0)return this.TI(a)
 if(!!z.$isbC)return this.DE(a)
 if(!!z.$ishq)return this.yf(a)
@@ -994,9 +1000,9 @@
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
 OW:{
-"^":"Tp:75;a,b",
-$2:function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},
+"^":"Tp:300;a,b",
+$2:[function(a,b){var z=this.b
+J.kW(this.a.a,z.I8(a),z.I8(b))},"$2",null,4,0,null,49,[],299,[],"call"],
 $isEH:true},
 Tf:{
 "^":"BB;",
@@ -1025,7 +1031,7 @@
 x[w]=v}return x},
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
-lY:{
+Xb:{
 "^":"a;",
 QS:function(a){if(H.ZR(a))return a
 this.RZ=P.Py(null,null,null,null,null)
@@ -1088,12 +1094,12 @@
 z.Qa(a,b)
 return z}}},
 FA:{
-"^":"Tp:21;a,b",
+"^":"Tp:126;a,b",
 $0:[function(){this.a.p9=null
 this.b.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 Av:{
-"^":"Tp:21;c,d",
+"^":"Tp:126;c,d",
 $0:[function(){this.c.p9=null
 H.ox()
 this.d.$0()},"$0",null,0,0,null,"call"],
@@ -1120,23 +1126,23 @@
 $isku:true,
 $ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
-wV:function(a,b){var z
+wV:[function(a,b){var z
 if(b!=null){z=b.x
-if(z!=null)return z}return!!J.x(a).$isXj},
-d:function(a){var z
+if(z!=null)return z}return!!J.x(a).$isXj},"$2","b3",4,0,null,6,[],29,[]],
+d:[function(a){var z
 if(typeof a==="string")return a
 if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
 else if(!1===a)return"false"
 else if(a==null)return"null"
 z=J.AG(a)
 if(typeof z!=="string")throw H.b(P.u(a))
-return z},
-Hz:function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},
-eQ:function(a){var z=a.$identityHash
+return z},"$1","Sa",2,0,null,30,[]],
+Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"$1","c7",2,0,null,31,[]],
+eQ:[function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
-a.$identityHash=z}return z},
-vx:[function(a){throw H.b(P.cD(a))},"$1","Rm",2,0,8],
-BU:function(a,b,c){var z,y,x,w,v,u
+a.$identityHash=z}return z},"$1","Y0",2,0,null,6,[]],
+vx:[function(a){throw H.b(P.cD(a))},"$1","Rm",2,0,32,14,[]],
+BU:[function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.Rm()
 if(typeof a!=="string")H.vh(P.u(a))
 z=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a)
@@ -1162,48 +1168,48 @@
 if(!(v<u))break
 y.j(w,0)
 if(y.j(w,v)>x)return c.$1(a);++v}}}}if(z==null)return c.$1(a)
-return parseInt(a,b)},
-IH:function(a,b){var z,y
+return parseInt(a,b)},"$3","Yv",6,0,null,33,[],34,[],35,[]],
+IH:[function(a,b){var z,y
 if(typeof a!=="string")H.vh(P.u(a))
 if(b==null)b=H.Rm()
 if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.$1(a)
 z=parseFloat(a)
 if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.$1(a)}return z},
-lh:function(a){var z,y
+return b.$1(a)}return z},"$2","inc",4,0,null,33,[],35,[]],
+lh:[function(a){var z,y
 z=C.AS(J.x(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
 if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.xB.j(z,0)===36)z=C.xB.yn(z,1)
-return(z+H.ia(H.oX(a),0,null)).replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})},
-a5:function(a){return"Instance of '"+H.lh(a)+"'"},
-RF:function(a){var z,y,x,w,v,u
+return z+H.ia(H.oX(a),0,null)},"$1","Ig",2,0,null,6,[]],
+a5:[function(a){return"Instance of '"+H.lh(a)+"'"},"$1","jb",2,0,null,6,[]],
+RF:[function(a){var z,y,x,w,v,u
 z=a.length
 for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
 else{u=w+500
 u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},
-YF:function(a){var z,y,x
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"$1","JG",2,0,null,36,[]],
+YF:[function(a){var z,y,x
 z=[]
-z.$builtinTypeInfo=[P.KN]
+z.$builtinTypeInfo=[J.bU]
 y=new H.a7(a,a.length,0,null)
 y.$builtinTypeInfo=[H.Kp(a,0)]
 for(;y.G();){x=y.lo
 if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
 if(x<=65535)z.push(x)
 else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},
-eT:function(a){var z,y
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},"$1","nE",2,0,null,37,[]],
+eT:[function(a){var z,y
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.YF(a)}return H.RF(a)},
-Lw:function(a){var z
+if(y>65535)return H.YF(a)}return H.RF(a)},"$1","Wb",2,0,null,38,[]],
+Lw:[function(a){var z
 if(typeof a!=="number")return H.s(a)
 if(0<=a){if(a<=65535)return String.fromCharCode(a)
 if(a<=1114111){z=a-65536
-return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
-zW:function(a,b,c,d,e,f,g,h){var z,y,x,w
+return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},"$1","cK",2,0,null,39,[]],
+zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
 if(typeof a!=="number"||Math.floor(a)!==a)H.vh(P.u(a))
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
@@ -1217,14 +1223,14 @@
 if(x.E(a,0)||x.C(a,100)){w=new Date(y)
 if(h)w.setUTCFullYear(a)
 else w.setFullYear(a)
-return w.valueOf()}return y},
-o2:function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},
-VK:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-return a[b]},
-aw:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-a[b]=c},
-zo:function(a,b,c){var z,y,x
+return w.valueOf()}return y},"$8","mV",16,0,null,40,[],41,[],42,[],43,[],44,[],45,[],46,[],47,[]],
+o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
+return a.date},"$1","j1",2,0,null,48,[]],
+VK:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+return a[b]},"$2","Zl",4,0,null,6,[],49,[]],
+aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+a[b]=c},"$3","WJ",6,0,null,6,[],49,[],30,[]],
+zo:[function(a,b,c){var z,y,x
 z={}
 z.a=0
 y=[]
@@ -1232,8 +1238,8 @@
 if(b!=null){z.a=b.length
 C.Nm.FV(y,b)}z.b=""
 if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},
-im:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},"$3","pT",6,0,null,17,[],50,[],51,[]],
+im:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z={}
 if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
 if(y==null)return H.zo(a,b,c)
@@ -1253,24 +1259,33 @@
 C.Nm.FV(r,b)
 y=a["$"+q]
 if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},
-Pq:function(){var z={x:0}
+return y.apply(a,r)},"$3","fl",6,0,null,17,[],50,[],51,[]],
+mN:[function(a){if(a=="String")return C.Kn
+if(a=="int")return C.c1
+if(a=="double")return C.yX
+if(a=="num")return C.oD
+if(a=="bool")return C.Fm
+if(a=="List")return C.E3
+if(a=="Null")return C.x0
+return init.allClasses[a]},"$1","JL",2,0,null,52,[]],
+SG:[function(a){return a===C.Kn||a===C.c1||a===C.yX||a===C.oD||a===C.Fm||a===C.E3||a===C.x0},"$1","EN",2,0,null,6,[]],
+Pq:[function(){var z={x:0}
 delete z.x
-return z},
-s:function(a){throw H.b(P.u(a))},
-e:function(a,b){if(a==null)J.q8(a)
+return z},"$0","vg",0,0,null],
+s:[function(a){throw H.b(P.u(a))},"$1","Ff",2,0,null,53,[]],
+e:[function(a,b){if(a==null)J.q8(a)
 if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},
-b:function(a){var z
+throw H.b(P.N(b))},"$2","x3",4,0,null,48,[],15,[]],
+b:[function(a){var z
 if(a==null)a=new P.LK()
 z=new Error()
 z.dartException=a
 if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.Ju})
 z.name=""}else z.toString=H.Ju
-return z},
+return z},"$1","Cr",2,0,null,54,[]],
 Ju:[function(){return J.AG(this.dartException)},"$0","Eu",0,0,null],
-vh:function(a){throw H.b(a)},
-Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+vh:[function(a){throw H.b(a)},"$1","xE",2,0,null,54,[]],
+Ru:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=new H.Am(a)
 if(a==null)return
 if(typeof a!=="object")return a
@@ -1308,29 +1323,29 @@
 return z.$1(new H.W0(y,v))}}}v=typeof y==="string"?y:""
 return z.$1(new H.vV(v))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.VS()
 return z.$1(new P.AT(null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.VS()
-return a},
-CU:function(a){if(a==null||typeof a!='object')return J.v1(a)
-else return H.eQ(a)},
-B7:function(a,b){var z,y,x,w
+return a},"$1","v2",2,0,null,54,[]],
+CU:[function(a){if(a==null||typeof a!='object')return J.v1(a)
+else return H.eQ(a)},"$1","Zs",2,0,null,6,[]],
+B7:[function(a,b){var z,y,x,w
 z=a.length
 for(y=0;y<z;y=w){x=y+1
 w=x+1
-b.u(0,a[y],a[x])}return b},
+b.u(0,a[y],a[x])}return b},"$2","nD",4,0,null,56,[],57,[]],
 ft:[function(a,b,c,d,e,f,g){var z=J.x(c)
 if(z.n(c,0))return H.zd(b,new H.dr(a))
 else if(z.n(c,1))return H.zd(b,new H.TL(a,d))
 else if(z.n(c,2))return H.zd(b,new H.KX(a,d,e))
 else if(z.n(c,3))return H.zd(b,new H.uZ(a,d,e,f))
 else if(z.n(c,4))return H.zd(b,new H.OQ(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","kT",14,0,null,9,[],10,[],11,[],12,[],13,[],14,[],15,[]],
-tR:function(a,b){var z
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","mD",14,0,null,58,[],16,[],59,[],60,[],61,[],62,[],63,[]],
+tR:[function(a,b){var z
 if(a==null)return
 z=a.$identity
 if(!!z)return z
 z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.ft)
 a.$identity=z
-return z},
-iA:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return z},"$2","qN",4,0,null,58,[],64,[]],
+iA:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=b[0]
 z.$stubName
 y=z.$callName
@@ -1359,36 +1374,36 @@
 n=o.$callName
 if(n!=null){m=d?o:H.SD(a,o,t)
 w[n]=m}}w["call*"]=s
-return v},
-vq:function(a,b,c,d){var z=H.eZ
+return v},"$6","Xd",12,0,null,48,[],65,[],66,[],67,[],68,[],69,[]],
+vq:[function(a,b,c,d){var z=H.eZ
 switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
 case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
 case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
 case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
 case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
 case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
-default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
-SD:function(a,b,c){var z,y,x,w,v,u
+default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},"$4","X5",8,0,null,64,[],70,[],71,[],17,[]],
+SD:[function(a,b,c){var z,y,x,w,v,u
 if(c)return H.wg(a,b)
 z=b.$stubName
 y=b.length
 x=a[z]
 w=b==null?x==null:b===x
 if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
-if(y===0){w=$.mJ
+if(y===0){w=$.bf
 if(w==null){w=H.B3("self")
-$.mJ=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
+$.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
 v=$.OK
 $.OK=J.WB(v,1)
 return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
 w="return function("+u+"){return this."
-v=$.mJ
+v=$.bf
 if(v==null){v=H.B3("self")
-$.mJ=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
+$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
 w=$.OK
 $.OK=J.WB(w,1)
-return new Function(v+H.d(w)+"}")()},
-Z4:function(a,b,c,d){var z,y
+return new Function(v+H.d(w)+"}")()},"$3","Fw",6,0,null,48,[],17,[],72,[]],
+Z4:[function(a,b,c,d){var z,y
 z=H.eZ
 y=H.yS
 switch(b?-1:a){case 0:throw H.b(H.Ef("Intercepted function with no arguments."))
@@ -1400,8 +1415,8 @@
 case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
 default:return function(e,f,g,h){return function(){h=[g(this)]
 Array.prototype.push.apply(h,arguments)
-return e.apply(f(this),h)}}(d,z,y)}},
-wg:function(a,b){var z,y,x,w,v,u,t,s
+return e.apply(f(this),h)}}(d,z,y)}},"$4","VT",8,0,null,64,[],70,[],12,[],17,[]],
+wg:[function(a,b){var z,y,x,w,v,u,t,s
 z=H.oN()
 y=$.P4
 if(y==null){y=H.B3("receiver")
@@ -1418,40 +1433,40 @@
 y="return function("+s+"){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+", "+s+");"
 t=$.OK
 $.OK=J.WB(t,1)
-return new Function(y+H.d(t)+"}")()},
-qm:function(a,b,c,d,e,f){b.fixed$length=init
+return new Function(y+H.d(t)+"}")()},"$2","FT",4,0,null,48,[],17,[]],
+qm:[function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},
-SE:function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},
-Go:function(a,b){var z
+return H.iA(a,b,c,!!d,e,f)},"$6","Rz",12,0,null,48,[],65,[],66,[],67,[],68,[],12,[]],
+SE:[function(a,b){var z=J.U6(b)
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"$2","H7",4,0,null,30,[],74,[]],
+Go:[function(a,b){var z
 if(a!=null)z=typeof a==="object"&&J.x(a)[b]
 else z=!0
 if(z)return a
-H.SE(a,b)},
-ag:function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},
-KT:function(a,b,c){return new H.tD(a,b,c,null)},
-Og:function(a,b){var z=a.name
+H.SE(a,b)},"$2","CY",4,0,null,30,[],74,[]],
+ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"$1","RK",2,0,null,75,[]],
+KT:[function(a,b,c){return new H.tD(a,b,c,null)},"$3","HN",6,0,null,77,[],78,[],79,[]],
+Og:[function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.tu(z)
-return new H.fw(z,b,null)},
-N7:function(){return C.KZ},
-uV:function(a){return new H.cu(a,null)},
-VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},
-oX:function(a){if(a==null)return
-return a.$builtinTypeInfo},
-IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
-ip:function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},
-Kp:function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},
-Ko:function(a,b){if(a==null)return"dynamic"
+return new H.fw(z,b,null)},"$2","ZPJ",4,0,null,80,[],81,[]],
+N7:[function(){return C.KZ},"$0","cI",0,0,null],
+uV:[function(a){return new H.cu(a,null)},"$1","IZ",2,0,null,12,[]],
+VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
+return a},"$2","Ub",4,0,null,82,[],83,[]],
+oX:[function(a){if(a==null)return
+return a.$builtinTypeInfo},"$1","Cb",2,0,null,82,[]],
+IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"$2","PE",4,0,null,82,[],84,[]],
+ip:[function(a,b,c){var z=H.IM(a,b)
+return z==null?null:z[c]},"$3","Cn",6,0,null,82,[],84,[],15,[]],
+Kp:[function(a,b){var z=H.oX(a)
+return z==null?null:z[b]},"$2","tC",4,0,null,82,[],15,[]],
+Ko:[function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
 else if(typeof a==="number"&&Math.floor(a)===a)if(b==null)return C.jn.bu(a)
 else return b.$1(a)
-else return},
-ia:function(a,b,c){var z,y,x,w,v,u
+else return},"$2$onTypeVariable","bR",2,3,null,85,11,[],86,[]],
+ia:[function(a,b,c){var z,y,x,w,v,u
 if(a==null)return""
 z=P.p9("")
 for(y=b,x=!0,w=!0;y<a.length;++y){if(x)x=!1
@@ -1459,35 +1474,34 @@
 v=a[y]
 if(v!=null)w=!1
 u=H.Ko(v,c)
-z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
-dJ:function(a){var z=J.x(a).constructor.builtin$cls
-if(a==null)return z
-return z+H.ia(a.$builtinTypeInfo,0,null)},
-Y9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
+z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},"$3$onTypeVariable","iM",4,3,null,85,87,[],88,[],86,[]],
+dJ:[function(a){var z=typeof a==="object"&&a!==null&&a.constructor===Array?"List":J.x(a).constructor.builtin$cls
+return z+H.ia(a.$builtinTypeInfo,0,null)},"$1","Yx",2,0,null,6,[]],
+Y9:[function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
 else if(typeof a=="function"){a=H.ml(a,null,b)
 if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function")b=H.ml(a,null,b)}return b},
-RB:function(a,b,c,d){var z,y
+else if(typeof a=="function")b=H.ml(a,null,b)}return b},"$2","zL",4,0,null,89,[],90,[]],
+RB:[function(a,b,c,d){var z,y
 if(a==null)return!1
 z=H.oX(a)
 y=J.x(a)
 if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},
-hv:function(a,b){var z,y
+return H.hv(H.Y9(y[d],z),c)},"$4","Ap",8,0,null,6,[],91,[],92,[],93,[]],
+hv:[function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
 for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},
-IG:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
-XY:function(a,b){var z,y
-if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="L9"
+return!0},"$2","QY",4,0,null,94,[],95,[]],
+IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"$3","k2",6,0,null,96,[],97,[],98,[]],
+XY:[function(a,b){var z,y
+if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="Null"
 if(b==null)return!0
 z=H.oX(a)
 a=J.x(a)
 if(z!=null){y=z.slice()
 y.splice(0,0,a)}else y=a
-return H.t1(y,b)},
-t1:function(a,b){var z,y,x,w,v,u,t
+return H.t1(y,b)},"$2","Dk",4,0,null,99,[],95,[]],
+t1:[function(a,b){var z,y,x,w,v,u,t
 if(a===b)return!0
 if(a==null||b==null)return!0
 if("func" in b){if(!("func" in a)){if("$is_"+H.d(b.func) in a)return!0
@@ -1504,8 +1518,8 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},
-Hc:function(a,b,c){var z,y,x,w,v
+return H.hv(H.Y9(t,y),w)},"$2","Mb",4,0,null,94,[],95,[]],
+Hc:[function(a,b,c){var z,y,x,w,v
 if(b==null&&a==null)return!0
 if(b==null)return c
 if(a==null)return!1
@@ -1514,8 +1528,8 @@
 if(c){if(z<y)return!1}else if(z!==y)return!1
 for(x=0;x<y;++x){w=a[x]
 v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},
-Vt:function(a,b){var z,y,x,w,v,u
+if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"$3","d1",6,0,null,94,[],95,[],100,[]],
+Vt:[function(a,b){var z,y,x,w,v,u
 if(b==null)return!0
 if(a==null)return!1
 z=Object.getOwnPropertyNames(b)
@@ -1525,8 +1539,8 @@
 if(!Object.hasOwnProperty.call(a,w))return!1
 v=b[w]
 u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},
-Ly:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"$2","y3",4,0,null,94,[],95,[]],
+Ly:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(!("func" in a))return!1
 if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
 y=b.ret
@@ -1547,13 +1561,13 @@
 n=w[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
 n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
-ml:function(a,b,c){return a.apply(b,c)},
-kj:function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
-wzi:function(a){return H.eQ(a)},
-iw:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
-w3:function(a){var z,y,x,w,v,u
+if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"$2","Sj",4,0,null,94,[],95,[]],
+ml:[function(a,b,c){return a.apply(b,c)},"$3","fW",6,0,null,17,[],48,[],90,[]],
+kj:[function(a){var z=$.NF
+return"Instance of "+(z==null?"<Unknown>":z.$1(a))},"$1","aZ",2,0,null,101,[]],
+wzi:[function(a){return H.eQ(a)},"$1","nR",2,0,null,6,[]],
+iw:[function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},"$3","OU",6,0,null,101,[],74,[],30,[]],
+w3:[function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.nw[z]
 if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
@@ -1578,20 +1592,20 @@
 if(v==="*")throw H.b(P.SY(z))
 if(init.leafTags[z]===true){u=H.Va(x)
 Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}else return H.Lc(a,x)},
-Lc:function(a,b){var z,y
+return u.i}else return H.Lc(a,x)},"$1","eU",2,0,null,101,[]],
+Lc:[function(a,b){var z,y
 z=Object.getPrototypeOf(a)
 y=J.Qu(b,z,null,null)
 Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return b},
-Va:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
-VF:function(a,b,c){var z=b.prototype
+return b},"$2","qF",4,0,null,101,[],7,[]],
+Va:[function(a){return J.Qu(a,!1,null,!!a.$isXj)},"$1","MlJ",2,0,null,7,[]],
+VF:[function(a,b,c){var z=b.prototype
 if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},
-XD:function(){if(!0===$.Bv)return
+else return J.Qu(z,c,null,null)},"$3","vi",6,0,null,102,[],103,[],8,[]],
+XD:[function(){if(!0===$.Bv)return
 $.Bv=!0
-H.Z1()},
-Z1:function(){var z,y,x,w,v,u,t
+H.Z1()},"$0","Ki",0,0,null],
+Z1:[function(){var z,y,x,w,v,u,t
 $.nw=Object.create(null)
 $.vv=Object.create(null)
 H.kO()
@@ -1607,8 +1621,8 @@
 z["~"+w]=t
 z["-"+w]=t
 z["+"+w]=t
-z["*"+w]=t}}},
-kO:function(){var z,y,x,w,v,u,t
+z["*"+w]=t}}},"$0","vU",0,0,null],
+kO:[function(){var z,y,x,w,v,u,t
 z=C.MA()
 z=H.ud(C.Mc,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ur(C.AS),z)))))))
 if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
@@ -1619,9 +1633,9 @@
 t=z.prototypeForTag
 $.NF=new H.dC(v)
 $.TX=new H.wN(u)
-$.x7=new H.VX(t)},
-ud:function(a,b){return a(b)||b},
-ZT:function(a,b){var z,y,x,w,v,u
+$.x7=new H.VX(t)},"$0","Hb",0,0,null],
+ud:[function(a,b){return a(b)||b},"$2","rM",4,0,null,104,[],105,[]],
+ZT:[function(a,b){var z,y,x,w,v,u
 z=H.VM([],[P.Od])
 y=b.length
 x=a.length
@@ -1630,25 +1644,25 @@
 z.push(new H.tQ(v,b,a))
 u=v+x
 if(u===y)break
-else w=v===u?w+1:u}return z},
-m2:function(a,b,c){var z,y
+else w=v===u?w+1:u}return z},"$2","tl",4,0,null,110,[],111,[]],
+m2:[function(a,b,c){var z,y
 if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
 else{z=J.x(b)
 if(!!z.$isVR){z=C.xB.yn(a,c)
 y=b.Ej
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},
-ys:function(a,b,c){var z,y,x,w,v
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"$3","WL",6,0,null,48,[],112,[],88,[]],
+ys:[function(a,b,c){var z,y,x,w,v
 if(typeof b==="string")if(b==="")if(a==="")return c
 else{z=P.p9("")
 y=a.length
 z.KF(c)
 for(x=0;x<y;++x){w=a[x]
 w=z.vM+=w
-z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))
+z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace("$","$$$$"))
 else if(!!J.x(b).$isVR){v=b.gl9()
 v.lastIndex=0
-return a.replace(v,c.replace(/\$/g,"$$$$"))}else{if(b==null)H.vh(P.u(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},
+return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(P.u(null))
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"$3","uF",6,0,null,48,[],113,[],114,[]],
 Zd:{
 "^":"a;"},
 xQ:{
@@ -1684,12 +1698,12 @@
 $isyN:true},
 LD:{
 "^":"Tp;a,b",
-$1:function(a){return J.de(a,this.b)},
+$1:[function(a){return J.de(a,this.b)},"$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
 jJ:{
-"^":"Tp:16;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,76,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,49,[],"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -1806,7 +1820,7 @@
 z={}
 if(this.NE==null){y=this.hG
 this.NE=Array(y)
-x=P.Fl(P.qU,P.KN)
+x=P.Fl(J.O,J.bU)
 for(w=this.Rv,v=0;v<y;++v){u=w+v
 x.u(0,this.XL(u),u)}z.a=0
 y=x.gvc()
@@ -1822,35 +1836,36 @@
 H.VM(y,y["<>"])
 return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},
 gx5:function(){return this.mr.$reflectionName},
-static:{"^":"qg,FV,C1,bt",zh:function(a){var z,y,x
+static:{"^":"vS,FV,C1,bt",zh:function(a){var z,y,x,w
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
 z=z
 y=z[0]
-x=z[1]
-return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
+x=y>>1
+w=z[1]
+return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
 Nv:{
-"^":"Tp:8;a,b,c",
-$1:function(a){var z,y,x
+"^":"Tp:32;a,b,c",
+$1:[function(a){var z,y,x
 z=this.b.NE
 y=this.a.a++
 x=this.c.t(0,a)
 if(y>=z.length)return H.e(z,y)
-z[y]=x},
+z[y]=x},"$1",null,2,0,null,12,[],"call"],
 $isEH:true},
 Cj:{
-"^":"Tp:77;a,b,c",
-$2:function(a,b){var z=this.a
+"^":"Tp:301;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},
+this.b.push(b);++z.a},"$2",null,4,0,null,12,[],53,[],"call"],
 $isEH:true},
 u8:{
-"^":"Tp:77;a,b",
-$2:function(a,b){var z=this.b
+"^":"Tp:301;a,b",
+$2:[function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},
+else this.a.a=!0},"$2",null,4,0,null,302,[],30,[],"call"],
 $isEH:true},
 Zr:{
 "^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -1869,7 +1884,7 @@
 x=this.EP
 if(x!==-1)y.receiver=z[x+1]
 return y},
-static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:function(a){var z,y,x,w,v,u
+static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
 a=a.replace(String({}),'$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
 if(z==null)z=[]
@@ -1878,8 +1893,8 @@
 w=z.indexOf("\\$expr\\$")
 v=z.indexOf("\\$method\\$")
 u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},S7:function(a){return function($expr$){var $argumentsExpr$='$arguments$'
-try{$expr$.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},Mj:function(a){return function($expr$){try{$expr$.$method$}catch(z){return z.message}}(a)}}},
+return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"$1","dx",2,0,null,24,[]],S7:[function(a){return function(b){var $argumentsExpr$='$arguments$'
+try{b.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},"$1","LS",2,0,null,55,[]],Mj:[function(a){return function(b){try{b.$method$}catch(z){return z.message}}(a)},"$1","cl",2,0,null,55,[]]}},
 W0:{
 "^":"Ge;K9,Ga",
 bu:function(a){var z=this.Ga
@@ -1907,9 +1922,9 @@
 bu:function(a){var z=this.K9
 return C.xB.gl0(z)?"Error":"Error: "+z}},
 Am:{
-"^":"Tp:16;a",
-$1:function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},
+"^":"Tp:116;a",
+$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
+return a},"$1",null,2,0,null,171,[],"call"],
 $isEH:true},
 XO:{
 "^":"a;lA,ui",
@@ -1922,31 +1937,30 @@
 this.ui=z
 return z}},
 dr:{
-"^":"Tp:22;a",
-$0:function(){return this.a.$0()},
+"^":"Tp:115;a",
+$0:[function(){return this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 TL:{
-"^":"Tp:22;b,c",
-$0:function(){return this.b.$1(this.c)},
+"^":"Tp:115;b,c",
+$0:[function(){return this.b.$1(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 KX:{
-"^":"Tp:22;d,e,f",
-$0:function(){return this.d.$2(this.e,this.f)},
+"^":"Tp:115;d,e,f",
+$0:[function(){return this.d.$2(this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uZ:{
-"^":"Tp:22;UI,bK,Gq,Rm",
-$0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
+"^":"Tp:115;UI,bK,Gq,Rm",
+$0:[function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},"$0",null,0,0,null,"call"],
 $isEH:true},
 OQ:{
-"^":"Tp:22;w3,HZ,mG,xC,cj",
-$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
+"^":"Tp:115;w3,HZ,mG,xC,cj",
+$0:[function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Tp:{
 "^":"a;",
 bu:function(a){return"Closure"},
 $isTp:true,
-$isEH:true,
-gKu:function(){return this}},
+$isEH:true},
 Bp:{
 "^":"Tp;",
 $isBp:true},
@@ -1962,15 +1976,15 @@
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.jm))},
 $isv:true,
-static:{"^":"mJ,P4",eZ:function(a){return a.gnw()},yS:function(a){return a.EP},oN:function(){var z=$.mJ
+static:{"^":"bf,P4",eZ:[function(a){return a.gnw()},"$1","PR",2,0,null,58,[]],yS:[function(a){return a.EP},"$1","xm",2,0,null,58,[]],oN:[function(){var z=$.bf
 if(z==null){z=H.B3("self")
-$.mJ=z}return z},B3:function(a){var z,y,x,w,v
+$.bf=z}return z},"$0","uT",0,0,null],B3:[function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
 y=Object.getOwnPropertyNames(z)
 y.fixed$length=init
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
-if(z[v]===a)return v}}}},
+if(z[v]===a)return v}},"$1","ec",2,0,null,73,[]]}},
 qq:{
 "^":"a;Jy"},
 va:{
@@ -2024,11 +2038,11 @@
 for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
 if(w)x+=", "
 x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},
-static:{"^":"Jl",Dz:function(a){var z,y,x
+static:{"^":"Jl",Dz:[function(a){var z,y,x
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z}}},
+return z},"$1","At",2,0,null,76,[]]}},
 hJ:{
 "^":"q1;",
 bu:function(a){return"dynamic"},
@@ -2063,10 +2077,12 @@
 static:{WE:function(a){return new H.oQ(a)}}},
 cu:{
 "^":"a;LU<,ke",
-bu:function(a){var z,y
+bu:function(a){var z,y,x
 z=this.ke
 if(z!=null)return z
-y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
+y=this.LU
+x=init.mangledGlobalNames[y]
+y=x==null?y:x
 this.ke=y
 return y},
 giO:function(a){return J.v1(this.LU)},
@@ -2074,32 +2090,32 @@
 return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},
 $iscu:true,
 $isuq:true},
-bB:{
+QT:{
 "^":"a;XP<,oc>,kU>"},
 dC:{
-"^":"Tp:16;a",
-$1:function(a){return this.a(a)},
+"^":"Tp:116;a",
+$1:[function(a){return this.a(a)},"$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 wN:{
-"^":"Tp:78;b",
-$2:function(a,b){return this.b(a,b)},
+"^":"Tp:303;b",
+$2:[function(a,b){return this.b(a,b)},"$2",null,4,0,null,99,[],102,[],"call"],
 $isEH:true},
 VX:{
-"^":"Tp:8;c",
-$1:function(a){return this.c(a)},
+"^":"Tp:32;c",
+$1:[function(a){return this.c(a)},"$1",null,2,0,null,102,[],"call"],
 $isEH:true},
 VR:{
-"^":"a;zO,Ej,Ii,Ua",
+"^":"a;Ej,Ii,Ua",
 gl9:function(){var z=this.Ii
 if(z!=null)return z
 z=this.Ej
-z=H.v4(this.zO,z.multiline,!z.ignoreCase,!0)
+z=H.v4(z.source,z.multiline,!z.ignoreCase,!0)
 this.Ii=z
 return z},
 gAT:function(){var z=this.Ua
 if(z!=null)return z
 z=this.Ej
-z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
+z=H.v4(z.source+"|()",z.multiline,!z.ignoreCase,!0)
 this.Ua=z
 return z},
 ej:function(a){var z
@@ -2136,14 +2152,14 @@
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
 $isSP:true,
-static:{v4:function(a,b,c,d){var z,y,x,w,v
+static:{v4:[function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
 x=d?"g":""
 w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"$4","HU",8,0,null,106,[],107,[],108,[],109,[]]}},
 AX:{
 "^":"a;zO,QK",
 t:function(a,b){var z=this.QK
@@ -2180,17 +2196,60 @@
 "^":"a;M,J9,zO",
 t:function(a,b){if(!J.de(b,0))H.vh(P.N(b))
 return this.zO},
-$isOd:true}}],["app","package:observatory/app.dart",,G,{
+$isOd:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
+"^":"",
+hV:{
+"^":["LP;fi%-304,dB%-85,KW%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gO9:[function(a){return a.fi},null,null,1,0,307,"busy",308,309],
+sO9:[function(a,b){a.fi=this.ct(a,C.S4,a.fi,b)},null,null,3,0,310,30,[],"busy",308],
+gFR:[function(a){return a.dB},null,null,1,0,115,"callback",308,311],
+Ki:function(a){return this.gFR(a).$0()},
+LY:function(a,b){return this.gFR(a).$1(b)},
+sFR:[function(a,b){a.dB=this.ct(a,C.AV,a.dB,b)},null,null,3,0,116,30,[],"callback",308],
+gph:[function(a){return a.KW},null,null,1,0,312,"label",308,311],
+sph:[function(a,b){a.KW=this.ct(a,C.y2,a.KW,b)},null,null,3,0,32,30,[],"label",308],
+pp:[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,313,118,[],199,[],289,[],"doAction"],
+"@":function(){return[C.F9]},
+static:{zy:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.fi=!1
+a.dB=null
+a.KW="action"
+a.SO=z
+a.B7=y
+a.X0=w
+C.Uy.ZL(a)
+C.Uy.oX(a)
+return a},null,null,0,0,115,"new ActionLinkElement$created"]}},
+"+ActionLinkElement":[314],
+LP:{
+"^":"xc+Pi;",
+$isd3:true},
+jE:{
+"^":"Tp:115;a-85",
+$0:[function(){var z,y
+z=this.a
+y=J.RE(z)
+y.sfi(z,y.ct(z,C.S4,y.gfi(z),!1))},"$0",null,0,0,115,"call"],
+$isEH:true},
+"+ jE":[315]}],["app","package:observatory/app.dart",,G,{
 "^":"",
 m7:[function(a){var z
 N.Jx("").To("Google Charts API loaded")
 z=J.UQ(J.UQ($.cM(),"google"),"visualization")
 $.NR=z
-return z},"$1","vN",2,0,16,17,[]],
-G0:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},
-ap:function(a,b){var z
+return z},"$1","vN",2,0,116,117,[]],
+G0:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","ez",4,0,null,118,[],119,[]],
+ap:[function(a,b){var z
 for(z="";b>1;){--b
-if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
+if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},"$2","Bn",4,0,null,30,[],120,[]],
 av:[function(a){var z,y,x
 z=J.Wx(a)
 if(z.C(a,1000))return z.bu(a)
@@ -2198,8 +2257,8 @@
 a=z.Z(a,1000)
 x=G.ap(y,3)
 for(;z=J.Wx(a),z.D(a,1000);){x=G.ap(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","Vj",2,0,18],
-P0:function(a){var z,y,x,w
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","Vj",2,0,121,122,[]],
+P0:[function(a){var z,y,x,w
 if(a==null)return"-"
 z=J.LL(J.vX(a,1000))
 y=C.jn.cU(z,3600000)
@@ -2209,14 +2268,14 @@
 w=C.jn.cU(z,1000)
 z=C.jn.Y(z,1000)
 if(y>0)return G.ap(y,2)+":"+G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)
-else return G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)},
+else return G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)},"$1","DQ",2,0,null,123,[]],
 Xz:[function(a){var z=J.Wx(a)
 if(z.C(a,1024))return H.d(a)+"B"
 else if(z.C(a,1048576))return""+C.CD.yu(C.CD.UD(z.V(a,1024)))+"KB"
 else if(z.C(a,1073741824))return""+C.CD.yu(C.CD.UD(z.V(a,1048576)))+"MB"
 else if(z.C(a,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(a,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","AF",2,0,18,19,[]],
-mG:function(a){var z,y,x,w
+else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","AF",2,0,121,124,[]],
+mG:[function(a){var z,y,x,w
 if(a==null)return"-"
 z=J.LL(J.vX(a,1000))
 y=C.jn.cU(z,3600000)
@@ -2226,15 +2285,15 @@
 P.p9("")
 if(y!==0)return""+y+"h "+x+"m "+w+"s"
 if(x!==0)return""+x+"m "+w+"s"
-return""+w+"s"},
+return""+w+"s"},"$1","N2",2,0,null,123,[]],
 mL:{
-"^":["Pi;Z6<-79,zf>-80,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,81,"isolate",82,83],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,84,27,[],"isolate",82],
-gvJ:[function(a){return this.AJ},null,null,1,0,85,"response",82,83],
-svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,86,27,[],"response",82],
-gKw:[function(){return this.fz},null,null,1,0,87,"args",82,83],
-sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,8,27,[],"args",82],
+"^":["Pi;Z6<-316,zf>-317,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,318,"isolate",308,309],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,319,30,[],"isolate",308],
+gvJ:[function(a){return this.AJ},null,null,1,0,320,"response",308,309],
+svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,321,30,[],"response",308],
+gKw:[function(){return this.fz},null,null,1,0,312,"args",308,309],
+sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,32,30,[],"args",308],
 Da:function(){var z,y
 z=this.Z6
 z.sec(this)
@@ -2245,9 +2304,9 @@
 z=z.gLi()
 H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
 kj:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gbf",2,0,88,30,[]],
+this.Z6.Mp()},"$1","gbf",2,0,322,171,[]],
 t1:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gXa",2,0,89,90,[]],
+this.Z6.Mp()},"$1","gXa",2,0,323,324,[]],
 US:function(){this.Da()},
 hq:function(){this.Da()}},
 ig:{
@@ -2266,8 +2325,8 @@
 this.vR.V7("draw",[a.gYb(),z])}},
 dZ:{
 "^":"Pi;ec?,JL,AP,fn",
-gjW:[function(){return this.JL},null,null,1,0,87,"currentHash",82,83],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,8,27,[],"currentHash",82],
+gjW:[function(){return this.JL},null,null,1,0,312,"currentHash",308,309],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",308],
 kI:function(){var z=C.PP.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
 if(window.location.hash==="")window.location.hash="#/vm"
@@ -2286,38 +2345,38 @@
 this.ec.zf.cv(J.ZZ(this.JL,2)).ml(new G.GH(this,x))},
 static:{"^":"K3D"}},
 Qe:{
-"^":"Tp:16;a",
-$1:[function(a){this.a.df()},"$1",null,2,0,null,91,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){this.a.df()},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 GH:{
-"^":"Tp:16;a,b",
+"^":"Tp:116;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=z.ec
 y.AJ=F.Wi(y,C.mE,y.AJ,a)
 z=z.ec
-z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,92,[],"call"],
+z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,101,[],"call"],
 $isEH:true},
 Y2:{
-"^":["Pi;eT>,yt<-93,wd>-94,oH<-95",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
-gyX:[function(a){return this.R7},null,null,1,0,87,"expander",82,83],
+"^":["Pi;eT>,yt<-326,wd>-327,oH<-328",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
+gyX:[function(a){return this.R7},null,null,1,0,312,"expander",308,309],
 Qx:function(a){return this.gyX(this).$0()},
-syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,8,27,[],"expander",82],
-grm:[function(){return this.aZ},null,null,1,0,87,"expanderStyle",82,83],
-srm:[function(a){this.aZ=F.Wi(this,C.Jt,this.aZ,a)},null,null,3,0,8,27,[],"expanderStyle",82],
-goE:function(a){return this.z3},
-soE:function(a,b){var z=this.z3
-this.z3=b
+syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,32,30,[],"expander",308],
+grm:[function(){return this.aZ},null,null,1,0,312,"expanderStyle",308,309],
+srm:[function(a){this.aZ=F.Wi(this,C.Jt,this.aZ,a)},null,null,3,0,32,30,[],"expanderStyle",308],
+goE:function(a){return this.cp},
+soE:function(a,b){var z=this.cp
+this.cp=b
 if(z!==b){z=this.R7
 if(b){this.R7=F.Wi(this,C.Of,z,"\u21b3")
 this.C4(0)}else{this.R7=F.Wi(this,C.Of,z,"\u2192")
 this.o8()}}},
-r8:function(){this.soE(0,!this.z3)
-return this.z3},
+r8:function(){this.soE(0,!this.cp)
+return this.cp},
 k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Jt,this.aZ,"visibility:hidden;")},
 $isY2:true},
 XN:{
-"^":["Pi;zU>-94,AP,fn",function(){return[C.J19]},null,null],
+"^":["Pi;zU>-327,AP,fn",function(){return[C.J19]},null,null],
 rT:function(a){var z,y
 z=this.zU
 y=J.w1(z)
@@ -2344,7 +2403,7 @@
 w.UZ(z,v,v+y)}},
 Kt:{
 "^":"a;ph>,xy<",
-static:{r1:[function(a){return a!=null?J.AG(a):"<null>"},"$1","My",2,0,20]}},
+static:{r1:[function(a){return a!=null?J.AG(a):"<null>"},"$1","My",2,0,125,122,[]]}},
 Ni:{
 "^":"a;UQ>",
 $isNi:true},
@@ -2355,7 +2414,7 @@
 gxp:function(){return this.pT},
 np:function(a){H.rd(this.tW,new G.Nu(this))
 F.Wi(this,C.AH,0,1)},
-gIN:[function(){return this.tW},null,null,1,0,96,"sortedRows",83],
+gIN:[function(){return this.tW},null,null,1,0,329,"sortedRows",309],
 lb:function(){C.Nm.sB(this.zU,0)
 C.Nm.sB(this.tW,0)},
 aJ:function(a,b){var z=this.zU
@@ -2368,20 +2427,20 @@
 y=J.UQ(J.U8(z[a]),b)
 z=this.oH
 if(b>>>0!==b||b>=9)return H.e(z,b)
-return z[b].gxy().$1(y)},"$2","gls",4,0,97,98,[],99,[],"getFormattedValue",82],
+return z[b].gxy().$1(y)},"$2","gls",4,0,330,331,[],332,[],"getFormattedValue",308],
 Qs:[function(a){var z
 if(!J.de(a,this.pT)){z=this.oH
 if(a>>>0!==a||a>=9)return H.e(z,a)
 return J.WB(J.Kz(z[a]),"\u2003")}z=this.oH
 if(a>>>0!==a||a>=9)return H.e(z,a)
 z=J.Kz(z[a])
-return J.WB(z,this.jV?"\u25bc":"\u25b2")},"$1","gpo",2,0,18,99,[],"getColumnLabel",82],
+return J.WB(z,this.jV?"\u25bc":"\u25b2")},"$1","gpo",2,0,121,332,[],"getColumnLabel",308],
 TK:[function(a,b){var z=this.zU
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8(z[a]),b)},"$2","gyY",4,0,100,98,[],99,[],"getValue",82]},
+return J.UQ(J.U8(z[a]),b)},"$2","gyY",4,0,333,331,[],332,[],"getValue",308]},
 Nu:{
-"^":"Tp:75;a",
-$2:function(a,b){var z,y,x,w
+"^":"Tp:300;a",
+$2:[function(a,b){var z,y,x,w
 z=this.a
 y=z.zU
 if(a>>>0!==a||a>=y.length)return H.e(y,a)
@@ -2389,23 +2448,23 @@
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
 w=J.UQ(J.U8(y[b]),z.pT)
 if(z.jV)return J.oE(w,x)
-else return J.oE(x,w)},
-$isEH:true}}],["app_bootstrap","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/index.html_bootstrap.dart",,E,{
+else return J.oE(x,w)},"$2",null,4,0,null,334,[],335,[],"call"],
+$isEH:true}}],["app_bootstrap","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/index.html_bootstrap.dart",,E,{
 "^":"",
-De:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
+De:[function(){$.x2=["package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/action_link.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
 $.uP=!1
-F.E2()},"$0","KU",0,0,21]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+F.E2()},"$0","KU",0,0,126]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 pz:{
-"^":["pv;BW%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grs:[function(a){return a.BW},null,null,1,0,103,"msg",82,104],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,105,27,[],"msg",82],
-pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
-"@":function(){return[C.PT]},
+"^":["pv;BW%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grs:[function(a){return a.BW},null,null,1,0,337,"msg",308,311],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,338,30,[],"msg",308],
+pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
+"@":function(){return[C.jy]},
 static:{t4:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -2413,19 +2472,19 @@
 a.X0=w
 C.J0.ZL(a)
 C.J0.oX(a)
-return a},null,null,0,0,22,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[107],
+return a},null,null,0,0,115,"new BreakpointListElement$created"]}},
+"+BreakpointListElement":[340],
 pv:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
 Tg:{
-"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.tSc]},
 static:{rt:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -2434,21 +2493,21 @@
 a.X0=w
 C.oq.ZL(a)
 C.oq.oX(a)
-return a},null,null,0,0,22,"new ClassRefElement$created"]}},
-"+ClassRefElement":[110]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+return a},null,null,0,0,115,"new ClassRefElement$created"]}},
+"+ClassRefElement":[342]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 Jc:{
-"^":["Dsd;Om%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Om},null,null,1,0,103,"cls",82,104],
-sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,105,27,[],"cls",82],
-vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
-Xe:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/retained"))},"$1","ghN",2,0,111,113,[],"retainedSize"],
-pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"^":["Dsd;Om%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Om},null,null,1,0,337,"cls",308,311],
+sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,338,30,[],"cls",308],
+vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
+Xe:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/retained"))},"$1","ghN",2,0,343,344,[],"retainedSize"],
+pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 "@":function(){return[C.aQx]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -2456,22 +2515,22 @@
 a.X0=w
 C.ka.ZL(a)
 C.ka.oX(a)
-return a},null,null,0,0,22,"new ClassViewElement$created"]}},
-"+ClassViewElement":[114],
+return a},null,null,0,0,115,"new ClassViewElement$created"]}},
+"+ClassViewElement":[345],
 Dsd:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 CN:{
-"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.tY},null,null,1,0,115,"code",83],
+"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.tY},null,null,1,0,346,"code",309],
 P9:[function(a,b){Q.xI.prototype.P9.call(this,a,b)
-this.ct(a,C.b1,0,1)},"$1","gLe",2,0,16,65,[],"refChanged"],
+this.ct(a,C.b1,0,1)},"$1","gLe",2,0,116,242,[],"refChanged"],
 "@":function(){return[C.H3]},
 static:{On:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -2480,80 +2539,80 @@
 a.X0=w
 C.IK.ZL(a)
 C.IK.oX(a)
-return a},null,null,0,0,22,"new CodeRefElement$created"]}},
-"+CodeRefElement":[110]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+return a},null,null,0,0,115,"new CodeRefElement$created"]}},
+"+CodeRefElement":[342]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":["tuj;Xx%-116,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.Xx},null,null,1,0,115,"code",82,104],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,117,27,[],"code",82],
+"^":["tuj;Xx%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.Xx},null,null,1,0,346,"code",308,311],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,348,30,[],"code",308],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z).ml(new F.hf())},"$0","gQd",0,0,21,"enteredView"],
-pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+J.SK(z).ml(new F.hf())},"$0","gQd",0,0,126,"enteredView"],
+pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 m2:[function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
 y=H.BU(z,null,null)
 x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
 if(x==null)return
-return x},"$1","gnV",2,0,118,119,[],"_findJumpTarget"],
+return x},"$1","gnV",2,0,349,82,[],"_findJumpTarget"],
 YI:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gff",6,0,120,7,[],121,[],119,[],"mouseOver"],
+J.pP(z).h(0,"highlight")},"$3","gff",6,0,350,21,[],351,[],82,[],"mouseOver"],
 ZC:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,120,7,[],121,[],119,[],"mouseOut"],
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,350,21,[],351,[],82,[],"mouseOut"],
 "@":function(){return[C.xW]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
 a.B7=y
 a.X0=w
-C.YD.ZL(a)
-C.YD.oX(a)
-return a},null,null,0,0,22,"new CodeViewElement$created"]}},
-"+CodeViewElement":[122],
+C.ux.ZL(a)
+C.ux.oX(a)
+return a},null,null,0,0,115,"new CodeViewElement$created"]}},
+"+CodeViewElement":[352],
 tuj:{
 "^":"uL+Pi;",
 $isd3:true},
 hf:{
-"^":"Tp:117;",
-$1:[function(a){a.QW()},"$1",null,2,0,117,123,[],"call"],
+"^":"Tp:348;",
+$1:[function(a){a.QW()},"$1",null,2,0,348,289,[],"call"],
 $isEH:true},
-"+ hf":[124]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
+"+ hf":[315]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 i6:{
-"^":["Vct;zh%-125,HX%-125,Uy%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gAQ:[function(a){return a.zh},null,null,1,0,87,"iconClass",82,83],
-sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,8,27,[],"iconClass",82],
-gai:[function(a){return a.HX},null,null,1,0,87,"displayValue",82,83],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,8,27,[],"displayValue",82],
-gxj:[function(a){return a.Uy},null,null,1,0,126,"collapsed"],
+"^":["Vct;zh%-305,HX%-305,Uy%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gAQ:[function(a){return a.zh},null,null,1,0,312,"iconClass",308,309],
+sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",308],
+gai:[function(a){return a.HX},null,null,1,0,312,"displayValue",308,309],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",308],
+gxj:[function(a){return a.Uy},null,null,1,0,307,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,127,128,[],"collapsed"],
+this.SS(a)},null,null,3,0,310,353,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-this.SS(a)},"$0","gQd",0,0,21,"enteredView"],
+this.SS(a)},"$0","gQd",0,0,126,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
 this.SS(a)
-this.SS(a)},"$3","gl8",6,0,120,7,[],121,[],119,[],"toggleDisplay"],
+this.SS(a)},"$3","gl8",6,0,350,21,[],351,[],82,[],"toggleDisplay"],
 SS:[function(a){var z,y
 z=a.Uy
 y=a.zh
 if(z===!0){a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-down")
 a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
-a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,21,"_refresh"],
+a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,126,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-125,DI<-125",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-305,DI<-305",Hv:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.zh="glyphicon glyphicon-chevron-down"
@@ -2564,43 +2623,43 @@
 a.X0=w
 C.j8.ZL(a)
 C.j8.oX(a)
-return a},null,null,0,0,22,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[129],
+return a},null,null,0,0,115,"new CollapsibleContentElement$created"]}},
+"+CollapsibleContentElement":[354],
 Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
-"^":["LP;GV%-109,Pl%-109,nx%-29,oM%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-goE:[function(a){return a.GV},null,null,1,0,126,"expanded",82,83],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,127,27,[],"expanded",82],
-gO9:[function(a){return a.Pl},null,null,1,0,126,"busy",82,83],
-sO9:[function(a,b){a.Pl=this.ct(a,C.S4,a.Pl,b)},null,null,3,0,127,27,[],"busy",82],
-gFR:[function(a){return a.nx},null,null,1,0,22,"callback",82,104],
+"^":["Nr;GV%-304,Hu%-304,nx%-85,oM%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+goE:[function(a){return a.GV},null,null,1,0,307,"expanded",308,309],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,310,30,[],"expanded",308],
+gO9:[function(a){return a.Hu},null,null,1,0,307,"busy",308,309],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,310,30,[],"busy",308],
+gFR:[function(a){return a.nx},null,null,1,0,115,"callback",308,311],
 Ki:function(a){return this.gFR(a).$0()},
 AV:function(a,b,c){return this.gFR(a).$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,16,27,[],"callback",82],
-git:[function(a){return a.oM},null,null,1,0,126,"expand",82,104],
-sit:[function(a,b){a.oM=this.ct(a,C.dI,a.oM,b)},null,null,3,0,127,27,[],"expand",82],
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,116,30,[],"callback",308],
+git:[function(a){return a.oM},null,null,1,0,307,"expand",308,311],
+sit:[function(a,b){a.oM=this.ct(a,C.dI,a.oM,b)},null,null,3,0,310,30,[],"expand",308],
 rL:[function(a,b){var z=a.oM
-a.GV=this.ct(a,C.mr,a.GV,z)},"$1","gzr",2,0,26,65,[],"expandChanged"],
+a.GV=this.ct(a,C.mr,a.GV,z)},"$1","gzr",2,0,169,242,[],"expandChanged"],
 Ey:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
-a.Pl=this.ct(a,C.S4,a.Pl,!1)},"$0","goJ",0,0,21,"doneCallback"],
-AZ:[function(a,b,c,d){var z=a.Pl
+a.Hu=this.ct(a,C.S4,a.Hu,!1)},"$0","goJ",0,0,126,"doneCallback"],
+AZ:[function(a,b,c,d){var z=a.Hu
 if(z===!0)return
-if(a.nx!=null){a.Pl=this.ct(a,C.S4,z,!0)
+if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,130,53,[],57,[],123,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,313,118,[],199,[],289,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.GV=!1
-a.Pl=!1
+a.Hu=!1
 a.nx=null
 a.oM=!1
 a.SO=z
@@ -2608,9 +2667,9 @@
 a.X0=w
 C.O0.ZL(a)
 C.O0.oX(a)
-return a},null,null,0,0,22,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[131],
-LP:{
+return a},null,null,0,0,115,"new CurlyBlockElement$created"]}},
+"+CurlyBlockElement":[355],
+Nr:{
 "^":"xc+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
 "^":"",
@@ -2621,21 +2680,21 @@
 if(y==null)return"registerElement" in document
 return J.de(J.UQ(y,"ready"),!0)},
 wJ:{
-"^":"Tp:22;",
-$0:function(){if(B.G9())return P.Ab(null,null)
+"^":"Tp:115;",
+$0:[function(){if(B.G9())return P.Ab(null,null)
 var z=H.VM(new W.RO(document,"WebComponentsReady",!1),[null])
-return z.gtH(z)},
+return z.gtH(z)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["dart._internal","dart:_internal",,H,{
 "^":"",
-bQ:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},
-Ck:function(a,b){var z
+bQ:[function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},"$2","Mn",4,0,null,127,[],128,[]],
+Ck:[function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
-return!1},
-n3:function(a,b,c){var z
+return!1},"$2","cs",4,0,null,127,[],128,[]],
+n3:[function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.$2(b,z.lo)
-return b},
-mx:function(a,b,c){var z,y,x,w
+return b},"$3","cS",6,0,null,127,[],129,[],130,[]],
+mx:[function(a,b,c){var z,y,x,w
 for(y=0;x=$.RM(),y<x.length;++y){x=x[y]
 w=a
 if(x==null?w==null:x===w)return H.d(b)+"..."+H.d(c)}z=P.p9("")
@@ -2644,24 +2703,24 @@
 z.We(a,", ")
 z.KF(c)}finally{x=$.RM()
 if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},
-rd:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},
-K0:function(a,b,c){var z=J.Wx(b)
+x.pop()}return z.gvM()},"$3","l7",6,0,null,127,[],131,[],132,[]],
+rd:[function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},"$2","xX",4,0,null,76,[],133,[]],
+K0:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 z=J.Wx(c)
-if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},
-qG:function(a,b,c,d,e){var z,y,x,w
+if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"$3","Ze",6,0,null,76,[],134,[],135,[]],
+qG:[function(a,b,c,d,e){var z,y,x,w
 H.K0(a,b,c)
 z=J.xH(c,b)
 if(J.de(z,0))return
 if(J.u6(e,0))throw H.b(P.u(e))
 y=J.x(d)
-if(!!y.$iszM){x=e
+if(!!y.$isList){x=e
 w=d}else{w=y.eR(d,e).tt(0,!1)
 x=0}if(J.z8(J.WB(x,z),J.q8(w)))throw H.b(P.w("Not enough elements"))
-H.tb(w,x,a,b,z)},
-IC:function(a,b,c){var z,y,x,w,v,u
+H.tb(w,x,a,b,z)},"$5","it",10,0,null,76,[],134,[],135,[],113,[],136,[]],
+IC:[function(a,b,c){var z,y,x,w,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 y=J.x(c)
@@ -2677,37 +2736,37 @@
 H.qG(a,z,w,a,b)
 for(z=y.gA(c);z.G();b=u){v=z.gl()
 u=J.WB(b,1)
-C.Nm.u(a,b,v)}},
-ed:function(a,b,c){var z,y
+C.Nm.u(a,b,v)}},"$3","QB",6,0,null,76,[],15,[],127,[]],
+ed:[function(a,b,c){var z,y
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 for(z=J.GP(c);z.G();b=y){y=b+1
-C.Nm.u(a,b,z.gl())}},
-tb:function(a,b,c,d,e){var z,y,x,w,v
+C.Nm.u(a,b,z.gl())}},"$3","Y1",6,0,null,76,[],15,[],127,[]],
+tb:[function(a,b,c,d,e){var z,y,x,w,v
 z=J.Wx(b)
 if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},
-TK:function(a,b,c,d){var z
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"$5","e8",10,0,null,137,[],138,[],139,[],140,[],141,[]],
+TK:[function(a,b,c,d){var z
 if(c>=a.length)return-1
 if(c<0)c=0
 for(z=c;z<d;++z){if(z<0||z>=a.length)return H.e(a,z)
-if(J.de(a[z],b))return z}return-1},
-lO:function(a,b,c){var z,y
+if(J.de(a[z],b))return z}return-1},"$4","vu",8,0,null,118,[],142,[],88,[],143,[]],
+lO:[function(a,b,c){var z,y
 if(typeof c!=="number")return c.C()
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
 for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.de(a[y],b))return y}return-1},
-ZE:function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
-else H.d4(a,b,c,d)},
-w9:function(a,b,c,d){var z,y,x,w,v,u
+if(J.de(a[y],b))return y}return-1},"$3","MW",6,0,null,118,[],142,[],88,[]],
+ZE:[function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
+else H.d4(a,b,c,d)},"$4","UR",8,0,null,118,[],144,[],145,[],133,[]],
+w9:[function(a,b,c,d){var z,y,x,w,v,u
 for(z=J.WB(b,1),y=J.U6(a);x=J.Wx(z),x.E(z,c);z=x.g(z,1)){w=y.t(a,z)
 v=z
 while(!0){u=J.Wx(v)
 if(!(u.D(v,b)&&J.z8(d.$2(y.t(a,u.W(v,1)),w),0)))break
 y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},
-d4:function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
+v=u.W(v,1)}y.u(a,v,w)}},"$4","f7",8,0,null,118,[],144,[],145,[],133,[]],
+d4:[function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
 z=J.Wx(a0)
 y=J.Ts(J.WB(z.W(a0,b),1),6)
 x=J.Qc(b)
@@ -2807,7 +2866,7 @@
 k=e}else{t.u(a,i,t.t(a,j))
 d=x.W(j,1)
 t.u(a,j,h)
-j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},
+j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"$4","Hm",8,0,null,118,[],144,[],145,[],133,[]],
 aL:{
 "^":"mW;",
 gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
@@ -2851,7 +2910,7 @@
 w.vM+=typeof u==="string"?u:H.d(u)
 if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
 ev:function(a,b){return P.mW.prototype.ev.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")}],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},128,[]],
 es:function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
@@ -3087,15 +3146,15 @@
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
-$iszM:true,
-$aszM:null,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 w2Y:{
 "^":"ar+Tv;",
-$iszM:true,
-$aszM:null,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -3116,95 +3175,99 @@
 bu:function(a){return"Symbol(\""+H.d(this.fN)+"\")"},
 $isGD:true,
 $iswv:true,
-static:{"^":"RWj,ES1,quP,L3,Np,p1",u1:function(a){var z,y
+static:{"^":"RWj,ES1,quP,L3,Np,p1",u1:[function(a){var z,y
 z=J.U6(a)
 if(z.gl0(a)!==!0){y=$.bw().Ej
 if(typeof a!=="string")H.vh(P.u(a))
 y=y.test(a)}else y=!0
 if(y)return a
 if(z.nC(a,"_"))throw H.b(P.u("\""+H.d(a)+"\" is a private identifier"))
-throw H.b(P.u("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))}}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
+throw H.b(P.u("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))},"$1","kf",2,0,null,12,[]]}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
 "^":"",
-TS:function(a){return J.GL(a)},
-YC:function(a){if(a==null)return
-return new H.GD(a)},
+TS:[function(a){return J.GL(a)},"$1","DP",2,0,null,146,[]],
+YC:[function(a){if(a==null)return
+return new H.GD(a)},"$1","Rc",2,0,null,12,[]],
 vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
-else return new H.iu(a,4)},"$1","Yf",2,0,23,24,[]],
-jO:function(a){var z,y
+else return new H.iu(a,4)},"$1","Yf",2,0,147,148,[]],
+jO:[function(a){var z,y
 z=$.Sl().t(0,a)
 y=J.x(a)
 if(y.n(a,"dynamic"))return $.P8()
 if(y.n(a,"void"))return $.oj()
-return H.tT(H.YC(z==null?a:z),a)},
-tT:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return H.tT(H.YC(z==null?a:z),a)},"$1","vC",2,0,null,149,[]],
+tT:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+z=J.U6(b)
+y=z.u8(b,"/")
+if(y>-1)b=z.yn(b,y+1)
 z=$.tY
 if(z==null){z=H.Pq()
-$.tY=z}y=z[b]
-if(y!=null)return y
+$.tY=z}x=z[b]
+if(x!=null)return x
 z=J.U6(b)
-x=z.u8(b,"<")
-if(x!==-1){w=H.jO(z.Nj(b,0,x)).gJi()
-y=new H.bl(w,z.Nj(b,x+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,w.gIf())
-$.tY[b]=y
-return y}v=init.allClasses[b]
-if(v==null){u=init.functionAliases[b]
-if(u!=null){y=new H.ng(b,null,a)
-y.CM=new H.Ar(init.metadata[u],null,null,null,y)
-$.tY[b]=y
-return y}throw H.b(P.f("Cannot find class for: "+H.d(H.TS(a))))}t=v["@"]
-if(t==null){s=null
-r=null}else{s=t["^"]
-z=J.x(s)
-if(!!z.$iszM){r=z.Mu(s,1,z.gB(s)).br(0)
-s=z.t(s,0)}else r=null
-if(typeof s!=="string")s=""}z=J.uH(s,";")
+w=z.u8(b,"<")
+if(w!==-1){v=H.jO(z.Nj(b,0,w)).gJi()
+x=new H.bl(v,z.Nj(b,w+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,v.gIf())
+$.tY[b]=x
+return x}u=H.mN(b)
+if(u==null){t=init.functionAliases[b]
+if(t!=null){x=new H.ng(b,null,a)
+x.CM=new H.Ar(init.metadata[t],null,null,null,x)
+$.tY[b]=x
+return x}throw H.b(P.f("Cannot find class for: "+H.d(H.TS(a))))}s=H.SG(u)?u.constructor:u
+r=s["@"]
+if(r==null){q=null
+p=null}else{q=r["^"]
+z=J.x(q)
+if(!!z.$isList){p=z.Mu(q,1,z.gB(q)).br(0)
+q=z.t(q,0)}else p=null
+if(typeof q!=="string")q=""}z=J.uH(q,";")
 if(0>=z.length)return H.e(z,0)
-q=J.uH(z[0],"+")
-if(q.length>1&&$.Sl().t(0,b)==null)y=H.MJ(q,b)
-else{p=new H.Wf(b,v,s,r,H.Pq(),null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a)
-o=v.prototype["<>"]
-if(o==null||o.length===0)y=p
-else{for(z=o.length,n="dynamic",m=1;m<z;++m)n+=",dynamic"
-y=new H.bl(p,n,null,null,null,null,null,null,null,null,null,null,null,null,null,p.If)}}$.tY[b]=y
-return y},
-Vv:function(a){var z,y,x
+o=J.uH(z[0],"+")
+if(o.length>1&&$.Sl().t(0,b)==null)x=H.MJ(o,b)
+else{n=new H.Wf(b,u,q,p,H.Pq(),null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a)
+m=s.prototype["<>"]
+if(m==null||m.length===0)x=n
+else{for(z=m.length,l="dynamic",k=1;k<z;++k)l+=",dynamic"
+x=new H.bl(n,l,null,null,null,null,null,null,null,null,null,null,null,null,null,n.If)}}$.tY[b]=x
+return x},"$2","ER",4,0,null,146,[],149,[]],
+Vv:[function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},
-Fk:function(a){var z,y,x
+if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"$1","yM",2,0,null,150,[]],
+Fk:[function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.gxV())z.u(0,x.gIf(),x)}return z},
-EK:function(a,b){var z,y,x,w
+if(x.gxV())z.u(0,x.gIf(),x)}return z},"$1","Pj",2,0,null,150,[]],
+EK:[function(a,b){var z,y,x,w
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.glT()){w=x.gIf()
-if(b.Fb.t(0,w)!=null)continue
-z.u(0,x.gIf(),x)}}return z},
-vE:function(a,b){var z,y,x,w,v
+if(b.nb.t(0,w)!=null)continue
+z.u(0,x.gIf(),x)}}return z},"$2","rX",4,0,null,150,[],151,[]],
+vE:[function(a,b){var z,y,x,w,v
 z=P.L5(null,null,null,null,null)
 z.FV(0,b)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.ghB()){w=x.gIf().fN
 v=J.U6(w)
 if(!!J.x(z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))).$isRY)continue}if(x.gxV())continue
-z.to(x.gIf(),new H.YX(x))}return z},
-MJ:function(a,b){var z,y,x,w
+z.to(x.gIf(),new H.YX(x))}return z},"$2","un",4,0,null,150,[],152,[]],
+MJ:[function(a,b){var z,y,x,w
 z=[]
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();)z.push(H.jO(y.lo))
 x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
 x.G()
 w=x.lo
 for(;x.G();)w=new H.BI(w,x.lo,null,null,H.YC(b))
-return w},
-w2:function(a,b){var z,y,x
+return w},"$2","R9",4,0,null,153,[],149,[]],
+w2:[function(a,b){var z,y,x
 z=J.U6(a)
 y=0
 while(!0){x=z.gB(a)
 if(typeof x!=="number")return H.s(x)
 if(!(y<x))break
-if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(P.u("Type variable not present in list."))},
-Jf:function(a,b){var z,y,x,w,v,u,t
+if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(P.u("Type variable not present in list."))},"$2","CE",4,0,null,155,[],12,[]],
+Jf:[function(a,b){var z,y,x,w,v,u,t
 z={}
 z.a=null
 for(y=a;y!=null;){x=J.x(y)
@@ -3214,27 +3277,27 @@
 else{x=z.a
 if(x==null)w=H.Ko(b,null)
 else if(x.gHA())if(typeof b==="number"){v=init.metadata[b]
-u=z.a.gNy()
+u=x.gNy()
 return J.UQ(u,H.w2(u,J.O6(v)))}else w=H.Ko(b,null)
 else{z=new H.rh(z)
 if(typeof b==="number"){t=z.$1(b)
 if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.iW(z))}}if(w!=null)return H.jO(w)
-return P.re(C.yQ)},
-fb:function(a,b){if(a==null)return b
-return H.YC(H.d(a.gUx(a).fN)+"."+H.d(b.fN))},
-pj:function(a){var z,y,x,w
+return P.re(C.yQ)},"$2","xN",4,0,null,156,[],11,[]],
+fb:[function(a,b){if(a==null)return b
+return H.YC(H.d(J.GL(J.Ba(a)))+"."+H.d(b.fN))},"$2","WS",4,0,null,156,[],157,[]],
+pj:[function(a){var z,y,x,w
 z=a["@"]
 if(z!=null)return z()
 if(typeof a!="function")return C.xD
 if("$metadataIndex" in a){y=a.$reflectionInfo.splice(a.$metadataIndex)
 y.fixed$length=init
 return H.VM(new H.A8(y,new H.ye()),[null,null]).br(0)}x=Function.prototype.toString.call(a)
-w=C.xB.cn(x,new H.VR("\"[0-9,]*\";?[ \n\r]*}",H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
+w=C.xB.cn(x,new H.VR(H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
 if(w===-1)return C.xD;++w
-return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},
-jw:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
+return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"$1","C7",2,0,null,158,[]],
+jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=J.x(b)
-if(!!z.$iszM){y=H.Mk(z.t(b,0),",")
+if(!!z.$isList){y=H.Mk(z.t(b,0),",")
 x=z.Jk(b,1)}else{y=typeof b==="string"?H.Mk(b,","):[]
 x=null}for(z=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=x!=null,v=0;z.G();){u=z.lo
 if(w){t=v+1
@@ -3242,18 +3305,18 @@
 s=x[v]
 v=t}else s=null
 r=H.pS(u,s,a,c)
-if(r!=null)d.push(r)}},
-Mk:function(a,b){var z=J.U6(a)
-if(z.gl0(a)===!0)return H.VM([],[P.qU])
-return z.Fr(a,b)},
-BF:function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
-default:return!1}},
-Y6:function(a){var z,y
+if(r!=null)d.push(r)}},"$4","Sv",8,0,null,156,[],159,[],67,[],57,[]],
+Mk:[function(a,b){var z=J.U6(a)
+if(z.gl0(a)===!0)return H.VM([],[J.O])
+return z.Fr(a,b)},"$2","EO",4,0,null,14,[],106,[]],
+BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
+default:return!1}},"$1","IX",2,0,null,12,[]],
+Y6:[function(a){var z,y
 z=J.x(a)
 if(z.n(a,"^")||z.n(a,"$methodsWithOptionalArguments"))return!0
 y=z.t(a,0)
 z=J.x(y)
-return z.n(y,"*")||z.n(y,"+")},
+return z.n(y,"*")||z.n(y,"+")},"$1","uG",2,0,null,49,[]],
 Sn:{
 "^":"a;L5,F1>",
 gvU:function(){var z,y,x,w
@@ -3261,11 +3324,11 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=$.vK(),z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)for(x=J.GP(z.lo);x.G();){w=x.gl()
-y.u(0,w.gFP(),w)}z=H.VM(new P.Oh(y),[P.iD,P.D4])
+y.u(0,w.gFP(),w)}z=H.VM(new H.Oh(y),[P.iD,P.D4])
 this.L5=z
 return z},
-static:{"^":"QG,Q3,Ct",dF:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=P.L5(null,null,null,P.qU,[P.zM,P.D4])
+static:{"^":"QG,Q3,Ct",dF:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+z=P.L5(null,null,null,J.O,[J.Q,P.D4])
 y=init.libraries
 if(y==null)return z
 for(x=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);x.G();){w=x.lo
@@ -3279,10 +3342,10 @@
 o=v.t(w,6)
 n=v.t(w,7)
 m=q==null?C.xD:q()
-J.wT(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z}}},
+J.wT(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"$0","jc",0,0,null]}},
 nI:{
-"^":"Tp:22;",
-$0:function(){return H.VM([],[P.D4])},
+"^":"Tp:115;",
+$0:[function(){return H.VM([],[P.D4])},"$0",null,0,0,null,"call"],
 $isEH:true},
 jU:{
 "^":"a;",
@@ -3292,12 +3355,12 @@
 Lj:{
 "^":"jU;MA",
 gOO:function(){return"Isolate"},
-gcZ:function(){var z=$.Cm().gvU().Fb
+gcZ:function(){var z=$.Cm().gvU().nb
 return z.gUQ(z).XG(0,new H.mb())},
 $isQF:true},
 mb:{
-"^":"Tp:132;",
-$1:function(a){return a.gGD()},
+"^":"Tp:357;",
+$1:[function(a){return a.gGD()},"$1",null,2,0,null,356,[],"call"],
 $isEH:true},
 amu:{
 "^":"jU;If<",
@@ -3337,7 +3400,7 @@
 $isNL:true,
 $isQF:true},
 Uz:{
-"^":"uh;FP<,aP,wP,le,LB,GD<,ae,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
+"^":"uh;FP<,aP,wP,le,LB,GD<,ae<,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
 gOO:function(){return"LibraryMirror"},
 gUx:function(a){return this.If},
 gEO:function(){return this.gm8()},
@@ -3348,11 +3411,11 @@
 for(z=J.GP(this.aP);z.G();){x=H.jO(z.gl())
 if(!!J.x(x).$isMs){x=x.gJi()
 if(!!x.$isWf){y.u(0,x.If,x)
-x.jE=this}}}z=H.VM(new P.Oh(y),[P.wv,P.Ms])
+x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
 this.P8=z
 return z},
 rN:function(a){var z,y
-z=this.gQH().Fb.t(0,a)
+z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,[],null,null))
 if(!J.x(z).$isRS)return H.vn(z.IB(this))
 if(z.glT())return H.vn(z.IB(this))
@@ -3360,7 +3423,7 @@
 if(y==null)throw H.b(P.SY(null))
 return H.vn(y())},
 F2:function(a,b,c){var z,y,x
-z=this.gQH().Fb.t(0,a)
+z=this.gQH().nb.t(0,a)
 y=!!J.x(z).$isZk
 if(y&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
 if(z!=null)x=y&&z.hB
@@ -3402,17 +3465,17 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.gm8(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-if(!x.gxV())y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RS])
+if(!x.gxV())y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RS])
 this.mX=z
 return z},
 gF4:function(){var z=this.T1
 if(z!=null)return z
-z=H.VM(new P.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
+z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
 this.T1=z
 return z},
 gM1:function(){var z=this.fX
 if(z!=null)return z
-z=H.VM(new P.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
+z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
 this.fX=z
 return z},
 gcc:function(){var z,y,x
@@ -3420,7 +3483,7 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
 this.M2=z
 return z},
 gQH:function(){var z,y
@@ -3430,19 +3493,19 @@
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
 z=new H.IB(y)
-this.gQn().Fb.aN(0,z)
-this.gF4().Fb.aN(0,z)
-this.gM1().Fb.aN(0,z)
-this.gcc().Fb.aN(0,z)
-z=H.VM(new P.Oh(y),[P.wv,P.QF])
+this.gQn().nb.aN(0,z)
+this.gF4().nb.aN(0,z)
+this.gM1().nb.aN(0,z)
+this.gcc().nb.aN(0,z)
+z=H.VM(new H.Oh(y),[P.wv,P.QF])
 this.uA=z
 return z},
 gYK:function(){var z,y
 z=this.Db
 if(z!=null)return z
 y=P.L5(null,null,null,P.wv,P.NL)
-this.gQH().Fb.aN(0,new H.oP(y))
-z=H.VM(new P.Oh(y),[P.wv,P.NL])
+this.gQH().nb.aN(0,new H.oP(y))
+z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
 gc9:function(){var z=this.xO
@@ -3458,16 +3521,16 @@
 "^":"amu+M2;",
 $isQF:true},
 IB:{
-"^":"Tp:133;a",
-$2:function(a,b){this.a.u(0,a,b)},
+"^":"Tp:358;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 oP:{
-"^":"Tp:133;a",
-$2:function(a,b){this.a.u(0,a,b)},
+"^":"Tp:358;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 YX:{
-"^":"Tp:22;a",
-$0:function(){return this.a},
+"^":"Tp:115;a",
+$0:[function(){return this.a},"$0",null,0,0,null,"call"],
 $isEH:true},
 BI:{
 "^":"Un;AY<,XW,BB,i1,If",
@@ -3502,9 +3565,7 @@
 $isQF:true},
 iu:{
 "^":"M2;Ax<,xq",
-gt5:function(a){var z=this.Ax
-if(z==null)return P.re(C.Qf)
-return H.jO(H.dJ(z))},
+gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
 F2:function(a,b,c){return this.tu(a,0,b,c==null?C.CM:c)},
 CI:function(a,b){return this.F2(a,b,null)},
 Z7:function(a,b,c){var z,y,x,w,v,u,t,s
@@ -3598,12 +3659,12 @@
 $isvr:true,
 $isQF:true},
 vo:{
-"^":"Tp:134;a",
-$2:function(a,b){var z,y
+"^":"Tp:359;a",
+$2:[function(a,b){var z,y
 z=J.GL(a)
 y=this.a
 if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"$2",null,4,0,null,146,[],30,[],"call"],
 $isEH:true},
 bl:{
 "^":"amu;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,yF,If",
@@ -3637,7 +3698,7 @@
 return z},
 gEz:function(){var z=this.b0
 if(z!=null)return z
-z=H.VM(new P.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
+z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
 this.b0=z
 return z},
 gcc:function(){var z,y,x
@@ -3645,12 +3706,12 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.NK.ws(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
 this.M2=z
 return z},
 gQH:function(){var z=this.uA
 if(z!=null)return z
-z=H.VM(new P.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.NL])
+z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.NL])
 this.uA=z
 return z},
 gYK:function(){var z,y
@@ -3660,7 +3721,7 @@
 y.FV(0,this.gQH())
 y.FV(0,this.gEz())
 J.kH(this.NK.gNy(),new H.Ax(y))
-z=H.VM(new P.Oh(y),[P.wv,P.NL])
+z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
 rN:function(a){return this.NK.rN(a)},
@@ -3691,37 +3752,40 @@
 $isX9:true,
 $isNL:true},
 tB:{
-"^":"Tp:8;a",
-$1:function(a){var z,y,x
+"^":"Tp:32;a",
+$1:[function(a){var z,y,x
 z=H.BU(a,null,new H.Oo())
 y=this.a
 if(J.de(z,-1))y.push(H.jO(J.rr(a)))
 else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"$1",null,2,0,null,360,[],"call"],
 $isEH:true},
 Oo:{
-"^":"Tp:16;",
-$1:function(a){return-1},
+"^":"Tp:116;",
+$1:[function(a){return-1},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 Tc:{
-"^":"Tp:16;b",
-$1:function(a){return this.b.$1(a)},
+"^":"Tp:116;b",
+$1:[function(a){return this.b.$1(a)},"$1",null,2,0,null,95,[],"call"],
 $isEH:true},
 Ax:{
-"^":"Tp:16;a",
-$1:function(a){this.a.u(0,a.gIf(),a)
-return a},
+"^":"Tp:116;a",
+$1:[function(a){this.a.u(0,a.gIf(),a)
+return a},"$1",null,2,0,null,361,[],"call"],
 $isEH:true},
 Wf:{
-"^":"vk;Cr<,aB<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
+"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
 gOO:function(){return"ClassMirror"},
+gaB:function(){var z=this.Tx
+if(H.SG(z))return z.constructor
+else return z},
 gEz:function(){var z=this.b0
 if(z!=null)return z
-z=H.VM(new P.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
+z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
 this.b0=z
 return z},
 ly:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=this.aB.prototype
+z=this.gaB().prototype
 y=H.kU(z)
 x=H.VM([],[H.Zk])
 for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){v=w.lo
@@ -3735,7 +3799,7 @@
 s.jE=a}y=H.kU(init.statics[this.Cr])
 for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){r=w.lo
 if(H.Y6(r))continue
-q=this.gXP().ae[r]
+q=this.gXP().gae()[r]
 if("$reflectable" in q){p=q.$reflectionName
 if(p==null)continue
 o=C.xB.nC(p,"new ")
@@ -3767,12 +3831,12 @@
 return z},
 ghp:function(){var z=this.FU
 if(z!=null)return z
-z=H.VM(new P.Oh(H.Vv(this.gEO())),[P.wv,P.RS])
+z=H.VM(new H.Oh(H.Vv(this.gEO())),[P.wv,P.RS])
 this.FU=z
 return z},
 gF4:function(){var z=this.T1
 if(z!=null)return z
-z=H.VM(new P.Oh(H.EK(this.gEO(),this.gcc())),[P.wv,P.RS])
+z=H.VM(new H.Oh(H.EK(this.gEO(),this.gcc())),[P.wv,P.RS])
 this.T1=z
 return z},
 gcc:function(){var z,y,x
@@ -3780,12 +3844,12 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
 this.M2=z
 return z},
 gQH:function(){var z=this.uA
 if(z!=null)return z
-z=H.VM(new P.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
+z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
 this.uA=z
 return z},
 gYK:function(){var z,y
@@ -3793,41 +3857,41 @@
 if(z!=null)return z
 y=P.L5(null,null,null,P.wv,P.NL)
 z=new H.Ei(y)
-this.gQH().Fb.aN(0,z)
-this.gEz().Fb.aN(0,z)
+this.gQH().nb.aN(0,z)
+this.gEz().nb.aN(0,z)
 J.kH(this.gNy(),new H.Ci(y))
-z=H.VM(new P.Oh(y),[P.wv,P.NL])
+z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
 Ve:function(a){var z,y
-z=this.gcc().Fb.t(0,a)
+z=this.gcc().nb.t(0,a)
 if(z!=null)return z.gFo()
-y=this.gF4().Fb.t(0,a)
+y=this.gF4().nb.t(0,a)
 return y!=null&&y.gFo()},
 rN:function(a){var z,y,x,w
-z=this.gcc().Fb.t(0,a)
+z=this.gcc().nb.t(0,a)
 if(z!=null&&z.gFo()){y=z.gcK()
 if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
 if(y in init.lazies)return H.vn($[init.lazies[y]]())
-else return H.vn($[y])}x=this.gF4().Fb.t(0,a)
+else return H.vn($[y])}x=this.gF4().nb.t(0,a)
 if(x!=null&&x.gFo())return H.vn(x.jd(C.xD,C.CM))
-w=this.ghp().Fb.t(0,a)
+w=this.ghp().nb.t(0,a)
 if(w!=null&&w.gFo()){x=w.gdl().$getter
 if(x==null)throw H.b(P.SY(null))
 return H.vn(x())}throw H.b(P.lr(this,a,null,null,null))},
 gXP:function(){var z,y
 z=this.jE
-if(z==null){z=$.vK()
+if(z==null){if(H.SG(this.Tx))this.jE=H.jO(C.nY.LU).gXP()
+else{z=$.vK()
 z=z.gUQ(z)
 y=new H.MH(null,J.GP(z.l6),z.T6)
 y.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()
-z=this.jE
+for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()}z=this.jE
 if(z==null)throw H.b(P.w("Class \""+H.d(H.TS(this.If))+"\" has no owner"))}return z},
 gc9:function(){var z=this.xO
 if(z!=null)return z
 z=this.le
-if(z==null){z=H.pj(this.aB.prototype)
+if(z==null){z=H.pj(this.gaB().prototype)
 this.le=z}z=H.VM(new P.Yp(J.kl(z,H.Yf())),[P.vr])
 this.xO=z
 return z},
@@ -3847,7 +3911,7 @@
 this.qN=z}else{z=x.n(w,"")?this:H.jO(w)
 this.qN=z}}}return J.de(z,this)?null:this.qN},
 F2:function(a,b,c){var z,y
-z=this.ghp().Fb.t(0,a)
+z=this.ghp().nb.t(0,a)
 y=z==null
 if(y&&this.Ve(a))return this.rN(a).F2(C.Ka,b,c)
 if(y||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
@@ -3869,7 +3933,7 @@
 z=this.UF
 if(z!=null)return z
 y=[]
-x=this.aB.prototype["<>"]
+x=this.gaB().prototype["<>"]
 if(x==null)return y
 for(w=0;w<x.length;++w){z=x[w]
 v=init.metadata[z]
@@ -3888,17 +3952,17 @@
 "^":"EE+M2;",
 $isQF:true},
 Ei:{
-"^":"Tp:133;a",
-$2:function(a,b){this.a.u(0,a,b)},
+"^":"Tp:358;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 Ci:{
-"^":"Tp:16;b",
-$1:function(a){this.b.u(0,a.gIf(),a)
-return a},
+"^":"Tp:116;b",
+$1:[function(a){this.b.u(0,a.gIf(),a)
+return a},"$1",null,2,0,null,361,[],"call"],
 $isEH:true},
 t0:{
-"^":"Tp:136;a",
-$1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,135,[],"call"],
+"^":"Tp:362;a",
+$1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,334,[],"call"],
 $isEH:true},
 XJ:{
 "^":"amu;cK<,V5>,Fo<,n6,jE,Ay>,le,If",
@@ -3937,10 +4001,10 @@
 v.$builtinTypeInfo=[H.Kp(y,0)]
 for(;t=!0,v.G();)if(J.de(v.lo.gIf(),o)){t=!1
 break}}if(1>=z.length)return H.e(z,1)
-return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:function(a){if(a>=60&&a<=64)return a-59
+return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
 if(a>=123&&a<=126)return a-117
 if(a>=37&&a<=43)return a-27
-return 0}}},
+return 0},"$1","Na",2,0,null,154,[]]}},
 Sz:{
 "^":"iu;Ax,xq",
 gMj:function(a){var z,y,x,w,v,u,t,s
@@ -3983,8 +4047,8 @@
 v=H.zh(z)
 if(v!=null){u=v.AM
 if(typeof u==="number"&&Math.floor(u)===u)t=new H.Ar(v.hl(null),null,null,null,this)
-else t=this.gXP()!=null&&!!J.x(this.gXP()).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gaB()),null,null,null,this.jE)
-if(this.xV)this.wM=this.jE
+else{z=this.gXP()
+t=z!=null&&!!J.x(z).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
 else this.wM=t.gdw()
 s=v.Mo
 for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.Rv,q=v.Rn,p=v.hG,o=0;z.G();o=h){n=z.lo
@@ -4036,8 +4100,8 @@
 $isNL:true,
 $isQF:true},
 wt:{
-"^":"Tp:137;",
-$1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,135,[],"call"],
+"^":"Tp:363;",
+$1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,334,[],"call"],
 $isEH:true},
 ng:{
 "^":"amu;Cr<,CM,If",
@@ -4092,22 +4156,19 @@
 y.push(new H.fu(this,z.named[u],!1,!1,null,C.iH,H.YC(u)))}z=H.VM(new P.Yp(y),[P.Ys])
 this.zM=z
 return z},
-Hu:function(a){var z=init.mangledGlobalNames[a]
-if(z!=null)return z
-return a},
 bu:function(a){var z,y,x,w,v,u
 z=this.o3
 if(z!=null)return z
 z=this.d9
 if("args" in z)for(y=z.args,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x="FunctionTypeMirror on '(",w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,this.Hu(H.Ko(v,null)))}else{x="FunctionTypeMirror on '("
+x=C.xB.g(x+w,H.Ko(v,null))}else{x="FunctionTypeMirror on '("
 w=""}if("opt" in z){x+=w+"["
 for(y=z.opt,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,this.Hu(H.Ko(v,null)))}x+="]"}if("named" in z){x+=w+"{"
+x=C.xB.g(x+w,H.Ko(v,null))}x+="]"}if("named" in z){x+=w+"{"
 for(y=H.kU(z.named),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){u=y.lo
-x=C.xB.g(x+w+(H.d(u)+": "),this.Hu(H.Ko(z.named[u],null)))}x+="}"}x+=") -> "
+x=C.xB.g(x+w+(H.d(u)+": "),H.Ko(z.named[u],null))}x+="}"}x+=") -> "
 if(!!z.void)x+="void"
-else x="ret" in z?C.xB.g(x,this.Hu(H.Ko(z.ret,null))):x+"dynamic"
+else x="ret" in z?C.xB.g(x,H.Ko(z.ret,null)):x+"dynamic"
 z=x+"'"
 this.o3=z
 return z},
@@ -4119,151 +4180,170 @@
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:138;a",
-$1:function(a){var z,y,x
+"^":"Tp:364;a",
+$1:[function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
 x=H.w2(y.a.gNy(),J.O6(z))
-return J.UQ(y.a.gw8(),x)},
+return J.UQ(y.a.gw8(),x)},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 iW:{
-"^":"Tp:18;b",
-$1:function(a){var z,y
+"^":"Tp:121;b",
+$1:[function(a){var z,y
 z=this.b.$1(a)
 y=J.x(z)
 if(!!y.$iscw)return H.d(z.Nz)
 if(!y.$isWf&&!y.$isbl)if(y.n(z,$.P8()))return"dynamic"
 else if(y.n(z,$.oj()))return"void"
 else return"dynamic"
-return z.gCr()},
+return z.gCr()},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 ye:{
-"^":"Tp:137;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,135,[],"call"],
+"^":"Tp:363;",
+$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,334,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:137;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,135,[],"call"],
-$isEH:true}}],["dart._js_names","dart:_js_names",,H,{
+"^":"Tp:363;",
+$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,334,[],"call"],
+$isEH:true},
+Oh:{
+"^":"a;nb",
+gB:function(a){return this.nb.X5},
+gl0:function(a){return this.nb.X5===0},
+gor:function(a){return this.nb.X5!==0},
+t:function(a,b){return this.nb.t(0,b)},
+x4:function(a){return this.nb.x4(a)},
+di:function(a){return this.nb.di(a)},
+aN:function(a,b){return this.nb.aN(0,b)},
+gvc:function(){var z=this.nb
+return H.VM(new P.i5(z),[H.Kp(z,0)])},
+gUQ:function(a){var z=this.nb
+return z.gUQ(z)},
+u:function(a,b,c){return H.kT()},
+FV:function(a,b){return H.kT()},
+Rz:function(a,b){H.kT()},
+V1:function(a){return H.kT()},
+$isZ0:true,
+static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","lY",0,0,null]}}}],["dart._js_names","dart:_js_names",,H,{
 "^":"",
-hY:function(a,b){var z,y,x,w,v,u,t
+hY:[function(a,b){var z,y,x,w,v,u,t
 z=H.kU(a)
-y=P.Fl(P.qU,P.qU)
+y=P.Fl(J.O,J.O)
 for(x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),w=!b;x.G();){v=x.lo
 u=a[v]
 y.u(0,v,u)
 if(w){t=J.rY(v)
-if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},
-YK:function(a){var z=P.Fl(P.qU,P.qU)
+if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"$2","Il",4,0,null,160,[],161,[]],
+YK:[function(a){var z=P.Fl(J.O,J.O)
 a.aN(0,new H.Xh(z))
-return z},
-kU:function(a){var z=H.VM(function(b,c){var y=[]
+return z},"$1","OX",2,0,null,162,[]],
+kU:[function(a){var z=H.VM(function(b,c){var y=[]
 for(var x in b){if(c.call(b,x))y.push(x)}return y}(a,Object.prototype.hasOwnProperty),[null])
 z.fixed$length=init
-return z},
+return z},"$1","DF",2,0,null,158,[]],
 Xh:{
-"^":"Tp:139;a",
-$2:function(a,b){this.a.u(0,b,a)},
+"^":"Tp:366;a",
+$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,149,[],365,[],"call"],
 $isEH:true}}],["dart.async","dart:async",,P,{
 "^":"",
-Oj:function(){if($.jk().scheduleImmediate!=null)return P.Sx()
-return P.K7()},
+Oj:[function(){if($.jk().scheduleImmediate!=null)return P.Sx()
+return P.K7()},"$0","n9",0,0,null],
 ZV:[function(a){++init.globalState.Xz.GL
-$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,25],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,25],
-VH:function(a,b){var z=H.N7()
+$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,163,164,[]],
+Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,163,164,[]],
+VH:[function(a,b){var z=H.N7()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
-else return b.cR(a)},
+else return b.cR(a)},"$2","zZ",4,0,null,165,[],166,[]],
 e4:function(a,b){var z=P.Dt(b)
 P.rT(C.ny,new P.ZC(a,z))
 return z},
-Cx:function(){var z=$.S6
+Cx:[function(){var z=$.S6
 for(;z!=null;){J.cG(z)
 z=z.gaw()
-$.S6=z}$.k8=null},
+$.S6=z}$.k8=null},"$0","BN",0,0,null],
 BG:[function(){var z
 try{P.Cx()}catch(z){H.Ru(z)
 $.ej().$1(P.qZ())
 $.S6=$.S6.gaw()
-throw z}},"$0","qZ",0,0,21],
-IA:function(a){var z,y
+throw z}},"$0","qZ",0,0,126],
+IA:[function(a){var z,y
 z=$.k8
 if(z==null){z=new P.OM(a,null)
 $.k8=z
 $.S6=z
 $.ej().$1(P.qZ())}else{y=new P.OM(a,null)
 z.aw=y
-$.k8=y}},
-rb:function(a){var z
+$.k8=y}},"$1","e6",2,0,null,164,[]],
+rb:[function(a){var z
 if(J.de($.X3,C.NU)){$.X3.wr(a)
 return}z=$.X3
-z.wr(z.xi(a,!0))},
+z.wr(z.xi(a,!0))},"$1","Rf",2,0,null,164,[]],
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
 z.SJ=z
 z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
 z.SJ=z
 z.iE=z}return z},
-ot:function(a){var z,y,x,w,v
+ot:[function(a){var z,y,x,w,v
 if(a==null)return
 try{z=a.$0()
 if(!!J.x(z).$isb8)return z
 return}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-$.X3.hk(y,x)}},
-YE:[function(a){},"$1","bZ",2,0,26,27,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,28,29,30,[],31,[]],
-dL:[function(){},"$0","v3",0,0,21],
-FE:function(a,b,c){var z,y,x,w
+$.X3.hk(y,x)}},"$1","DC",2,0,null,168,[]],
+YE:[function(a){},"$1","bZ",2,0,169,30,[]],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,170,85,171,[],172,[]],
+dL:[function(){},"$0","v3",0,0,126],
+FE:[function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
-c.$2(z,y)}},
-NX:function(a,b,c,d){a.ed()
-b.K5(c,d)},
-TB:function(a,b){return new P.uR(a,b)},
-Bb:function(a,b,c){a.ed()
-b.rX(c)},
+c.$2(z,y)}},"$3","mc",6,0,null,173,[],174,[],175,[]],
+NX:[function(a,b,c,d){a.ed()
+b.K5(c,d)},"$4","QD",8,0,null,176,[],177,[],171,[],172,[]],
+TB:[function(a,b){return new P.uR(a,b)},"$2","cH",4,0,null,176,[],177,[]],
+Bb:[function(a,b,c){a.ed()
+b.rX(c)},"$3","E1",6,0,null,176,[],177,[],30,[]],
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
-jL:function(a,b){var z=a.gVs()
-return H.cy(z<0?0:z,b)},
-PJ:function(a){var z=$.X3
+jL:[function(a,b){var z=a.gVs()
+return H.cy(z<0?0:z,b)},"$2","et",4,0,null,178,[],164,[]],
+PJ:[function(a){var z=$.X3
 $.X3=a
-return z},
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","Gx",10,0,32,33,[],34,[],35,[],30,[],31,[]],
+return z},"$1","kb",2,0,null,166,[]],
+L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","Gx",10,0,179,180,[],181,[],166,[],171,[],172,[]],
 T8:[function(a,b,c,d){var z,y
 if(J.de($.X3,c))return d.$0()
 z=P.PJ(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","AI",8,0,36,33,[],34,[],35,[],37,[]],
+return y}finally{$.X3=z}},"$4","AI",8,0,182,180,[],181,[],166,[],128,[]],
 V7:[function(a,b,c,d,e){var z,y
 if(J.de($.X3,c))return d.$1(e)
 z=P.PJ(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,38,33,[],34,[],35,[],37,[],39,[]],
+return y}finally{$.X3=z}},"$5","MM",10,0,183,180,[],181,[],166,[],128,[],184,[]],
 Qx:[function(a,b,c,d,e,f){var z,y
 if(J.de($.X3,c))return d.$2(e,f)
 z=P.PJ(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","l4",12,0,40,33,[],34,[],35,[],37,[],12,[],13,[]],
-Ee:[function(a,b,c,d){return d},"$4","EU",8,0,41,33,[],34,[],35,[],37,[]],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,42,33,[],34,[],35,[],37,[]],
-VI:[function(a,b,c,d){return d},"$4","uu",8,0,43,33,[],34,[],35,[],37,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,44],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,45,33,[],34,[],35,[],46,[],47,[]],
-XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,48],
-CI:[function(a){J.O2($.X3,a)},"$1","jt",2,0,49],
+return y}finally{$.X3=z}},"$6","l4",12,0,185,180,[],181,[],166,[],128,[],60,[],61,[]],
+Ee:[function(a,b,c,d){return d},"$4","EU",8,0,186,180,[],181,[],166,[],128,[]],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,187,180,[],181,[],166,[],128,[]],
+VI:[function(a,b,c,d){return d},"$4","uu",8,0,188,180,[],181,[],166,[],128,[]],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,189,180,[],181,[],166,[],128,[]],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,190,180,[],181,[],166,[],178,[],164,[]],
+XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,191,180,[],181,[],166,[],192,[]],
+CI:[function(a){J.O2($.X3,a)},"$1","Ib",2,0,193,192,[]],
 UA:[function(a,b,c,d,e){var z
-$.oK=P.jt()
+$.oK=P.Ib()
 z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","hn",10,0,50],
+return new P.uo(c,d,z)},"$5","hn",10,0,194,180,[],181,[],166,[],195,[],196,[]],
 C6:{
-"^":"Tp:22;a",
+"^":"Tp:115;a",
 $0:[function(){H.ox()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -4273,7 +4353,7 @@
 Ik:{
 "^":"O9;Y8"},
 JI:{
-"^":"yU;Ae@,iE@,SJ@,Y8,dB,o7,Bd,Lj,Gv,lz,Ri",
+"^":"yU;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,Ri",
 gY8:function(){return this.Y8},
 uR:function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
@@ -4290,9 +4370,9 @@
 gHj:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,21],
-LP:[function(){},"$0","gZ9",0,0,21],
-static:{"^":"E2b,RG,cP"}},
+uO:[function(){},"$0","gp4",0,0,126],
+LP:[function(){},"$0","gZ9",0,0,126],
+static:{"^":"FJ,RG,cP"}},
 WVu:{
 "^":"a;iE@,SJ@",
 gRW:function(){return!1},
@@ -4316,9 +4396,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.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},140,[]],
+this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},248,[]],
 fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,141,29,30,[],31,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,367,85,171,[],172,[]],
 cO:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
@@ -4370,17 +4450,17 @@
 else this.Ip.OH(null)}},
 tK:{
 "^":"Tp;a,b",
-$1:function(a){a.Rg(0,this.b)},
+$1:[function(a){a.Rg(0,this.b)},"$1",null,2,0,null,176,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 OR:{
 "^":"Tp;a,b,c",
-$1:function(a){a.V8(this.b,this.c)},
+$1:[function(a){a.V8(this.b,this.c)},"$1",null,2,0,null,176,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 Bg:{
 "^":"Tp;a",
-$1:function(a){a.Qj()},
+$1:[function(a){a.Qj()},"$1",null,2,0,null,176,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"WhE",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
@@ -4398,7 +4478,7 @@
 "^":"a;",
 $isb8:true},
 ZC:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
 z=w
@@ -4411,12 +4491,12 @@
 "^":"Pf0;MM",
 oo:[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.oo(a,null)},"tZ","$1","$0","gv6",0,2,142,29,27,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","$1","$0","gv6",0,2,368,85,30,[]],
 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,141,29,30,[],31,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,367,85,171,[],172,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -4473,7 +4553,7 @@
 P.HZ(this,z)},
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,28,29,30,[],31,[]],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,170,85,171,[],172,[]],
 OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
@@ -4494,15 +4574,15 @@
 z.L7(a,b)
 return z},Vu:function(a,b,c){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
-return z},k3:function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},A9:function(a,b){b.swG(!0)
+return z},k3:[function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},"$2","KP",4,0,null,33,[],82,[]],A9:[function(a,b){b.swG(!0)
 if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},yE:function(a,b){var z
+else a.au(b)},"$2","dd",4,0,null,33,[],82,[]],yE:[function(a,b){var z
 do{z=b.gBQ()
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q
+continue}else break}while(!0)},"$2","cN",4,0,null,33,[],167,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -4540,44 +4620,44 @@
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=q}}}},
+b=q}},"$2","XX",4,0,null,33,[],167,[]]}},
 da:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 pV:{
-"^":"Tp:16;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,27,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 U7:{
-"^":"Tp:143;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,29,30,[],31,[],"call"],
+"^":"Tp:369;b",
+$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
 $isEH:true},
 rH:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cX:{
-"^":"Tp:22;c,d",
+"^":"Tp:115;c,d",
 $0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"Tp:22;a,b,c",
+"^":"Tp:115;a,b,c",
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:126;b,d,e,f",
-$0:function(){var z,y,x,w
+"^":"Tp:307;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)
 z=w
 y=new H.XO(x,null)
 this.b.c=new P.Ca(z,y)
-return!1}},
+return!1}},"$0",null,0,0,null,"call"],
 $isEH:true},
 RW:{
-"^":"Tp:21;c,b,UI,bK",
-$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+"^":"Tp:126;c,b,UI,bK",
+$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
 r=this.UI
 y=r.gyK()
@@ -4609,11 +4689,11 @@
 r.b=!1
 return}this.b.b=!0}else{r=this.b
 r.c=z
-r.b=!1}},
+r.b=!1}},"$0",null,0,0,null,"call"],
 $isEH:true},
 RT:{
-"^":"Tp:21;c,b,Gq,Rm,w3",
-$0:function(){var z,y,x,w,v,u
+"^":"Tp:126;c,b,Gq,Rm,w3",
+$0:[function(){var z,y,x,w,v,u
 z={}
 z.a=null
 try{z.a=this.w3.Gr(this.Rm.gIa())}catch(w){v=H.Ru(w)
@@ -4629,30 +4709,30 @@
 u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
 v.swG(!0)
 this.b.d=!0
-z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},
+z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"$0",null,0,0,null,"call"],
 $isEH:true},
 jZ:{
-"^":"Tp:16;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,144,[],"call"],
+"^":"Tp:116;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,370,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:143;a,mG",
+"^":"Tp:369;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isvs){y=P.Dt(null)
 z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,29,30,[],31,[],"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
 qh:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")}],
-Ft:[function(a,b){return H.VM(new P.aW(b,this),[H.ip(this,"qh",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.qh,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"qh")}],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")},371,[]],
+Ft:[function(a,b){return H.VM(new P.aW(b,this),[H.ip(this,"qh",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.qh,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"qh")},371,[]],
 tg:function(a,b){var z,y
 z={}
-y=P.Dt(P.a2)
+y=P.Dt(J.kn)
 z.a=null
 z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.YJ(y),y.gaq())
 return y},
@@ -4664,25 +4744,25 @@
 return y},
 Vr:function(a,b){var z,y
 z={}
-y=P.Dt(P.a2)
+y=P.Dt(J.kn)
 z.a=null
 z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gaq())
 return y},
 gB:function(a){var z,y
 z={}
-y=P.Dt(P.KN)
+y=P.Dt(J.bU)
 z.a=0
 this.KR(new P.B5(z),!0,new P.PI(z,y),y.gaq())
 return y},
 gl0:function(a){var z,y
 z={}
-y=P.Dt(P.a2)
+y=P.Dt(J.kn)
 z.a=null
 z.a=this.KR(new P.j4(z,y),!0,new P.i9(y),y.gaq())
 return y},
 br:function(a){var z,y
 z=H.VM([],[H.ip(this,"qh",0)])
-y=P.Dt([P.zM,H.ip(this,"qh",0)])
+y=P.Dt([J.Q,H.ip(this,"qh",0)])
 this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gaq())
 return y},
 qZ:function(a,b){var z=H.VM(new P.Zz(b,this),[null])
@@ -4718,36 +4798,36 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.jv(this.c,a),new P.bi(z,y),P.TB(z.a,y))},"$1",null,2,0,null,145,[],"call"],
+P.FE(new P.jv(this.c,a),new P.bi(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 jv:{
-"^":"Tp:22;e,f",
-$0:function(){return J.de(this.f,this.e)},
+"^":"Tp:115;e,f",
+$0:[function(){return J.de(this.f,this.e)},"$0",null,0,0,null,"call"],
 $isEH:true},
 bi:{
-"^":"Tp:127;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
+"^":"Tp:310;a,UI",
+$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,372,[],"call"],
 $isEH:true},
 YJ:{
-"^":"Tp:22;bK",
+"^":"Tp:115;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.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,145,[],"call"],
+$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,142,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Rl:{
-"^":"Tp:22;e,f",
-$0:function(){return this.e.$1(this.f)},
+"^":"Tp:115;e,f",
+$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Jb:{
-"^":"Tp:16;",
-$1:function(a){},
+"^":"Tp:116;",
+$1:[function(a){},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 M4:{
-"^":"Tp:22;UI",
+"^":"Tp:115;UI",
 $0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Jp:{
@@ -4755,64 +4835,64 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"$1",null,2,0,null,145,[],"call"],
+P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 h7:{
-"^":"Tp:22;e,f",
-$0:function(){return this.e.$1(this.f)},
+"^":"Tp:115;e,f",
+$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 pr:{
-"^":"Tp:127;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
+"^":"Tp:310;a,UI",
+$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,372,[],"call"],
 $isEH:true},
 eN:{
-"^":"Tp:22;bK",
+"^":"Tp:115;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 B5:{
-"^":"Tp:16;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,17,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){++this.a.a},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 PI:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 j4:{
-"^":"Tp:16;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,17,[],"call"],
+"^":"Tp:116;a,b",
+$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 i9:{
-"^":"Tp:22;c",
+"^":"Tp:115;c",
 $0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
 VV:{
 "^":"Tp;a,b",
-$1:[function(a){this.b.push(a)},"$1",null,2,0,null,140,[],"call"],
+$1:[function(a){this.b.push(a)},"$1",null,2,0,null,248,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.a,"qh")}},
 Dy:{
-"^":"Tp:22;c,d",
+"^":"Tp:115;c,d",
 $0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lU:{
 "^":"Tp;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,27,[],"call"],
+$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 OC:{
-"^":"Tp:22;d",
+"^":"Tp:115;d",
 $0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
 "^":"Tp;a,b",
 $1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"$1",null,2,0,null,27,[],"call"],
+z.a=a},"$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Z5:{
-"^":"Tp:22;a,c",
+"^":"Tp:115;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"],
@@ -4821,11 +4901,11 @@
 "^":"Tp;a,b,c",
 $1:[function(a){var z=this.a
 if(J.de(z.a,0)){P.Bb(z.b,this.c,a)
-return}z.a=J.xH(z.a,1)},"$1",null,2,0,null,27,[],"call"],
+return}z.a=J.xH(z.a,1)},"$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 ii:{
-"^":"Tp:22;a,d",
+"^":"Tp:115;a,d",
 $0:[function(){this.d.Lp(new P.bJ("value "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
 $isEH:true},
 MO:{
@@ -4858,13 +4938,13 @@
 yU:{
 "^":"KA;Y8<",
 tA:function(){return this.gY8().j0(this)},
-uO:[function(){this.gY8()},"$0","gp4",0,0,21],
-LP:[function(){this.gY8()},"$0","gZ9",0,0,21]},
+uO:[function(){this.gY8()},"$0","gp4",0,0,126],
+LP:[function(){this.gY8()},"$0","gZ9",0,0,126]},
 nP:{
 "^":"a;"},
 KA:{
-"^":"a;dB,o7<,Bd,Lj<,Gv,lz,Ri",
-fe:function(a){this.dB=this.Lj.cR(a)},
+"^":"a;pN,o7<,Bd,Lj<,Gv,lz,Ri",
+fe:function(a){this.pN=this.Lj.cR(a)},
 fm:function(a,b){if(b==null)b=P.AY()
 this.o7=P.VH(b,this.Lj)},
 y5:function(a){if(a==null)a=P.v3()
@@ -4911,8 +4991,8 @@
 this.Gv=z
 if(z<32)this.SY()
 else this.w6(C.Wj)},
-uO:[function(){},"$0","gp4",0,0,21],
-LP:[function(){},"$0","gZ9",0,0,21],
+uO:[function(){},"$0","gp4",0,0,126],
+LP:[function(){},"$0","gZ9",0,0,126],
 tA:function(){},
 w6:function(a){var z,y
 z=this.Ri
@@ -4924,7 +5004,7 @@
 if(y<128)this.Ri.t2(this)}},
 Iv:function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
-this.Lj.m1(this.dB,a)
+this.Lj.m1(this.pN,a)
 this.Gv=(this.Gv&4294967263)>>>0
 this.Kl((z&4)!==0)},
 pb:function(a,b){var z,y
@@ -4959,10 +5039,10 @@
 z=(this.Gv&4294967263)>>>0
 this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},
 $isMO:true,
-static:{"^":"ry,bG,Q9,wd,yJ,lk,HX,GC,bsZ"}},
+static:{"^":"ry,bG,Q9,wd,yJ,Dr,HX,GC,bsZ"}},
 Vo:{
-"^":"Tp:21;a,b,c",
-$0:function(){var z,y,x,w,v,u
+"^":"Tp:126;a,b,c",
+$0:[function(){var z,y,x,w,v
 z=this.a
 y=z.Gv
 if((y&8)!==0&&(y&16)===0)return
@@ -4972,20 +5052,19 @@
 else{x=z.o7
 w=H.N7()
 w=H.KT(w,[w,w]).BD(x)
-v=z.o7
-u=this.b
-if(w)y.z8(v,u,this.c)
-else y.m1(v,u)}z.Gv=(z.Gv&4294967263)>>>0},
+v=this.b
+if(w)y.z8(x,v,this.c)
+else y.m1(x,v)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
 qB:{
-"^":"Tp:21;a",
-$0:function(){var z,y
+"^":"Tp:126;a",
+$0:[function(){var z,y
 z=this.a
 y=z.Gv
 if((y&16)===0)return
 z.Gv=(y|42)>>>0
 z.Lj.bH(z.Bd)
-z.Gv=(z.Gv&4294967263)>>>0},
+z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
 aN:{
 "^":"qh;",
@@ -5023,7 +5102,7 @@
 return}P.rb(new P.CR(this,a))
 this.Gv=1}},
 CR:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -5048,16 +5127,16 @@
 this.N6=null
 this.zR=null}},
 v1y:{
-"^":"Tp:22;a,b,c",
-$0:function(){return this.a.K5(this.b,this.c)},
+"^":"Tp:115;a,b,c",
+$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:146;a,b",
-$2:function(a,b){return P.NX(this.a,this.b,a,b)},
+"^":"Tp:373;a,b",
+$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"$2",null,4,0,null,171,[],172,[],"call"],
 $isEH:true},
-vm:{
-"^":"Tp:22;a,b",
-$0:function(){return this.a.rX(this.b)},
+Q0:{
+"^":"Tp:115;a,b",
+$0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 YR:{
 "^":"qh;",
@@ -5078,23 +5157,23 @@
 Ml:function(a,b){b.Rg(0,a)},
 $asqh:function(a,b){return[b]}},
 fB:{
-"^":"KA;UY,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
+"^":"KA;UY,Ee,pN,o7,Bd,Lj,Gv,lz,Ri",
 Rg:function(a,b){if((this.Gv&2)!==0)return
 P.KA.prototype.Rg.call(this,this,b)},
 V8:function(a,b){if((this.Gv&2)!==0)return
 P.KA.prototype.V8.call(this,a,b)},
 uO:[function(){var z=this.Ee
 if(z==null)return
-z.yy(0)},"$0","gp4",0,0,21],
+z.yy(0)},"$0","gp4",0,0,126],
 LP:[function(){var z=this.Ee
 if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,21],
+z.QE(0)},"$0","gZ9",0,0,126],
 tA:function(){var z=this.Ee
 if(z!=null){this.Ee=null
 z.ed()}return},
-vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},140,[]],
-xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,147,30,[],31,[]],
-nn:[function(){this.Qj()},"$0","gH1",0,0,21],
+vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},248,[]],
+xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,374,171,[],172,[]],
+nn:[function(){this.Qj()},"$0","gH1",0,0,126],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
@@ -5174,45 +5253,52 @@
 Id:{
 "^":"a;oh",
 gLj:function(){return this.oh},
-c1:function(a,b,c){var z=this.oh
-for(;z.gWY().gE2()==null;)z=z.geT(z)
-return z.gWY().gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
-Vn:function(a,b){var z=this.oh
-for(;z.gWY().gcP()==null;)z=z.geT(z)
-return z.gWY().gcP().$4(z,new P.Id(z.geT(z)),a,b)},
-qG:function(a,b,c){var z=this.oh
-for(;z.gWY().gJl()==null;)z=z.geT(z)
-return z.gWY().gJl().$5(z,new P.Id(z.geT(z)),a,b,c)},
-nA:function(a,b,c,d){var z=this.oh
-for(;z.gWY().gpU()==null;)z=z.geT(z)
-return z.gWY().gpU().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
-TE:function(a,b){var z=this.oh
-for(;z.gWY().gFh()==null;)z=z.geT(z)
-return z.gWY().gFh().$4(z,new P.Id(z.geT(z)),a,b)},
-V6:function(a,b){var z=this.oh
-for(;z.gWY().gXp()==null;)z=z.geT(z)
-return z.gWY().gXp().$4(z,new P.Id(z.geT(z)),a,b)},
-mz:function(a,b){var z=this.oh
-for(;z.gWY().gfb()==null;)z=z.geT(z)
-return z.gWY().gfb().$4(z,new P.Id(z.geT(z)),a,b)},
-RK:function(a,b){var z,y
+c1:function(a,b,c){var z,y
 z=this.oh
-for(;z.gWY().grb()==null;)z=z.geT(z)
-y=z.geT(z)
-z.gWY().grb().$4(z,new P.Id(y),a,b)},
-dJ:function(a,b,c){var z=this.oh
-for(;z.gWY().gZq()==null;)z=z.geT(z)
-return z.gWY().gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
+for(;y=z.gWY(),y.gE2()==null;)z=z.geT(z)
+return y.gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
+Vn:function(a,b){var z,y
+z=this.oh
+for(;y=z.gWY(),y.gcP()==null;)z=z.geT(z)
+return y.gcP().$4(z,new P.Id(z.geT(z)),a,b)},
+qG:function(a,b,c){var z,y
+z=this.oh
+for(;y=z.gWY(),y.gJl()==null;)z=z.geT(z)
+return y.gJl().$5(z,new P.Id(z.geT(z)),a,b,c)},
+nA:function(a,b,c,d){var z,y
+z=this.oh
+for(;y=z.gWY(),y.gpU()==null;)z=z.geT(z)
+return y.gpU().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
+TE:function(a,b){var z,y
+z=this.oh
+for(;y=z.gWY().gFh(),y==null;)z=z.geT(z)
+return y.$4(z,new P.Id(z.geT(z)),a,b)},
+V6:function(a,b){var z,y
+z=this.oh
+for(;y=z.gWY().gXp(),y==null;)z=z.geT(z)
+return y.$4(z,new P.Id(z.geT(z)),a,b)},
+mz:function(a,b){var z,y
+z=this.oh
+for(;y=z.gWY().gfb(),y==null;)z=z.geT(z)
+return y.$4(z,new P.Id(z.geT(z)),a,b)},
+RK:function(a,b){var z,y,x
+z=this.oh
+for(;y=z.gWY(),y.grb()==null;)z=z.geT(z)
+x=z.geT(z)
+y.grb().$4(z,new P.Id(x),a,b)},
+dJ:function(a,b,c){var z,y
+z=this.oh
+for(;y=z.gWY(),y.gZq()==null;)z=z.geT(z)
+return y.gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
 RB:function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gWY(),y.gJS(y)==null;)z=z.geT(z)
-y=z.gWY()
 y.gJS(y).$4(z,new P.Id(z.geT(z)),b,c)},
-ld:function(a,b,c){var z,y
+ld:function(a,b,c){var z,y,x
 z=this.oh
-for(;z.gWY().giq()==null;)z=z.geT(z)
-y=z.geT(z)
-return z.gWY().giq().$5(z,new P.Id(y),a,b,c)}},
+for(;y=z.gWY(),y.giq()==null;)z=z.geT(z)
+x=z.geT(z)
+return y.giq().$5(z,new P.Id(x),a,b,c)}},
 WH:{
 "^":"a;",
 fC:function(a){return this.gC5()===a.gC5()},
@@ -5245,28 +5331,28 @@
 if(b)return new P.dv(this,z)
 else return new P.ph(this,z)}},
 TF:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 K5:{
-"^":"Tp:22;c,d",
+"^":"Tp:115;c,d",
 $0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
-"^":"Tp:16;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,39,[],"call"],
+"^":"Tp:116;a,b",
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,184,[],"call"],
 $isEH:true},
 Hs:{
-"^":"Tp:16;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,39,[],"call"],
+"^":"Tp:116;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,184,[],"call"],
 $isEH:true},
 dv:{
-"^":"Tp:75;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,12,[],13,[],"call"],
+"^":"Tp:300;a,b",
+$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
 $isEH:true},
 ph:{
-"^":"Tp:75;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,12,[],13,[],"call"],
+"^":"Tp:300;c,d",
+$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
 $isEH:true},
 uo:{
 "^":"WH;eT>,WY<,R1",
@@ -5289,24 +5375,24 @@
 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)}},
 pK:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
 $isEH:true},
 eM:{
-"^":"Tp:22;c,d",
-$0:function(){var z,y
+"^":"Tp:115;c,d",
+$0:[function(){var z,y
 z=this.c
 P.JS("Uncaught Error: "+H.d(z))
 y=this.d
 if(y==null&&!!J.x(z).$isGe)y=z.gI4()
 if(y!=null)P.JS("Stack Trace: \n"+H.d(y)+"\n")
-throw H.b(z)},
+throw H.b(z)},"$0",null,0,0,null,"call"],
 $isEH:true},
-rF:{
-"^":"Tp:75;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
+Uez:{
+"^":"Tp:300;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
-nU:{
+AHi:{
 "^":"a;",
 gE2:function(){return P.Gx()},
 hk:function(a,b){return this.gE2().$2(a,b)},
@@ -5354,12 +5440,12 @@
 "^":"",
 EF:function(a,b,c){return H.B7(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
 Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
-jB:function(){var z=Object.create(null)
+jB:[function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z},
-TQ:[function(a,b){return J.de(a,b)},"$2","Jo",4,0,51],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,52,53,[]],
+return z},"$0","A5",0,0,null],
+TQ:[function(a,b){return J.de(a,b)},"$2","Jo",4,0,198,118,[],199,[]],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,200,118,[]],
 Py:function(a,b,c,d,e){var z
 if(a==null){z=new P.k6(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -5367,15 +5453,15 @@
 return P.MP(a,b,c,d,e)},
 UD:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
 yv:function(a){return H.VM(new P.YO(0,null,null,null,null),[a])},
-FO:function(a){var z,y
+FO:[function(a){var z,y
 if($.xb().tg(0,a))return"(...)"
 $.xb().h(0,a)
 z=[]
 try{P.Vr(a,z)}finally{$.xb().Rz(0,a)}y=P.p9("(")
 y.We(z,", ")
 y.KF(")")
-return y.vM},
-Vr:function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+return y.vM},"$1","Zw",2,0,null,127,[]],
+Vr:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z=a.gA(a)
 y=0
 x=0
@@ -5411,10 +5497,10 @@
 if(p==null){y+=5
 p="..."}}if(p!=null)b.push(p)
 b.push(u)
-b.push(v)},
+b.push(v)},"$2","zE",4,0,null,127,[],201,[]],
 L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
 Ls:function(a,b,c,d){return H.VM(new P.b6(0,null,null,null,null,null,0),[d])},
-vW:function(a){var z,y,x,w,v
+vW:[function(a){var z,y,x,w,v
 z={}
 for(x=0;w=$.tw(),x<w.length;++x){w=w[x]
 v=a
@@ -5425,7 +5511,7 @@
 J.kH(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},
+z.pop()}return y.gvM()},"$1","DH",2,0,null,202,[]],
 k6:{
 "^":"a;X5,vv,OX,OB,wV",
 gB:function(a){return this.X5},
@@ -5528,23 +5614,23 @@
 for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
 return-1},
 $isZ0:true,
-static:{vL:function(a,b){var z=a[b]
-return z===a?null:z},cW:function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},a0:function(){var z=Object.create(null)
+static:{vL:[function(a,b){var z=a[b]
+return z===a?null:z},"$2","ME",4,0,null,197,[],49,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"$3","rn",6,0,null,197,[],49,[],30,[]],a0:[function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
-return z}}},
+return z},"$0","l1",0,0,null]}},
 oi:{
-"^":"Tp:16;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,148,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,375,[],"call"],
 $isEH:true},
 ce:{
-"^":"Tp:16;a,b",
-$1:function(a){return J.de(this.a.t(0,a),this.b)},
+"^":"Tp:116;a,b",
+$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,375,[],"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
 PL:{
@@ -5577,9 +5663,9 @@
 static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"Tp:16;a",
-$1:function(a){var z=H.XY(a,this.a)
-return z},
+"^":"Tp:116;a",
+$1:[function(a){var z=H.XY(a,this.a)
+return z},"$1",null,2,0,null,122,[],"call"],
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -5722,21 +5808,21 @@
 bu:function(a){return P.vW(this)},
 $isFo:true,
 $isZ0:true,
-static:{Qs:function(){var z=Object.create(null)
+static:{Qs:[function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z}}},
+return z},"$0","Bs",0,0,null]}},
 a1:{
-"^":"Tp:16;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,148,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,375,[],"call"],
 $isEH:true},
 ou:{
-"^":"Tp:16;a,b",
-$1:function(a){return J.de(this.a.t(0,a),this.b)},
+"^":"Tp:116;a,b",
+$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,375,[],"call"],
 $isEH:true},
 S9:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
 db:{
@@ -6008,10 +6094,10 @@
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{T2:function(){var z=Object.create(null)
+static:{T2:[function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z}}},
+return z},"$0","um",0,0,null]}},
 ef:{
 "^":"a;Gc<,DG@,zQ@"},
 zQ:{
@@ -6046,9 +6132,9 @@
 $asQV:null},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")}],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")},128,[]],
 ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-Ft:[function(a,b){return H.VM(new H.kV(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")}],
+Ft:[function(a,b){return H.VM(new H.kV(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},128,[]],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.de(z.gl(),b))return!0
 return!1},
@@ -6098,8 +6184,8 @@
 $asQV:null},
 ar:{
 "^":"a+lD;",
-$iszM:true,
-$aszM:null,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -6138,8 +6224,8 @@
 z.We(a,b)
 return z.vM},
 ev:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")}],
-Ft:[function(a,b){return H.VM(new H.kV(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")}],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")},128,[]],
+Ft:[function(a,b){return H.VM(new H.kV(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},128,[]],
 eR:function(a,b){return H.q9(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
@@ -6207,7 +6293,7 @@
 if(J.de(y,0))return
 if(e<0)throw H.b(P.u(e))
 z=J.x(d)
-if(!!z.$iszM){x=e
+if(!!z.$isList){x=e
 w=d}else{w=z.eR(d,e).tt(0,!1)
 x=0}if(typeof y!=="number")return H.s(y)
 z=J.U6(w)
@@ -6256,7 +6342,7 @@
 this.Mh(a,b,c)},
 Mh:function(a,b,c){var z,y
 z=J.x(c)
-if(!!z.$iszM){z=z.gB(c)
+if(!!z.$isList){z=z.gB(c)
 if(typeof z!=="number")return H.s(z)
 this.zB(a,b,b+z,c)}else for(z=z.gA(c);z.G();b=y){y=b+1
 this.u(a,b,z.gl())}},
@@ -6267,49 +6353,20 @@
 z.KF("[")
 z.We(a,", ")
 z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},
-$iszM:true,
-$aszM:null,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
-KPM:{
-"^":"a;",
-u:function(a,b,c){throw H.b(P.f("Cannot modify unmodifiable map"))},
-FV:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
-V1:function(a){throw H.b(P.f("Cannot modify unmodifiable map"))},
-Rz:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
-$isZ0:true},
-Bk:{
-"^":"a;",
-t:function(a,b){return this.Fb.t(0,b)},
-u:function(a,b,c){this.Fb.u(0,b,c)},
-FV:function(a,b){this.Fb.FV(0,b)},
-V1:function(a){this.Fb.V1(0)},
-x4:function(a){return this.Fb.x4(a)},
-di:function(a){return this.Fb.di(a)},
-aN:function(a,b){this.Fb.aN(0,b)},
-gl0:function(a){return this.Fb.X5===0},
-gor:function(a){return this.Fb.X5!==0},
-gB:function(a){return this.Fb.X5},
-gvc:function(){var z=this.Fb
-return H.VM(new P.i5(z),[H.Kp(z,0)])},
-Rz:function(a,b){return this.Fb.Rz(0,b)},
-bu:function(a){return P.vW(this.Fb)},
-gUQ:function(a){var z=this.Fb
-return z.gUQ(z)},
-$isZ0:true},
-Oh:{
-"^":"Bk+KPM;Fb",
-$isZ0:true},
 LG:{
-"^":"Tp:75;a,b",
-$2:function(a,b){var z=this.a
+"^":"Tp:300;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)},
+z.KF(b)},"$2",null,4,0,null,376,[],122,[],"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -6352,7 +6409,7 @@
 h:function(a,b){this.NZ(0,b)},
 FV:function(a,b){var z,y,x,w,v,u,t,s,r
 z=J.x(b)
-if(!!z.$iszM){y=z.gB(b)
+if(!!z.$isList){y=z.gB(b)
 x=this.gB(this)
 if(typeof y!=="number")return H.s(y)
 z=x+y
@@ -6462,11 +6519,11 @@
 $asQV:null,
 static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
 z.Eo(a,b)
-return z},ua:function(a){var z
+return z},ua:[function(a){var z
 if(typeof a!=="number")return a.O()
 a=(a<<2>>>0)-1
 for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}}}},
+if(z===0)return a}},"$1","bD",2,0,null,203,[]]}},
 o0:{
 "^":"a;Lz,pP,qT,Dc,fD",
 gl:function(){return this.fD},
@@ -6594,23 +6651,23 @@
 y=new P.An(c)
 return H.VM(new P.Nb(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Tp:16;a",
-$1:function(a){var z=H.XY(a,this.a)
-return z},
+"^":"Tp:116;a",
+$1:[function(a){var z=H.XY(a,this.a)
+return z},"$1",null,2,0,null,122,[],"call"],
 $isEH:true},
 bF:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Nb")}},
 BW:{
-"^":"Tp:149;a,b,c",
-$1:function(a){var z,y,x,w
+"^":"Tp:377;a,b,c",
+$1:[function(a){var z,y,x,w
 for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
 if(z!==y.bb)throw H.b(P.a4(y))
 w=a.T8
 if(w!=null&&this.$1(w)===!0)return!0
-a=a.Bb}return!1},
+a=a.Bb}return!1},"$1",null,2,0,null,273,[],"call"],
 $isEH:true},
 S6B:{
 "^":"a;",
@@ -6671,23 +6728,23 @@
 Wb:function(a){return a},
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
-VQ:function(a,b){var z=b==null?new P.JC():b
-return z.$2(null,new P.f1(z).$1(a))},
-BS:function(a,b){var z,y,x,w
+VQ:[function(a,b){var z=b==null?new P.JC():b
+return z.$2(null,new P.f1(z).$1(a))},"$2","os",4,0,null,204,[],205,[]],
+BS:[function(a,b){var z,y,x,w
 x=a
 if(typeof x!=="string")throw H.b(P.u(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},
-tp:[function(a){return a.Lt()},"$1","BC",2,0,54,55,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"$2","H4",4,0,null,33,[],205,[]],
+tp:[function(a){return a.Lt()},"$1","BC",2,0,206,6,[]],
 JC:{
-"^":"Tp:75;",
-$2:function(a,b){return b},
+"^":"Tp:300;",
+$2:[function(a,b){return b},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 f1:{
-"^":"Tp:16;a",
-$1:function(a){var z,y,x,w,v,u,t
+"^":"Tp:116;a",
+$1:[function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){z=a
 for(y=this.a,x=0;x<z.length;++x)z[x]=y.$2(x,this.$1(z[x]))
@@ -6696,7 +6753,7 @@
 for(y=this.a,x=0;x<w.length;++x){u=w[x]
 v.u(0,u,y.$2(u,this.$1(a[u])))}t=a.__proto__
 if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.$2("__proto__",this.$1(t)))
-return v},
+return v},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Uk:{
 "^":"a;"},
@@ -6704,7 +6761,7 @@
 "^":"a;"},
 Zi:{
 "^":"Uk;",
-$asUk:function(){return[P.qU,[P.zM,P.KN]]}},
+$asUk:function(){return[J.O,[J.Q,J.bU]]}},
 Ud:{
 "^":"Ge;Ct,FN",
 bu:function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
@@ -6723,13 +6780,13 @@
 KP:function(a){return this.Co(a,null)},
 gZE:function(){return C.cb},
 gHe:function(){return C.A3},
-$asUk:function(){return[P.a,P.qU]}},
+$asUk:function(){return[P.a,J.O]}},
 ze:{
 "^":"zF;UM,Xi",
-$aszF:function(){return[P.a,P.qU]}},
+$aszF:function(){return[P.a,J.O]}},
 Cf:{
 "^":"zF;N5<",
-$aszF:function(){return[P.qU,P.a]}},
+$aszF:function(){return[J.O,P.a]}},
 Sh:{
 "^":"a;iY,Vy,bV",
 Wt:function(a){return this.iY.$1(a)},
@@ -6804,7 +6861,7 @@
 this.aK(a)
 z.KF("\"")
 return!0}else{z=J.x(a)
-if(!!z.$iszM){this.WD(a)
+if(!!z.$isList){this.WD(a)
 y=this.Vy
 y.KF("[")
 if(J.z8(z.gB(a),0)){this.rl(z.t(a,0))
@@ -6828,26 +6885,26 @@
 Ei:function(a){var z=this.bV
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"P3,hyY,FC,zf,fc,fg,Do,bz,eJ,MU,ql,XI,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Ks:function(a,b,c){var z
+static:{"^":"P3,hyY,FC,zf,fc,fg,Do,bz,eJ,Ho,ql,XI,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Ks:[function(a,b,c){var z
 b=P.BC()
 z=P.p9("")
 P.uI(z,b,c).rl(a)
-return z.vM}}},
+return z.vM},"$3","nB",6,0,null,6,[],207,[],208,[]]}},
 z0:{
 "^":"Zi;lH",
 goc:function(a){return"utf-8"},
-gZE:function(){return new P.E3()}},
-E3:{
+gZE:function(){return new P.om()}},
+om:{
 "^":"zF;",
 WJ:function(a){var z,y,x
 z=J.U6(a)
 y=J.vX(z.gB(a),3)
 if(typeof y!=="number")return H.s(y)
-y=H.VM(Array(y),[P.KN])
+y=H.VM(Array(y),[J.bU])
 x=new P.Rw(0,0,y)
 if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
 return C.Nm.D6(y,0,x.ZP)},
-$aszF:function(){return[P.qU,[P.zM,P.KN]]}},
+$aszF:function(){return[J.O,[J.Q,J.bU]]}},
 Rw:{
 "^":"a;WF,ZP,EN",
 Lb:function(a,b){var z,y,x,w,v
@@ -6918,9 +6975,9 @@
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
 "^":"",
-Te:function(a){return},
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,56,53,[],57,[]],
-hl:function(a){var z,y,x,w,v
+Te:[function(a){return},"$1","Ex",2,0,null,51,[]],
+Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,209,118,[],199,[]],
+hl:[function(a){var z,y,x,w,v
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
 z.vM="\""
@@ -6937,11 +6994,11 @@
 else{w=H.Lw(v)
 w=z.vM+=w}}y=w+"\""
 z.vM=y
-return y}return"Instance of '"+H.lh(a)+"'"},
+return y}return"Instance of '"+H.lh(a)+"'"},"$1","Zx",2,0,null,6,[]],
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,58],
-NS:[function(a){return H.CU(a)},"$1","cE",2,0,59],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,60,29,29],
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,212,118,[],199,[]],
+NS:[function(a){return H.CU(a)},"$1","cE",2,0,213,6,[]],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,214,85,85,33,[],34,[],175,[]],
 O8:function(a,b,c){var z,y,x
 z=J.Qi(a,c)
 if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -6952,22 +7009,22 @@
 if(b)return z
 z.fixed$length=init
 return z},
-JS:function(a){var z,y
+JS:[function(a){var z,y
 z=H.d(a)
 y=$.oK
 if(y==null)H.qw(z)
-else y.$1(z)},
+else y.$1(z)},"$1","Pl",2,0,null,6,[]],
 HB:{
-"^":"Tp:75;a",
-$2:function(a,b){this.a.u(0,a.gfN(a),b)},
+"^":"Tp:300;a",
+$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"$2",null,4,0,null,146,[],30,[],"call"],
 $isEH:true},
 CL:{
-"^":"Tp:134;a",
-$2:function(a,b){var z=this.a
+"^":"Tp:359;a",
+$2:[function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
 z.a.KF(": ")
-z.a.KF(P.hl(b));++z.b},
+z.a.KF(P.hl(b));++z.b},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 p4:{
 "^":"a;OF",
@@ -6975,8 +7032,7 @@
 a2:{
 "^":"a;",
 bu:function(a){return this?"true":"false"},
-$isa2:true},
-"+bool":0,
+$isbool:true},
 Tx:{
 "^":"a;"},
 iP:{
@@ -7001,8 +7057,8 @@
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gi,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl: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)
+static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gio,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z=new H.VR(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)
 if(z!=null){y=new P.MF()
 x=z.QK
 if(1>=x.length)return H.e(x,1)
@@ -7035,32 +7091,28 @@
 if(typeof l!=="number")return H.s(l)
 s=J.xH(s,n*l)}k=!0}else k=!1
 j=H.zW(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},Wu:function(a,b){var z=new P.iP(a,b)
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"$1","le",2,0,null,210,[]],Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
-return z},Gq:function(a){var z,y
+return z},Gq:[function(a){var z,y
 z=Math.abs(a)
 y=a<0?"-":""
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},Vx:function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},"$1","Cp",2,0,null,211,[]],Vx:[function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
-return"00"+a},h0:function(a){if(a>=10)return""+a
-return"0"+a}}},
+return"00"+a},"$1","Dv",2,0,null,211,[]],h0:[function(a){if(a>=10)return""+a
+return"0"+a},"$1","wI",2,0,null,211,[]]}},
 MF:{
-"^":"Tp:150;",
-$1:function(a){if(a==null)return 0
-return H.BU(a,null,null)},
+"^":"Tp:379;",
+$1:[function(a){if(a==null)return 0
+return H.BU(a,null,null)},"$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 Rq:{
-"^":"Tp:151;",
-$1:function(a){if(a==null)return 0
-return H.IH(a,null)},
+"^":"Tp:380;",
+$1:[function(a){if(a==null)return 0
+return H.IH(a,null)},"$1",null,2,0,null,378,[],"call"],
 $isEH:true},
-CP:{
-"^":"lf;",
-$isCP:true},
-"+double":0,
 a6:{
 "^":"a;Fq<",
 g:function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},
@@ -7089,20 +7141,20 @@
 v=new P.P7().$1(C.CD.JV(y,1000000))
 return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
 $isa6:true,
-static:{"^":"SF,S4d,pk,LoB,zj5,b2,jS,ll,DoM,f4,za,IJ,iI,Wr,fm,yn",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"Bk,S4d,pk,LoB,zj5,b2H,jS,ll,DoM,f4,za,IJZ,iI,Wr,fm,rGr",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Tp:18;",
-$1:function(a){if(a>=100000)return H.d(a)
+"^":"Tp:121;",
+$1:[function(a){if(a>=100000)return H.d(a)
 if(a>=10000)return"0"+H.d(a)
 if(a>=1000)return"00"+H.d(a)
 if(a>=100)return"000"+H.d(a)
 if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},
+return"00000"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 DW:{
-"^":"Tp:18;",
-$1:function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},
+"^":"Tp:121;",
+$1:[function(a){if(a>=10)return H.d(a)
+return"0"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 Ge:{
 "^":"a;",
@@ -7205,51 +7257,31 @@
 EH:{
 "^":"a;",
 $isEH:true},
-KN:{
-"^":"lf;",
-$isKN:true},
-"+int":0,
 QV:{
 "^":"a;",
 $isQV:true,
 $asQV:null},
 AC:{
 "^":"a;"},
-zM:{
-"^":"a;",
-$iszM:true,
-$aszM:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-"+List":0,
 Z0:{
 "^":"a;",
 $isZ0:true},
 L9:{
 "^":"a;",
 bu:function(a){return"null"}},
-"+Null":0,
-lf:{
-"^":"a;",
-$islf:true},
-"+num":0,
 a:{
 "^":";",
 n:function(a,b){return this===b},
 giO:function(a){return H.eQ(this)},
 bu:function(a){return H.a5(this)},
 T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
+gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
 "^":"a;",
 $isOd:true},
 MN:{
 "^":"a;"},
-qU:{
-"^":"a;",
-$isqU:true},
-"+String":0,
 WU:{
 "^":"a;Qk,SU,Oq,Wn",
 gl:function(){return this.Wn},
@@ -7257,11 +7289,14 @@
 z=this.Oq
 this.SU=z
 y=this.Qk
-x=y.length
-if(z===x){this.Wn=null
-return!1}w=C.xB.j(y,z)
+x=J.U6(y)
+if(z===x.gB(y)){this.Wn=null
+return!1}w=x.j(y,this.SU)
 v=this.SU+1
-if((w&64512)===55296&&v<x){u=C.xB.j(y,v)
+if((w&64512)===55296){z=x.gB(y)
+if(typeof z!=="number")return H.s(z)
+z=v<z}else z=!1
+if(z){u=x.j(y,v)
 if((u&64512)===56320){this.Oq=v+1
 this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
 return!0}}this.Oq=v
@@ -7314,7 +7349,7 @@
 if(z&&!0)return""
 z=!z
 if(z);y=z?P.Xc(a):C.jN.ez(b,new P.Kd()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
+if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
 return y},
 Ky:function(a,b){if(a==="")return"/"+H.d(b)
 return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
@@ -7349,20 +7384,13 @@
 z.KF(y)}y=this.Ka
 if(""!==y){z.KF("#")
 z.KF(y)}return z.vM},
-n:function(a,b){var z,y,x
+n:function(a,b){var z,y
 if(b==null)return!1
 z=J.x(b)
 if(!z.$isiD)return!1
-y=this.Fi
-x=b.Fi
-if(y==null?x==null:y===x)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
+if(this.Fi===b.Fi)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
 y=b.r0
-if(z==null?y==null:z===y){z=this.tP
-y=b.tP
-if(z==null?y==null:z===y){z=this.Ka
-y=b.Ka
-y=z==null?y==null:z===y
-z=y}else z=!1}else z=!1}else z=!1
+z=(z==null?y==null:z===y)&&this.tP===b.tP&&this.Ka===b.Ka}else z=!1
 else z=!1
 else z=!1
 else z=!1
@@ -7374,7 +7402,7 @@
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"n2,q7,tv,ux,vI,IE,fd,IL,yT,zk,yt,fC,O5,FsP,qf,ML,j3,r5,Yk,qs,Fm,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,SQU,fbQ",hK:function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+static:{"^":"n2,q7,tv,v5,vI,SF,fd,IL,hO,zk,yt,fC,O5,lf,qf,ML,j3,r5,Yk,qs,lL,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,SQU,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
 x=new P.hP()
 w=new P.Uo(a1)
 v=J.U6(a1)
@@ -7431,17 +7459,17 @@
 a=x.C(k,i)?v.Nj(a1,x.g(k,1),i):""
 x=J.Wx(i)
 a0=x.C(i,u)?v.Nj(a1,x.g(i,1),u):""
-return P.R6(a0,c,b,null,z,a,null,g,e)},R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
+return P.R6(a0,c,b,null,z,a,null,g,e)},"$1","rp",2,0,null,215,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
 z=new P.iD(P.L7(b),null,null,z,i,P.LE(f,g),P.UJ(a),null,null)
 z.n3(a,b,c,d,e,f,g,h,i)
-return z},L7:function(a){var z,y
+return z},L7:[function(a){var z,y
 if(a.length===0)return a
 if(C.xB.j(a,0)===91){z=a.length-1
 if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
 P.eg(C.xB.Nj(a,1,z))
 return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
 if(a.charCodeAt(y)===58){P.eg(a)
-return"["+a+"]"}}return a},iy:function(a){var z,y,x,w,v,u
+return"["+a+"]"}}return a},"$1","jC",2,0,null,216,[]],iy:[function(a){var z,y,x,w,v,u
 z=new P.hb()
 if(a==null)return""
 y=a.length
@@ -7455,7 +7483,7 @@
 if(u>=8)return H.e(C.mK,u)
 u=J.mQ(C.mK[u],C.jn.W4(1,v&15))!==0}else u=!1
 if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},LE:function(a,b){var z,y,x
+x=!1}}return x?a:a.toLowerCase()},"$1","Um",2,0,null,217,[]],LE:[function(a,b){var z,y,x
 z={}
 y=a==null
 if(y&&!0)return""
@@ -7464,8 +7492,7 @@
 x=P.p9("")
 z.a=!0
 C.jN.aN(b,new P.yZ(z,x))
-return x.vM},UJ: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
+return x.vM},"$2","wF",4,0,null,218,[],219,[]],UJ:[function(a){return P.Xc(a)},"$1","p7",2,0,null,220,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z={}
 y=J.U6(a).u8(a,"%")
 z.a=y
@@ -7504,11 +7531,11 @@
 r=m}else{z.a=t
 r=t}}if(z.b==null)return a
 if(z.c!==r)s.$0()
-return J.AG(z.b)},q5:function(a){var z,y
+return J.AG(z.b)},"$1","Sy",2,0,null,221,[]],q5:[function(a){var z,y
 z=new P.Mx()
 y=a.split(".")
 if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},eg:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"$1","cf",2,0,null,216,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=new P.kZ()
 y=new P.JT(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
@@ -7536,18 +7563,18 @@
 if(q&&!p)z.$1("expected a part after last `:`")
 if(!q)try{J.wT(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
 try{v=P.q5(J.ZZ(a,w))
-s=J.c1(J.UQ(v,0),8)
+s=J.Eh(J.UQ(v,0),8)
 r=J.UQ(v,1)
 if(typeof r!=="number")return H.s(r)
 J.wT(x,(s|r)>>>0)
-r=J.c1(J.UQ(v,2),8)
+r=J.Eh(J.UQ(v,2),8)
 s=J.UQ(v,3)
 if(typeof s!=="number")return H.s(s)
 J.wT(x,(r|s)>>>0)}catch(o){H.Ru(o)
 z.$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
 s=new H.kV(x,new P.d9(x))
 s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},jW:function(a,b,c,d){var z,y,x,w,v,u,t
+return P.F(s,!0,H.ip(s,"mW",0))},"$1","q3",2,0,null,216,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -7560,173 +7587,173 @@
 y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
 y.vM+=u}else{u=H.Lw(37)
 y.vM+=u
-z.$2(v,y)}}return y.vM}}},
+z.$2(v,y)}}return y.vM},"$4$encoding$spaceToPlus","jd",4,5,null,222,223,224,[],225,[],226,[],227,[]]}},
 hP:{
-"^":"Tp:152;",
-$1:function(a){var z
+"^":"Tp:382;",
+$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.aa,z)
 z=J.mQ(C.aa[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},
+return z},"$1",null,2,0,null,381,[],"call"],
 $isEH:true},
 Uo:{
-"^":"Tp:153;a",
-$1:function(a){a=J.aK(this.a,"]",a)
+"^":"Tp:383;a",
+$1:[function(a){a=J.aK(this.a,"]",a)
 if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},
+return a+1},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 hb:{
-"^":"Tp:152;",
-$1:function(a){var z
+"^":"Tp:382;",
+$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.HE,z)
 z=J.mQ(C.HE[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},
+return z},"$1",null,2,0,null,381,[],"call"],
 $isEH:true},
 Kd:{
-"^":"Tp:16;",
-$1:function(a){return P.jW(C.Wd,a,C.xM,!1)},
+"^":"Tp:116;",
+$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 yZ:{
-"^":"Tp:75;a,b",
-$2:function(a,b){var z=this.a
+"^":"Tp:300;a,b",
+$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
 z=this.b
 z.KF(P.jW(C.kg,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.jW(C.kg,b,C.xM,!0))},
+z.KF(P.jW(C.kg,b,C.xM,!0))},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 Gs:{
-"^":"Tp:152;",
-$1:function(a){var z
+"^":"Tp:382;",
+$1:[function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
-return z},
+return z},"$1",null,2,0,null,384,[],"call"],
 $isEH:true},
 pm:{
-"^":"Tp:152;",
-$1:function(a){return 97<=a&&a<=102},
+"^":"Tp:382;",
+$1:[function(a){return 97<=a&&a<=102},"$1",null,2,0,null,384,[],"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:152;",
-$1:function(a){var z
+"^":"Tp:382;",
+$1:[function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.kg,z)
 z=J.mQ(C.kg[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},
+return z},"$1",null,2,0,null,381,[],"call"],
 $isEH:true},
 wm:{
-"^":"Tp:153;b,c,d",
-$1:function(a){var z,y
+"^":"Tp:383;b,c,d",
+$1:[function(a){var z,y
 z=this.b
-y=J.lE(z,a)
+y=C.xB.j(z,a)
 if(this.d.$1(y)===!0)return y-32
 else if(this.c.$1(y)!==!0)throw H.b(P.u("Invalid URI component: "+z))
-else return y},
+else return y},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 FB:{
-"^":"Tp:153;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
-else{v|=32
-if(97<=v&&v<=102)x=x*16+v-97+10
-else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return x},
+"^":"Tp:383;e",
+$1:[function(a){var z,y,x,w
+for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
+if(48<=w&&w<=57)y=y*16+w-48
+else{w|=32
+if(97<=w&&w<=102)y=y*16+w-97+10
+else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return y},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 Lk:{
-"^":"Tp:21;a,f",
-$0:function(){var z,y,x,w,v
+"^":"Tp:126;a,f",
+$0:[function(){var z,y,x,w,v
 z=this.a
 y=z.b
 x=z.c
 w=this.f
 v=z.a
-if(y==null)z.b=P.p9(J.Nj(w,x,v))
-else y.KF(J.Nj(w,x,v))},
+if(y==null)z.b=P.p9(C.xB.Nj(w,x,v))
+else y.KF(C.xB.Nj(w,x,v))},"$0",null,0,0,null,"call"],
 $isEH:true},
 XZ:{
-"^":"Tp:154;",
-$2:function(a,b){var z=J.v1(a)
+"^":"Tp:386;",
+$2:[function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},
+return b*31+z&1073741823},"$2",null,4,0,null,385,[],254,[],"call"],
 $isEH:true},
 Mx:{
-"^":"Tp:49;",
-$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
+"^":"Tp:193;",
+$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 C9:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z,y
 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,155,[],"call"],
+return z},"$1",null,2,0,null,387,[],"call"],
 $isEH:true},
 kZ:{
-"^":"Tp:49;",
-$1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
+"^":"Tp:193;",
+$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 JT:{
-"^":"Tp:156;a,b",
-$2:function(a,b){var z,y
+"^":"Tp:388;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)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
-return z},
+return z},"$2",null,4,0,null,134,[],135,[],"call"],
 $isEH:true},
 d9:{
-"^":"Tp:16;c",
-$1:function(a){var z=J.x(a)
+"^":"Tp:116;c",
+$1:[function(a){var z=J.x(a)
 if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},
+else return[z.m(a,8)&255,z.i(a,255)]},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rI:{
-"^":"Tp:75;",
-$2:function(a,b){var z=J.Wx(a)
+"^":"Tp:300;",
+$2:[function(a,b){var z=J.Wx(a)
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
+b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"$2",null,4,0,null,389,[],390,[],"call"],
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
 else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"$1","pq",2,0,61,7,[]],
-r3:function(a,b){return document.createElement(a)},
-Kn:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
-lt:function(a,b,c,d,e,f,g,h){var z,y,x
+return"transitionend"},"$1","pq",2,0,228,21,[]],
+r3:[function(a,b){return document.createElement(a)},"$2","Oe",4,0,null,102,[],229,[]],
+It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"$3$onProgress$withCredentials","xF",2,5,null,85,85,230,[],231,[],232,[]],
+lt:[function(a,b,c,d,e,f,g,h){var z,y,x
 z=W.zU
 y=H.VM(new P.Zf(P.Dt(z)),[z])
 x=new XMLHttpRequest()
 C.W3.eo(x,"GET",a,!0)
 z=C.fK.aM(x)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
+H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new W.iO(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
 z=C.MD.aM(x)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
-return y.MM},
+return y.MM},"$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,85,85,85,85,85,85,85,230,[],233,[],231,[],234,[],235,[],236,[],237,[],232,[]],
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
-C0:function(a,b){a=536870911&a+b
+C0:[function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},
-Pv:function(a){if(a==null)return
-return W.P1(a)},
-qc:function(a){var z
+return a^a>>>6},"$2","jx",4,0,null,238,[],30,[]],
+Pv:[function(a){if(a==null)return
+return W.P1(a)},"$1","Ie",2,0,null,239,[]],
+qc:[function(a){var z
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
 if(!!J.x(z).$isD0)return z
-return}else return a},
-qr:function(a){return a},
-Pd:function(a){if(!!J.x(a).$isYN)return a
-return P.o7(a,!0)},
-YT:function(a,b){return new W.vZ(a,b)},
-GO:[function(a){return J.TD(a)},"$1","V5",2,0,16,62,[]],
-Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,16,62,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","A6",8,0,63,62,[],64,[],65,[],66,[]],
-wi:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
+return}else return a},"$1","Wq",2,0,null,21,[]],
+qr:[function(a){return a},"$1","Ku",2,0,null,21,[]],
+Pd:[function(a){if(!!J.x(a).$isYN)return a
+return P.o7(a,!0)},"$1","ra",2,0,null,99,[]],
+YT:[function(a,b){return new W.vZ(a,b)},"$2","AD",4,0,null,240,[],7,[]],
+GO:[function(a){return J.TD(a)},"$1","V5",2,0,116,48,[]],
+Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,116,48,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","A6",8,0,241,48,[],12,[],242,[],243,[]],
+wi:[function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
 z=J.Xr(d)
 if(z==null)throw H.b(P.u(d))
 y=z.prototype
@@ -7748,19 +7775,19 @@
 Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
 q={prototype:s}
 if(!v)q.extends=e
-b.registerElement(c,q)},
-aF:function(a){if(J.de($.X3,C.NU))return a
+b.registerElement(c,q)},"$5","uz",10,0,null,97,[],244,[],102,[],11,[],245,[]],
+aF:[function(a){if(J.de($.X3,C.NU))return a
 if(a==null)return
-return $.X3.oj(a,!0)},
-K2:function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},
+return $.X3.oj(a,!0)},"$1","Rj",2,0,null,164,[]],
+K2:[function(a){if(J.de($.X3,C.NU))return a
+return $.X3.PT(a,!0)},"$1","o6",2,0,null,164,[]],
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|LP|lw|D13|Ir|WZq|bf|Nr|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|qkb|V13|vj|LU|V14|KL|V15|F1|V16|aQ|V17|Qa|V18|Ww|V19|tz|V20|Mv|V21|Zt|V22|iL|V23|F1i|XP|V24|NQ|V25|ov|x4|kn|V26|fI|V27|zMr|V28|nk|V29|ob|Bc|Uj|V30|xT|V31|uwf|I5|V32|SC"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|LP|hV|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|Nr|lw|D13|Ir|WZq|rm|Bc|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|IWF|V13|Yj|V14|Oz|V15|YA|V16|qkb|V17|vj|LU|V18|KL|V19|F1|V20|aQ|V21|Qa|V22|Ww|V23|tz|V24|flR|V25|oM|V26|iL|V27|F1i|XP|V28|NQ|V29|SM|x4|knI|V30|fI|V31|zMr|V32|nk|V33|ob|LPc|Uj|V34|xT|V35|uwf|I5|V36|en"},
 zw:{
 "^":"Gv;",
-$iszM:true,
-$aszM:function(){return[W.nX]},
+$isList:true,
+$asWO:function(){return[W.nX]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.nX]},
@@ -7827,7 +7854,7 @@
 Kb:function(a,b){return a.getElementById(b)},
 ek:function(a,b,c){return a.importNode(b,c)},
 gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.T1.aM(a)},
+gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
 gVY:function(a){return C.DK.aM(a)},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
@@ -7835,7 +7862,7 @@
 pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 $isYN:true,
 "%":"Document|HTMLDocument|XMLDocument"},
-hN:{
+Aj:{
 "^":"KV;",
 gwd:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.e7(a)),[null])
 return a._docChildren},
@@ -7900,7 +7927,7 @@
 PN:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
 gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.T1.f0(a)},
+gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
 gVY:function(a){return C.DK.f0(a)},
 gE8:function(a){return C.W2.f0(a)},
@@ -7953,8 +7980,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]},
@@ -8017,7 +8044,8 @@
 El:{
 "^":"qE;kc:error=,LA:src=",
 xW:function(a){return a.load()},
-"%":"HTMLAudioElement;HTMLMediaElement"},
+"%":"HTMLAudioElement;HTMLMediaElement",
+static:{"^":"pZ<"}},
 zm:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
@@ -8055,7 +8083,7 @@
 tH:{
 "^":"D0;jO:id=,oc:name=,t5:type=,Ye:version=",
 "%":"MIDIInput;MIDIPort"},
-Aj:{
+Wp:{
 "^":"Mf;",
 nH:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
 return},
@@ -8066,7 +8094,7 @@
 z=W.qc(a.target)
 y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.Yq(J.AK(z)))
 return H.VM(new P.hL(J.XH(y.x),J.XH(y.y)),[null])}},
-$isAj:true,
+$isWp:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 H9:{
 "^":"Gv;",
@@ -8124,8 +8152,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]},
@@ -8175,7 +8203,7 @@
 $islp:true,
 "%":"HTMLSelectElement"},
 I0:{
-"^":"hN;",
+"^":"Aj;",
 Kb:function(a,b){return a.getElementById(b)},
 $isI0:true,
 "%":"ShadowRoot"},
@@ -8265,7 +8293,7 @@
 X6:function(a,b,c){return this.xc(a,b,c,null)},
 bu:function(a){return a.toString()},
 gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.T1.aM(a)},
+gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
 gVY:function(a){return C.DK.aM(a)},
 $isu9:true,
@@ -8304,7 +8332,7 @@
 $istn:true,
 $astn:function(){return[null]},
 "%":"ClientRect|DOMRect"},
-Wp:{
+SC:{
 "^":"qE;",
 $isD0:true,
 "%":"HTMLFrameSetElement"},
@@ -8321,8 +8349,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]},
@@ -8341,8 +8369,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$iszM:true,
-$aszM:function(){return[W.yg]},
+$isList:true,
+$asWO:function(){return[W.yg]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.yg]},
@@ -8361,8 +8389,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$iszM:true,
-$aszM:function(){return[W.uj]},
+$isList:true,
+$asWO:function(){return[W.uj]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.uj]},
@@ -8405,7 +8433,7 @@
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 $asar:function(){return[W.cv]},
-$aszM:function(){return[W.cv]},
+$asWO:function(){return[W.cv]},
 $asQV:function(){return[W.cv]}},
 wz:{
 "^":"ar;Sn,Sc",
@@ -8421,13 +8449,13 @@
 gDD:function(a){return W.or(this.Sc)},
 sDD:function(a,b){H.bQ(this.Sc,new W.BH(b))},
 gi9:function(a){return C.mt.Uh(this)},
-gVl:function(a){return C.T1.Uh(this)},
+gVl:function(a){return C.pi.Uh(this)},
 gLm:function(a){return C.i3.Uh(this)},
 gVY:function(a){return C.DK.Uh(this)},
 nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.B1())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
-$iszM:true,
-$aszM:null,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -8435,14 +8463,14 @@
 z.nJ(a,b)
 return z}}},
 B1:{
-"^":"Tp:16;",
-$1:function(a){return!!J.x(a).$iscv},
+"^":"Tp:116;",
+$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 BH:{
-"^":"Tp:16;a",
-$1:function(a){var z=this.a
+"^":"Tp:116;a",
+$1:[function(a){var z=this.a
 J.H2(a,z)
-return z},
+return z},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 nX:{
 "^":"Gv;"},
@@ -8459,28 +8487,28 @@
 static:{"^":"fD"}},
 RAp:{
 "^":"Gv+lD;",
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Gb:{
 "^":"RAp+Gm;",
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Kx:{
-"^":"Tp:16;",
-$1:[function(a){return J.EC(a)},"$1",null,2,0,null,157,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){return J.EC(a)},"$1",null,2,0,null,391,[],"call"],
+$isEH:true},
+Cs:{
+"^":"Tp:300;a",
+$2:[function(a,b){this.a.setRequestHeader(a,b)},"$2",null,4,0,null,392,[],30,[],"call"],
 $isEH:true},
 iO:{
-"^":"Tp:75;a",
-$2:function(a,b){this.a.setRequestHeader(a,b)},
-$isEH:true},
-bU:{
-"^":"Tp:16;b,c",
+"^":"Tp:116;b,c",
 $1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -8489,11 +8517,11 @@
 x=this.b
 if(y){y=x.MM
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(z)}else x.pm(a)},"$1",null,2,0,null,7,[],"call"],
+y.OH(z)}else x.pm(a)},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Yg:{
-"^":"Tp:75;a",
-$2:function(a,b){if(b!=null)this.a[a]=b},
+"^":"Tp:300;a",
+$2:[function(a,b){if(b!=null)this.a[a]=b},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 e7:{
 "^":"ar;NL",
@@ -8540,61 +8568,61 @@
 return z[b]},
 $ise7:true,
 $asar:function(){return[W.KV]},
-$aszM:function(){return[W.KV]},
+$asWO:function(){return[W.KV]},
 $asQV:function(){return[W.KV]}},
 nNL:{
 "^":"Gv+lD;",
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 ma:{
 "^":"nNL+Gm;",
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 yoo:{
 "^":"Gv+lD;",
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 ecX:{
 "^":"yoo+Gm;",
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 zLC:{
 "^":"Gv+lD;",
-$iszM:true,
-$aszM:function(){return[W.yg]},
+$isList:true,
+$asWO:function(){return[W.yg]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.yg]}},
 w1p:{
 "^":"zLC+Gm;",
-$iszM:true,
-$aszM:function(){return[W.yg]},
+$isList:true,
+$asWO:function(){return[W.yg]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.yg]}},
 dxW:{
 "^":"Gv+lD;",
-$iszM:true,
-$aszM:function(){return[W.uj]},
+$isList:true,
+$asWO:function(){return[W.uj]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.uj]}},
 kEI:{
 "^":"dxW+Gm;",
-$iszM:true,
-$aszM:function(){return[W.uj]},
+$isList:true,
+$asWO:function(){return[W.uj]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.uj]}},
@@ -8610,23 +8638,23 @@
 b.$2(y,this.t(0,y))}},
 gvc:function(){var z,y,x,w
 z=this.MW.attributes
-y=H.VM([],[P.qU])
+y=H.VM([],[J.O])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
 if(this.FJ(z[w])){if(w>=z.length)return H.e(z,w)
 y.push(J.O6(z[w]))}}return y},
 gUQ:function(a){var z,y,x,w
 z=this.MW.attributes
-y=H.VM([],[P.qU])
+y=H.VM([],[J.O])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
 if(this.FJ(z[w])){if(w>=z.length)return H.e(z,w)
 y.push(J.Vm(z[w]))}}return y},
 gl0:function(a){return this.gB(this)===0},
 gor:function(a){return this.gB(this)!==0},
 $isZ0:true,
-$asZ0:function(){return[P.qU,P.qU]}},
+$asZ0:function(){return[J.O,J.O]}},
 Zc:{
-"^":"Tp:75;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,158,[],70,[],"call"],
+"^":"Tp:300;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,376,[],122,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
@@ -8642,7 +8670,7 @@
 FJ:function(a){return a.namespaceURI==null}},
 nF:{
 "^":"As;QX,Kd",
-lF:function(){var z=P.Ls(null,null,null,P.qU)
+lF:function(){var z=P.Ls(null,null,null,J.O)
 this.Kd.aN(0,new W.Si(z))
 return z},
 p5:function(a){var z,y
@@ -8658,38 +8686,38 @@
 z.yJ(a)
 return z}}},
 FK:{
-"^":"Tp:16;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,7,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Si:{
-"^":"Tp:16;a",
-$1:function(a){return this.a.FV(0,a.lF())},
+"^":"Tp:116;a",
+$1:[function(a){return this.a.FV(0,a.lF())},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 vf:{
-"^":"Tp:16;a",
-$1:function(a){return a.OS(this.a)},
+"^":"Tp:116;a",
+$1:[function(a){return a.OS(this.a)},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Iw:{
-"^":"Tp:16;a,b",
-$1:function(a){return a.O4(this.a,this.b)},
+"^":"Tp:116;a,b",
+$1:[function(a){return a.O4(this.a,this.b)},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Fc:{
-"^":"Tp:16;a",
-$1:function(a){return J.V1(a,this.a)},
+"^":"Tp:116;a",
+$1:[function(a){return J.V1(a,this.a)},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 hD:{
-"^":"Tp:75;a",
-$2:function(a,b){return this.a.$1(b)===!0||a===!0},
+"^":"Tp:300;a",
+$2:[function(a,b){return this.a.$1(b)===!0||a===!0},"$2",null,4,0,null,393,[],142,[],"call"],
 $isEH:true},
 I4:{
 "^":"As;MW",
 lF:function(){var z,y,x
-z=P.Ls(null,null,null,P.qU)
+z=P.Ls(null,null,null,J.O)
 for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
 if(x.length!==0)z.h(0,x)}return z},
 p5:function(a){P.F(a,!0,null)
 J.Pw(this.MW,a.zV(0," "))}},
-e0:{
+UC:{
 "^":"a;Ph",
 zc:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
 aM:function(a){return this.zc(a,!1)},
@@ -8711,13 +8739,13 @@
 return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},
 $isqh:true},
 ie:{
-"^":"Tp:16;a",
-$1:function(a){return J.eI(J.l2(a),this.a)},
+"^":"Tp:116;a",
+$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 Ea:{
-"^":"Tp:16;b",
+"^":"Tp:116;b",
 $1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,7,[],"call"],
+return a},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 pu:{
 "^":"qh;DI,Sg,Ph",
@@ -8735,13 +8763,13 @@
 yI:function(a){return this.KR(a,null,null,null)},
 $isqh:true},
 i2:{
-"^":"Tp:16;a",
-$1:function(a){return J.eI(J.l2(a),this.a)},
+"^":"Tp:116;a",
+$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 b0:{
-"^":"Tp:16;b",
+"^":"Tp:116;b",
 $1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,7,[],"call"],
+return a},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Ov:{
 "^":"MO;VP,uv,Ph,u7,Sg",
@@ -8772,10 +8800,10 @@
 cO:[function(a){var z,y
 for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.aV.cO(0)},"$0","gJK",0,0,21],
+this.aV.cO(0)},"$0","gJK",0,0,126],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
 RX:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 bO:{
@@ -8797,8 +8825,8 @@
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
-$iszM:true,
-$aszM:null,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -8842,11 +8870,11 @@
 return!1},
 gl:function(){return this.QZ}},
 vZ:{
-"^":"Tp:16;a,b",
+"^":"Tp:116;a,b",
 $1:[function(a){var z=H.Va(this.b)
 Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
 a.constructor=a.__proto__.constructor
-return this.a(a)},"$1",null,2,0,null,62,[],"call"],
+return this.a(a)},"$1",null,2,0,null,48,[],"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
@@ -8858,8 +8886,8 @@
 On:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 $isD0:true,
-static:{P1:function(a){if(a===window)return a
-else return new W.dW(a)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+static:{P1:[function(a){if(a===window)return a
+else return new W.dW(a)},"$1","lG",2,0,null,246,[]]}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -8875,7 +8903,7 @@
 eG:{
 "^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEBlendElement"},
-lv:{
+lvr:{
 "^":"d5;t5:type=,UQ:values=,fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
 pf:{
@@ -8914,7 +8942,7 @@
 ca:{
 "^":"d5;x=,y=",
 "%":"SVGFEPointLightElement"},
-zt:{
+zu:{
 "^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
 eW:{
@@ -8947,7 +8975,7 @@
 Ac:{
 "^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-jr:{
+MU:{
 "^":"Yz;fg:height=,R:width=,x=,y=",
 "%":"SVGRectElement"},
 nd:{
@@ -8965,12 +8993,13 @@
 J.r4(z.h2.NL)
 z.FV(0,b)},
 gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.T1.f0(a)},
+gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
 gVY:function(a){return C.DK.f0(a)},
 gE8:function(a){return C.W2.f0(a)},
 $isD0: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"},
+"%":"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",
+static:{"^":"JQ<"}},
 hy:{
 "^":"zp;fg:height=,R:width=,x=,y=",
 Kb:function(a,b){return a.getElementById(b)},
@@ -8995,7 +9024,7 @@
 "^":"As;LO",
 lF:function(){var z,y,x,w
 z=this.LO.getAttribute("class")
-y=P.Ls(null,null,null,P.qU)
+y=P.Ls(null,null,null,J.O)
 if(z==null)return y
 for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=J.rr(x.lo)
 if(w.length!==0)y.h(0,w)}return y},
@@ -9010,16 +9039,16 @@
 $ishq:true,
 static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
-xZ:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
+xZ:[function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},"$2$captureThis","oo",2,3,null,223,128,[],247,[]],
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,47,[],67,[],33,[],68,[]],
-Dm:function(a,b,c){var z
+d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,164,[],247,[],180,[],90,[]],
+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},
-Om:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},
+return!0}catch(z){H.Ru(z)}return!1},"$3","Iy",6,0,null,99,[],12,[],30,[]],
+Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
+return},"$2","OP",4,0,null,99,[],12,[]],
 wY:[function(a){var z
 if(a==null)return
 else if(typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
@@ -9028,10 +9057,10 @@
 else if(!!z.$isiP)return H.o2(a)
 else if(!!z.$isE4)return a.eh
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,16,69,[]],
-hE:function(a,b,c){var z=P.Om(a,b)
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,116,99,[]],
+hE:[function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.$1(a)
-P.Dm(a,b,z)}return z},
+P.Dm(a,b,z)}return z},"$3","dw",6,0,null,99,[],69,[],250,[]],
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
 else{if(a instanceof Object){z=J.x(a)
@@ -9039,13 +9068,13 @@
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.hs())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,54,69,[]],
-ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
+else return P.ND(a)}},"$1","Xl",2,0,206,99,[]],
+ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),new P.QS())},
-iQ:function(a,b,c){var z=P.Om(a,b)
+else return P.iQ(a,$.Iq(),new P.QS())},"$1","ln",2,0,null,99,[]],
+iQ:[function(a,b,c){var z=P.Om(a,b)
 if(z==null||!(a instanceof Object)){z=c.$1(a)
-P.Dm(a,b,z)}return z},
+P.Dm(a,b,z)}return z},"$3","yF",6,0,null,99,[],69,[],250,[]],
 E4:{
 "^":"a;eh",
 t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
@@ -9073,9 +9102,9 @@
 C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Gn(P.UD(null,null)).$1(a)}}},
+return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).$1(a)},"$1","aV",2,0,null,248,[]]}},
 Gn:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
@@ -9086,7 +9115,7 @@
 x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
 z.u(0,a,v)
 C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"$1",null,2,0,null,69,[],"call"],
+return v}else return P.wY(a)},"$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 r7:{
 "^":"E4;eh"},
@@ -9125,61 +9154,61 @@
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 GT:function(a,b){this.V7("sort",[b])},
 np:function(a){return this.GT(a,null)},
-static:{BE:function(a,b,c){var z=J.Wx(a)
+static:{BE:[function(a,b,c){var z=J.Wx(a)
 if(z.C(a,0)||z.D(a,c))throw H.b(P.TE(a,0,c))
 z=J.Wx(b)
-if(z.C(b,a)||z.D(b,c))throw H.b(P.TE(b,a,c))}}},
+if(z.C(b,a)||z.D(b,c))throw H.b(P.TE(b,a,c))},"$3","d6",6,0,null,134,[],135,[],249,[]]}},
 Wk:{
 "^":"E4+lD;",
-$iszM:true,
-$aszM:null,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 DV:{
-"^":"Tp:16;",
-$1:function(a){var z=P.xZ(a,!1)
+"^":"Tp:116;",
+$1:[function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
-return z},
+return z},"$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 Hp:{
-"^":"Tp:16;a",
-$1:function(a){return new this.a(a)},
+"^":"Tp:116;a",
+$1:[function(a){return new this.a(a)},"$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 Nz:{
-"^":"Tp:16;",
-$1:function(a){return new P.r7(a)},
+"^":"Tp:116;",
+$1:[function(a){return new P.r7(a)},"$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 Jd:{
-"^":"Tp:16;",
-$1:function(a){return H.VM(new P.Tz(a),[null])},
+"^":"Tp:116;",
+$1:[function(a){return H.VM(new P.Tz(a),[null])},"$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 QS:{
-"^":"Tp:16;",
-$1:function(a){return new P.E4(a)},
+"^":"Tp:116;",
+$1:[function(a){return new P.E4(a)},"$1",null,2,0,null,99,[],"call"],
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
-VC:function(a,b){a=536870911&a+b
+VC:[function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},
-Up:function(a){a=536870911&a+((67108863&a)<<3>>>0)
+return a^a>>>6},"$2","hj",4,0,null,238,[],30,[]],
+Up:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
 a^=a>>>11
-return 536870911&a+((16383&a)<<15>>>0)},
-J:function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
+return 536870911&a+((16383&a)<<15>>>0)},"$1","Hj",2,0,null,238,[]],
+J:[function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a>b)return b
 if(a<b)return a
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return(a+b)*a*b
 if(a===0&&C.ON.gzP(b)||C.ON.gG0(b))return b
-return a}return a},
-y:function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
+return a}return a},"$2","yT",4,0,null,118,[],199,[]],
+y:[function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a>b)return a
 if(a<b)return b
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},
+return a},"$2","Rb",4,0,null,118,[],199,[]],
 mg:{
 "^":"a;",
 j1:function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
@@ -9281,20 +9310,14 @@
 $ishL:true},
 HDe:{
 "^":"a;",
-gT8:function(a){var z,y
-z=this.gBb(this)
-y=this.R
+gT8:function(a){var z=this.gBb(this)
 if(typeof z!=="number")return z.g()
-if(typeof y!=="number")return H.s(y)
-return z+y},
-gQG:function(a){var z,y
-z=this.gG6(this)
-y=this.fg
+return z+this.R},
+gQG:function(a){var z=this.gG6(this)
 if(typeof z!=="number")return z.g()
-if(typeof y!=="number")return H.s(y)
-return z+y},
-bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+H.d(this.R)+" x "+H.d(this.fg)},
-n:function(a,b){var z,y,x,w
+return z+this.fg},
+bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+this.R+" x "+this.fg},
+n:function(a,b){var z,y,x
 if(b==null)return!1
 z=J.x(b)
 if(!z.$istn)return!1
@@ -9303,26 +9326,20 @@
 if(y==null?x==null:y===x){y=this.G6
 x=z.gG6(b)
 if(y==null?x==null:y===x){x=this.Bb
-w=this.R
 if(typeof x!=="number")return x.g()
-if(typeof w!=="number")return H.s(w)
-if(x+w===z.gT8(b)){x=this.fg
-if(typeof y!=="number")return y.g()
-if(typeof x!=="number")return H.s(x)
-z=y+x===z.gQG(b)}else z=!1}else z=!1}else z=!1
+if(x+this.R===z.gT8(b)){if(typeof y!=="number")return y.g()
+z=y+this.fg===z.gQG(b)}else z=!1}else z=!1}else z=!1
 return z},
-giO:function(a){var z,y,x,w,v,u
+giO:function(a){var z,y,x,w
 z=J.v1(this.gBb(this))
 y=this.G6
 x=J.v1(y)
 w=this.Bb
-v=this.R
 if(typeof w!=="number")return w.g()
-if(typeof v!=="number")return H.s(v)
-u=this.fg
+w=w+this.R&0x1FFFFFFF
 if(typeof y!=="number")return y.g()
-if(typeof u!=="number")return H.s(u)
-return P.Up(P.VC(P.VC(P.VC(P.VC(0,z),x),w+v&0x1FFFFFFF),y+u&0x1FFFFFFF))},
+y=y+this.fg&0x1FFFFFFF
+return P.Up(P.VC(P.VC(P.VC(P.VC(0,z),x),w),y))},
 gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
@@ -9339,14 +9356,14 @@
 else y=d
 return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.mirrors","dart:mirrors",,P,{
 "^":"",
-re:function(a){var z,y
+re:[function(a){var z,y
 z=J.x(a)
 if(!z.$isuq||z.n(a,C.HH))throw H.b(P.u(H.d(a)+" does not denote a class"))
 y=P.o1(a)
 if(!J.x(y).$isMs)throw H.b(P.u(H.d(a)+" does not denote a class"))
-return y.gJi()},
-o1:function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},
+return y.gJi()},"$1","dO",2,0,null,49,[]],
+o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
+return $.P8()}return H.jO(a.gLU())},"$1","o9",2,0,null,49,[]],
 QF:{
 "^":"a;",
 $isQF:true},
@@ -9396,7 +9413,7 @@
 WS4:{
 "^":"a;ew,oQ,Js,f9"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
 "^":"",
-ah:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
+ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","lc",0,0,null],
 Gj:{
 "^":"mAS;EV"},
 mAS:{
@@ -9426,6 +9443,7 @@
 Rz:function(a,b){return this.EV.Rz(0,b)},
 gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
+bu:function(a){return P.vW(this.EV)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
 "^":"",
 UI:function(a){a.toString
@@ -9436,6 +9454,7 @@
 return a},
 WZ:{
 "^":"Gv;",
+gbx:function(a){return C.PT},
 $isWZ:true,
 "%":"ArrayBuffer"},
 pF:{
@@ -9451,10 +9470,12 @@
 "%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
 df:{
 "^":"pF;",
+gbx:function(a){return C.T1},
 $isHY:true,
 "%":"DataView"},
 Hg:{
 "^":"Dg;",
+gbx:function(a){return C.hN},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9463,15 +9484,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.CP]},
+$isList:true,
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.CP]},
+$asQV:function(){return[J.Pp]},
 $isHY:true,
 "%":"Float32Array"},
 fS:{
 "^":"Dg;",
+gbx:function(a){return C.lk},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9480,15 +9502,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.CP]},
+$isList:true,
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.CP]},
+$asQV:function(){return[J.Pp]},
 $isHY:true,
 "%":"Float64Array"},
 PS:{
 "^":"Pg;",
+gbx:function(a){return C.jV},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9497,15 +9520,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]},
+$asQV:function(){return[J.bU]},
 $isHY:true,
 "%":"Int16Array"},
 dE:{
 "^":"Pg;",
+gbx:function(a){return C.Im},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9514,15 +9538,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]},
+$asQV:function(){return[J.bU]},
 $isHY:true,
 "%":"Int32Array"},
-Eb:{
+IJ:{
 "^":"Pg;",
+gbx:function(a){return C.la},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9531,15 +9556,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]},
+$asQV:function(){return[J.bU]},
 $isHY:true,
 "%":"Int8Array"},
 us:{
 "^":"Pg;",
+gbx:function(a){return C.iG},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9548,15 +9574,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]},
+$asQV:function(){return[J.bU]},
 $isHY:true,
 "%":"Uint16Array"},
 qe:{
 "^":"Pg;",
+gbx:function(a){return C.Vh},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9565,15 +9592,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]},
+$asQV:function(){return[J.bU]},
 $isHY:true,
 "%":"Uint32Array"},
 eE:{
 "^":"Pg;",
+gbx:function(a){return C.nG},
 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)
@@ -9583,15 +9611,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]},
+$asQV:function(){return[J.bU]},
 $isHY:true,
 "%":"CanvasPixelArray|Uint8ClampedArray"},
 V6:{
 "^":"Pg;",
+gbx:function(a){return C.eY},
 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)
@@ -9601,11 +9630,11 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]},
+$asQV:function(){return[J.bU]},
 $isHY:true,
 "%":";Uint8Array"},
 b0B:{
@@ -9630,18 +9659,18 @@
 return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true,
-$iszM:true,
-$aszM:function(){return[P.CP]},
+$isList:true,
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.CP]}},
+$asQV:function(){return[J.Pp]}},
 Ui:{
 "^":"b0B+lD;",
-$iszM:true,
-$aszM:function(){return[P.CP]},
+$isList:true,
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.CP]}},
+$asQV:function(){return[J.Pp]}},
 Ip:{
 "^":"Ui+SU7;"},
 Pg:{
@@ -9650,36 +9679,36 @@
 return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isPg:true,
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]}},
+$asQV:function(){return[J.bU]}},
 ObS:{
 "^":"b0B+lD;",
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]}},
+$asQV:function(){return[J.bU]}},
 nA:{
 "^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
 "^":"",
-qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
+qw:[function(a){if(typeof dartPrint=="function"){dartPrint(a)
 return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
 return}if(typeof window=="object")return
 if(typeof print=="function"){print(a)
-return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw"Unable to print message: "+String(a)},"$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 Ir:{
-"^":["D13;Py%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.Py},null,null,1,0,85,"error",82,104],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,86,27,[],"error",82],
+"^":["D13;Py%-341,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.Py},null,null,1,0,320,"error",308,311],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,321,30,[],"error",308],
 "@":function(){return[C.uW]},
 static:{hG:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -9687,29 +9716,29 @@
 a.X0=w
 C.OD.ZL(a)
 C.OD.oX(a)
-return a},null,null,0,0,22,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[159],
+return a},null,null,0,0,115,"new ErrorViewElement$created"]}},
+"+ErrorViewElement":[394],
 D13:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
-bf:{
-"^":["WZq;a3%-125,Ab%-125,Ln%-160,y4%-161,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.a3},null,null,1,0,87,"text",82,83],
-sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,8,27,[],"text",82],
-gzW:[function(a){return a.Ab},null,null,1,0,87,"lineMode",82,83],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,8,27,[],"lineMode",82],
-gFR:[function(a){return a.Ln},null,null,1,0,162,"callback",82,104],
+rm:{
+"^":["WZq;a3%-305,Ab%-305,Ln%-395,y4%-396,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.a3},null,null,1,0,312,"text",308,309],
+sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,32,30,[],"text",308],
+gzW:[function(a){return a.Ab},null,null,1,0,312,"lineMode",308,309],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",308],
+gFR:[function(a){return a.Ln},null,null,1,0,397,"callback",308,311],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,163,27,[],"callback",82],
-gPK:[function(a){return a.y4},null,null,1,0,164,"results",82,83],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,165,27,[],"results",82],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,398,30,[],"callback",308],
+gPK:[function(a){return a.y4},null,null,1,0,399,"results",308,309],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,400,30,[],"results",308],
 az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
 z=this.ct(a,C.eh,a.Ab,z)
 a.Ab=z
 if(J.de(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,120,7,[],121,[],119,[],"updateLineMode"],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,350,21,[],351,[],82,[],"updateLineMode"],
 kk:[function(a,b,c,d){var z,y,x
 J.zJ(b)
 z=a.a3
@@ -9718,15 +9747,15 @@
 x=R.Jk(y)
 J.kW(x,"expr",z)
 J.BM(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,120,7,[],121,[],119,[],"eval"],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,350,21,[],351,[],82,[],"eval"],
 A3:[function(a,b){var z=J.MI(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,166,7,[],"selectExpr"],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,401,21,[],"selectExpr"],
 "@":function(){return[C.Qz]},
 static:{Rp:[function(a){var z,y,x,w,v
 z=R.Jk([])
 y=$.Nd()
-x=P.Py(null,null,null,P.qU,W.I0)
-w=P.qU
+x=P.Py(null,null,null,J.O,W.I0)
+w=J.O
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
 a.Ab="1-line"
@@ -9736,39 +9765,39 @@
 a.X0=v
 C.Gh.ZL(a)
 C.Gh.oX(a)
-return a},null,null,0,0,22,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[167],
+return a},null,null,0,0,115,"new EvalBoxElement$created"]}},
+"+EvalBoxElement":[402],
 WZq:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"Tp:16;a-29",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,16,168,[],"call"],
+"^":"Tp:116;a-85",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,116,57,[],"call"],
 $isEH:true},
-"+ YW":[124]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
+"+ YW":[315]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
 Lt:{
-"^":["Nr;TS%-109,bY%-29,jv%-125,oy%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gO9:[function(a){return a.TS},null,null,1,0,126,"busy",82,83],
-sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,127,27,[],"busy",82],
-gFR:[function(a){return a.bY},null,null,1,0,22,"callback",82,104],
+"^":["Bc;TS%-304,bY%-85,jv%-305,oy%-341,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gO9:[function(a){return a.TS},null,null,1,0,307,"busy",308,309],
+sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,310,30,[],"busy",308],
+gFR:[function(a){return a.bY},null,null,1,0,115,"callback",308,311],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,16,27,[],"callback",82],
-gNW:[function(a){return a.jv},null,null,1,0,87,"expr",82,104],
-sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,8,27,[],"expr",82],
-gyG:[function(a){return a.oy},null,null,1,0,85,"result",82,104],
-syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,86,27,[],"result",82],
+sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,116,30,[],"callback",308],
+gNW:[function(a){return a.jv},null,null,1,0,312,"expr",308,311],
+sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,32,30,[],"expr",308],
+gyG:[function(a){return a.oy},null,null,1,0,320,"result",308,311],
+syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,321,30,[],"result",308],
 wB:[function(a,b,c,d){var z=a.TS
 if(z===!0)return
 if(a.bY!=null){a.TS=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.Ou(a)).YM(new R.tM(a))}},"$3","gDf",6,0,130,53,[],57,[],123,[],"evalNow"],
+this.LY(a,a.jv).ml(new R.Ou(a)).YM(new R.tM(a))}},"$3","gDf",6,0,313,118,[],199,[],289,[],"evalNow"],
 "@":function(){return[C.Vn]},
 static:{fL:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.TS=!1
@@ -9780,35 +9809,35 @@
 a.X0=w
 C.UF.ZL(a)
 C.UF.oX(a)
-return a},null,null,0,0,22,"new EvalLinkElement$created"]}},
-"+EvalLinkElement":[169],
-Nr:{
+return a},null,null,0,0,115,"new EvalLinkElement$created"]}},
+"+EvalLinkElement":[403],
+Bc:{
 "^":"xc+Pi;",
 $isd3:true},
 Ou:{
-"^":"Tp:86;a-29",
+"^":"Tp:321;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,86,92,[],"call"],
+y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,321,101,[],"call"],
 $isEH:true},
-"+ Ou":[124],
+"+ Ou":[315],
 tM:{
-"^":"Tp:22;b-29",
+"^":"Tp:115;b-85",
 $0:[function(){var z,y
 z=this.b
 y=J.RE(z)
-y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,22,"call"],
+y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,115,"call"],
 $isEH:true},
-"+ tM":[124]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ tM":[315]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 UL:{
-"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.E6]},
 static:{zY:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -9817,19 +9846,19 @@
 a.X0=w
 C.MC.ZL(a)
 C.MC.oX(a)
-return a},null,null,0,0,22,"new FieldRefElement$created"]}},
-"+FieldRefElement":[110]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+return a},null,null,0,0,115,"new FieldRefElement$created"]}},
+"+FieldRefElement":[342]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 jM:{
-"^":["pva;vt%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gt0:[function(a){return a.vt},null,null,1,0,103,"field",82,104],
-st0:[function(a,b){a.vt=this.ct(a,C.IV,a.vt,b)},null,null,3,0,105,27,[],"field",82],
-pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"^":["pva;vt%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gt0:[function(a){return a.vt},null,null,1,0,337,"field",308,311],
+st0:[function(a,b){a.vt=this.ct(a,C.IV,a.vt,b)},null,null,3,0,338,30,[],"field",308],
+pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 "@":function(){return[C.vc]},
-static:{Sy:[function(a){var z,y,x,w
+static:{bH:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -9837,16 +9866,16 @@
 a.X0=w
 C.LT.ZL(a)
 C.LT.oX(a)
-return a},null,null,0,0,22,"new FieldViewElement$created"]}},
-"+FieldViewElement":[170],
+return a},null,null,0,0,115,"new FieldViewElement$created"]}},
+"+FieldViewElement":[404],
 pva:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
 qW:{
-"^":["rs;lh%-109,qe%-109,zg%-109,Fs%-109,AP,fn,tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gU4:[function(a){return a.lh},null,null,1,0,126,"qualified",82,104],
-sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,127,27,[],"qualified",82],
+"^":["rs;lh%-304,qe%-304,zg%-304,Fs%-304,AP,fn,tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gU4:[function(a){return a.lh},null,null,1,0,307,"qualified",308,311],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,310,30,[],"qualified",308],
 P9:[function(a,b){var z,y,x
 Q.xI.prototype.P9.call(this,a,b)
 this.ct(a,C.D2,0,1)
@@ -9860,18 +9889,18 @@
 a.qe=this.ct(a,C.D2,a.qe,x)
 if(y){y=J.U6(z)
 y=y.t(z,"owner")!=null&&J.de(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,26,65,[],"refChanged"],
-gSY4:[function(a){return a.qe},null,null,1,0,126,"hasParent",82,83],
-sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,127,27,[],"hasParent",82],
-gIO:[function(a){return a.zg},null,null,1,0,126,"hasClass",82,83],
-sIO:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,127,27,[],"hasClass",82],
-gmN:[function(a){return a.Fs},null,null,1,0,126,"isDart",82,83],
-smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,127,27,[],"isDart",82],
+a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,169,242,[],"refChanged"],
+gSY4:[function(a){return a.qe},null,null,1,0,307,"hasParent",308,309],
+sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,310,30,[],"hasParent",308],
+gIO:[function(a){return a.zg},null,null,1,0,307,"hasClass",308,309],
+sIO:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,310,30,[],"hasClass",308],
+gmN:[function(a){return a.Fs},null,null,1,0,307,"isDart",308,309],
+smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,310,30,[],"isDart",308],
 "@":function(){return[C.o3]},
 static:{Wz:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.lh=!0
@@ -9884,20 +9913,20 @@
 a.X0=w
 C.Xo.ZL(a)
 C.Xo.oX(a)
-return a},null,null,0,0,22,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[171],
+return a},null,null,0,0,115,"new FunctionRefElement$created"]}},
+"+FunctionRefElement":[405],
 rs:{
 "^":"xI+Pi;",
 $isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 mk:{
-"^":["cda;De%-101,Iu%-125,Ru%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.De},null,null,1,0,103,"function",82,104],
-sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,105,27,[],"function",82],
-gUx:[function(a){return a.Iu},null,null,1,0,87,"qualifiedName",82,104],
-sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,8,27,[],"qualifiedName",82],
-gfY:[function(a){return a.Ru},null,null,1,0,87,"kind",82,104],
-sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,8,27,[],"kind",82],
+"^":["cda;De%-336,Iu%-305,Ru%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.De},null,null,1,0,337,"function",308,311],
+sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,338,30,[],"function",308],
+gUx:[function(a){return a.Iu},null,null,1,0,312,"qualifiedName",308,311],
+sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,32,30,[],"qualifiedName",308],
+gfY:[function(a){return a.Ru},null,null,1,0,312,"kind",308,311],
+sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,32,30,[],"kind",308],
 FW:[function(a,b){var z,y,x
 z=b!=null
 y=z&&J.UQ(b,"parent")!=null?J.UQ(b,"parent"):null
@@ -9906,7 +9935,7 @@
 z=z.t(b,"owner")!=null&&J.de(z.t(b,"owner").gzS(),"Class")}else z=!1
 x=z?J.UQ(b,"owner"):null
 if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
-return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,172,173,[],"_getQualifiedName"],
+return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,406,17,[],"_getQualifiedName"],
 ql:[function(a,b){var z,y
 this.ct(a,C.AO,0,1)
 this.ct(a,C.fy,0,1)
@@ -9939,13 +9968,13 @@
 case"kInvokeFieldDispatcher":a.Ru=this.ct(a,C.fy,y,"invoke field dispatcher")
 break
 default:a.Ru=this.ct(a,C.fy,y,"UNKNOWN")
-break}},"$1","gNC",2,0,26,65,[],"functionChanged"],
-pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+break}},"$1","gNC",2,0,169,242,[],"functionChanged"],
+pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -9953,49 +9982,49 @@
 a.X0=w
 C.h4.ZL(a)
 C.h4.oX(a)
-return a},null,null,0,0,22,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[174],
+return a},null,null,0,0,115,"new FunctionViewElement$created"]}},
+"+FunctionViewElement":[407],
 cda:{
 "^":"uL+Pi;",
 $isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
 "^":"",
 Qb:{
 "^":"a;HW,mS",
-F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,175],
+F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,408],
 gvH:function(a){return J.Ts(this.mS,4)},
-static:{"^":"Q0",x6:function(a,b){var z=J.RE(b)
-return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.eY(a)),z.gx(b)),4))}}},
+static:{"^":"Q0z",x6:function(a,b){var z=J.RE(b)
+return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.YD(a)),z.gx(b)),4))}}},
 uc:{
 "^":"a;Yu<,tL"},
 pL:{
-"^":["waa;hi%-29,An%-29,dW%-29,rM%-29,Ge%-29,UL%-29,PA%-125,Oh%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gys:[function(a){return a.PA},null,null,1,0,87,"status",82,83],
-sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,8,27,[],"status",82],
-gyw:[function(a){return a.Oh},null,null,1,0,103,"fragmentation",82,104],
-syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,105,27,[],"fragmentation",82],
+"^":["waa;hi%-85,An%-85,dW%-85,rM%-85,Ge%-85,UL%-85,PA%-305,Oh%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gys:[function(a){return a.PA},null,null,1,0,312,"status",308,309],
+sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",308],
+gyw:[function(a){return a.Oh},null,null,1,0,337,"fragmentation",308,311],
+syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,338,30,[],"fragmentation",308],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
 a.hi=z
 J.oL(z).yI(this.gmo(a))
-J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,21,"enteredView"],
+J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,126,"enteredView"],
 LV:[function(a,b){var z,y,x
 for(z=J.GP(b),y=0;z.G();){x=z.gl()
 if(typeof x!=="number")return H.s(x)
-y=y*256+x}return y},"$1","gzK",2,0,176,177,[],"_packColor"],
+y=y*256+x}return y},"$1","gzK",2,0,409,410,[],"_packColor"],
 tn:[function(a,b,c,d){var z,y
 z=a.UL
 y=J.uH(c,"@")
 if(0>=y.length)return H.e(y,0)
 J.kW(z,b,y[0])
 J.kW(a.rM,b,d)
-J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,178,179,[],64,[],177,[],"_addClass"],
+J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,411,412,[],12,[],410,[],"_addClass"],
 an:[function(a,b,c){var z,y,x,w,v,u,t
 for(z=J.GP(J.UQ(b,"members"));z.G();){y=z.gl()
 x=J.U6(y)
 if(!J.de(x.t(y,"type"),"@Class")){N.Jx("").To(H.d(y))
 continue}w=H.BU(C.Nm.grZ(J.uH(x.t(y,"id"),"/")),null,null)
-v=w==null?C.vT:P.r2(w)
+v=w==null?C.OY:P.r2(w)
 u=[v.j1(128),v.j1(128),v.j1(128),255]
 x=x.t(y,"name")
 t=a.UL
@@ -10004,16 +10033,16 @@
 J.kW(t,w,x[0])
 J.kW(a.rM,w,u)
 J.kW(a.Ge,this.LV(a,u),w)}this.tn(a,c,"Free",$.R2())
-this.tn(a,0,"",$.eK())},"$2","gUw",4,0,180,181,[],182,[],"_updateClassList"],
-LI:[function(a,b){var z=b==null?C.vT:P.r2(b)
-return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,183,179,[],"_classIdToRGBA"],
+this.tn(a,0,"",$.eK())},"$2","gUw",4,0,413,414,[],415,[],"_updateClassList"],
+LI:[function(a,b){var z=b==null?C.OY:P.r2(b)
+return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,416,412,[],"_classIdToRGBA"],
 Ic:[function(a,b){var z,y,x
 z=O.x6(a.An,b)
 y=z.mS
 x=J.Cl(J.Qd(z.HW),y,J.WB(y,4))
-return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,184,185,[],"_classNameAt"],
+return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,417,418,[],"_classNameAt"],
 WE:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=J.vX(a.dW,J.eY(a.An))
+z=J.vX(a.dW,J.YD(a.An))
 y=J.Ts(O.x6(a.An,b).mS,4)
 x=J.Wx(y)
 w=x.Z(y,z)
@@ -10038,7 +10067,7 @@
 break}o+=2}x=H.BU(x.t(t,"object_start"),null,null)
 r=J.UQ(a.Oh,"unit_size_bytes")
 if(typeof r!=="number")return H.s(r)
-return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,186,185,[],"_objectAt"],
+return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,419,418,[],"_objectAt"],
 U8:[function(a,b){var z,y,x,w,v,u
 z=J.RE(b)
 y=this.WE(a,z.gD7(b))
@@ -10049,9 +10078,9 @@
 v=J.Cl(J.Qd(z.HW),w,J.WB(w,4))
 u=J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,v)))
 z=J.de(u,"")?"-":H.d(u)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,166,91,[],"_handleMouseMove"],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,401,325,[],"_handleMouseMove"],
 f1:[function(a,b){var z=J.cR(this.WE(a,J.HF(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,166,91,[],"_handleClick"],
+window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,401,325,[],"_handleClick"],
 My:[function(a){var z,y,x,w
 z=a.Oh
 if(z==null||a.hi==null)return
@@ -10067,9 +10096,9 @@
 if(typeof w!=="number")return H.s(w)
 w=P.f9(J.Vf(a.hi).createImageData(x,z*w))
 a.An=w
-J.No(a.hi,J.eY(w))
-J.OE(a.hi,J.kd(a.An))
-this.ps(a,0)},"$0","gCT",0,0,21,"_updateFragmentationData"],
+J.No(a.hi,J.YD(w))
+J.OE(a.hi,J.OBt(a.An))
+this.ps(a,0)},"$0","gCT",0,0,126,"_updateFragmentationData"],
 ps:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 z=J.UQ(a.Oh,"pages")
 y=J.U6(z)
@@ -10105,20 +10134,20 @@
 J.wp(n.gRn(o),y,x.g(y,4),l)
 v=new O.Qb(o,x.g(y,4))}y=J.Vf(a.hi)
 x=a.An
-J.J4(y,x,0,0,0,w,J.eY(x),m)
-P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,187,188,[],"_renderPages"],
+J.J4(y,x,0,0,0,w,J.YD(x),m)
+P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,420,421,[],"_renderPages"],
 pA:[function(a,b){var z=a.Oh
 if(z==null)return
-J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
-YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,26,65,[],"fragmentationChanged"],
+J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,169,242,[],"fragmentationChanged"],
 "@":function(){return[C.Cu]},
-static:{"^":"nK<-29,RD<-29,SoT<-29",pn:[function(a){var z,y,x,w,v,u,t
+static:{"^":"nK<-85,RD<-85,SoT<-85",pn:[function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
 w=$.Nd()
-v=P.Py(null,null,null,P.qU,W.I0)
-u=P.qU
+v=P.Py(null,null,null,J.O,W.I0)
+u=J.O
 t=W.cv
 t=H.VM(new V.qC(P.Py(null,null,null,u,t),null,null),[u,t])
 a.rM=z
@@ -10129,41 +10158,41 @@
 a.X0=t
 C.pJ.ZL(a)
 C.pJ.oX(a)
-return a},null,null,0,0,22,"new HeapMapElement$created"]}},
-"+HeapMapElement":[189],
+return a},null,null,0,0,115,"new HeapMapElement$created"]}},
+"+HeapMapElement":[422],
 waa:{
 "^":"uL+Pi;",
 $isd3:true},
 WQ:{
-"^":"Tp:22;a-29,b-93",
-$0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,22,"call"],
+"^":"Tp:115;a-85,b-326",
+$0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,115,"call"],
 $isEH:true},
-"+ WQ":[124],
+"+ WQ":[315],
 aG:{
-"^":"Tp:105;a-29",
+"^":"Tp:338;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,105,190,[],"call"],
+y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,338,423,[],"call"],
 $isEH:true},
-"+ aG":[124],
+"+ aG":[315],
 aO:{
-"^":"Tp:75;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
 $isEH:true},
-"+ aO":[124],
+"+ aO":[315],
 oc:{
-"^":"Tp:22;a-29",
-$0:[function(){J.vP(this.a)},"$0",null,0,0,22,"call"],
+"^":"Tp:115;a-85",
+$0:[function(){J.vP(this.a)},"$0",null,0,0,115,"call"],
 $isEH:true},
-"+ oc":[124]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+"+ oc":[315]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 jY:{
-"^":["V4;GQ%-29,J0%-29,Oc%-29,CO%-29,nc%-192,Ol%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gLF:[function(a){return a.nc},null,null,1,0,193,"classTable",82,83],
-sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,194,27,[],"classTable",82],
-gB1:[function(a){return a.Ol},null,null,1,0,103,"profile",82,104],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,105,27,[],"profile",82],
+"^":["V4;GQ%-85,J0%-85,Oc%-85,CO%-85,nc%-425,Ol%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gLF:[function(a){return a.nc},null,null,1,0,426,"classTable",308,309],
+sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,427,30,[],"classTable",308],
+gB1:[function(a){return a.Ol},null,null,1,0,337,"profile",308,311],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,338,30,[],"profile",308],
 i4:[function(a){var z,y
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
@@ -10176,10 +10205,10 @@
 z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
 a.CO=z
 z.bG.u(0,"title","Old Space")
-this.uB(a)},"$0","gQd",0,0,21,"enteredView"],
+this.uB(a)},"$0","gQd",0,0,126,"enteredView"],
 hZ:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=a.Ol
-if(z==null||!J.x(J.UQ(z,"members")).$iszM||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
+if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
 a.nc.lb()
 for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
 if(this.K1(a,y))continue
@@ -10205,23 +10234,23 @@
 J.qK(a.Oc,["Used",z.t(o,"used")])
 J.qK(a.Oc,["Free",J.xH(z.t(o,"capacity"),z.t(o,"used"))])
 J.qK(a.Oc,["External",z.t(o,"external")])
-this.uB(a)},"$0","gYs",0,0,21,"_updateChartData"],
+this.uB(a)},"$0","gYs",0,0,126,"_updateChartData"],
 uB:[function(a){var z=a.J0
 if(z==null)return
 z.W2(a.GQ)
-a.CO.W2(a.Oc)},"$0","goI",0,0,21,"_draw"],
+a.CO.W2(a.Oc)},"$0","goI",0,0,126,"_draw"],
 AE:[function(a,b,c,d){var z,y
 if(!!J.x(d).$isqk){z=a.nc.gxp()
 y=d.cellIndex
 if(z==null?y!=null:z!==y){a.nc.sxp(y)
-J.Yl(a.nc)}}},"$3","gQq",6,0,195,7,[],121,[],119,[],"changeSort",83],
+J.Yl(a.nc)}}},"$3","gQq",6,0,428,21,[],351,[],82,[],"changeSort",309],
 K1:[function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
 x=z.t(b,"old")
 for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
 for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"$1","gbU",2,0,196,70,[],"_classHasNoAllocations"],
+return!0},"$1","gbU",2,0,429,122,[],"_classHasNoAllocations"],
 VI:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:return J.UQ(J.UQ(b,"new"),7)
@@ -10235,40 +10264,40 @@
 case 7:z=J.U6(b)
 return J.WB(J.UQ(z.t(b,"old"),3),J.UQ(z.t(b,"old"),5))
 case 8:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,197,70,[],73,[],"_combinedTableColumnValue"],
+return J.WB(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,430,122,[],15,[],"_combinedTableColumnValue"],
 pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 cQ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,26,106,[],"refreshGC"],
+J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,169,339,[],"refreshGC"],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,26,106,[],"resetAccumulator"],
+J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,169,339,[],"resetAccumulator"],
 pM:[function(a,b){var z,y,x,w
 try{this.hZ(a)}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 N.Jx("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,26,65,[],"profileChanged"],
+this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,169,242,[],"profileChanged"],
 Ar:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,198,199,[],"formattedAverage",83],
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,431,432,[],"formattedAverage",309],
 uW:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,198,199,[],"formattedCollections",83],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,431,432,[],"formattedCollections",309],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,198,199,[],"formattedTotalCollectionTime",83],
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,431,432,[],"formattedTotalCollectionTime",309],
 Dd:[function(a){var z=new G.ig(P.zV(J.UQ($.NR,"DataTable"),null))
 a.GQ=z
 z.Gl("string","Type")
@@ -10280,12 +10309,12 @@
 z=H.VM([],[G.Ni])
 z=this.ct(a,C.M5,a.nc,new G.Vz([new G.Kt("Class",G.My()),new G.Kt("Accumulator Size (New)",G.AF()),new G.Kt("Accumulator (New)",G.Vj()),new G.Kt("Current Size (New)",G.AF()),new G.Kt("Current (New)",G.Vj()),new G.Kt("Accumulator Size (Old)",G.AF()),new G.Kt("Accumulator (Old)",G.Vj()),new G.Kt("Current Size (Old)",G.AF()),new G.Kt("Current (Old)",G.Vj())],z,[],0,!0,null,null))
 a.nc=z
-z.sxp(1)},null,null,0,0,22,"created"],
+z.sxp(1)},null,null,0,0,115,"created"],
 "@":function(){return[C.dA]},
-static:{"^":"BO<-29,bQj<-29,xK<-29,V1g<-29,r1K<-29,qEV<-29,pC<-29,DY2<-29",Lz:[function(a){var z,y,x,w
+static:{"^":"BO<-85,bQj<-85,xK<-85,V1g<-85,r1K<-85,qEV<-85,pC<-85,DY2<-85",Lz:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -10294,65 +10323,65 @@
 C.Vc.ZL(a)
 C.Vc.oX(a)
 C.Vc.Dd(a)
-return a},null,null,0,0,22,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[200],
+return a},null,null,0,0,115,"new HeapProfileElement$created"]}},
+"+HeapProfileElement":[433],
 V4:{
 "^":"uL+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:105;a-29",
+"^":"Tp:338;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,338,423,[],"call"],
 $isEH:true},
-"+ nx":[124],
+"+ nx":[315],
 jm:{
-"^":"Tp:75;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
 $isEH:true},
-"+ jm":[124],
+"+ jm":[315],
 AN:{
-"^":"Tp:105;a-29",
+"^":"Tp:338;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,338,423,[],"call"],
 $isEH:true},
-"+ AN":[124],
+"+ AN":[315],
 Ao:{
-"^":"Tp:75;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
 $isEH:true},
-"+ Ao":[124],
+"+ Ao":[315],
 xj:{
-"^":"Tp:105;a-29",
+"^":"Tp:338;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,338,423,[],"call"],
 $isEH:true},
-"+ xj":[124],
+"+ xj":[315],
 VB:{
-"^":"Tp:75;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
 $isEH:true},
-"+ VB":[124]}],["html_common","dart:html_common",,P,{
+"+ VB":[315]}],["html_common","dart:html_common",,P,{
 "^":"",
-bL:function(a){var z,y
+bL:[function(a){var z,y
 z=[]
 y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).$1(a)
 new P.wO().$0()
-return y},
-o7:function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},
-f9:function(a){var z,y
+return y},"$1","Lq",2,0,null,30,[]],
+o7:[function(a,b){var z=[]
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},"$2$mustCopy","A1",2,3,null,223,6,[],251,[]],
+f9:[function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
 if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.la(a.data,a.height,a.width)},
-QO:function(a){if(!!J.x(a).$isla)return{data:a.Rn,height:a.fg,width:a.R}
-return a},
+y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"$1","D3",2,0,null,252,[]],
+QO:[function(a){if(!!J.x(a).$isqS)return{data:a.Rn,height:a.fg,width:a.R}
+return a},"$1","Gg",2,0,null,253,[]],
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
 $.L4=z}return z},
@@ -10360,34 +10389,34 @@
 if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
 $.PN=z}return z},
 aI:{
-"^":"Tp:52;b,c",
-$1:function(a){var z,y,x
+"^":"Tp:200;b,c",
+$1:[function(a){var z,y,x
 z=this.b
 y=z.length
 for(x=0;x<y;++x)if(z[x]===a)return x
 z.push(a)
 this.c.push(null)
-return y},
+return y},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rG:{
-"^":"Tp:137;d",
-$1:function(a){var z=this.d
+"^":"Tp:363;d",
+$1:[function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
-return z[a]},
+return z[a]},"$1",null,2,0,null,334,[],"call"],
 $isEH:true},
 yh:{
-"^":"Tp:201;e",
-$2:function(a,b){var z=this.e
+"^":"Tp:434;e",
+$2:[function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
-z[a]=b},
+z[a]=b},"$2",null,4,0,null,334,[],28,[],"call"],
 $isEH:true},
 wO:{
-"^":"Tp:22;",
-$0:function(){},
+"^":"Tp:115;",
+$0:[function(){},"$0",null,0,0,null,"call"],
 $isEH:true},
 Tm:{
-"^":"Tp:16;f,UI,bK",
-$1:function(a){var z,y,x,w,v,u
+"^":"Tp:116;f,UI,bK",
+$1:[function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -10409,7 +10438,7 @@
 z.a=w
 this.bK.$2(x,w)
 y.aN(a,new P.ib(z,this))
-return z.a}if(!!y.$iszM){v=y.gB(a)
+return z.a}if(!!y.$isList){v=y.gB(a)
 x=this.f.$1(a)
 w=this.UI.$1(x)
 if(w!=null){if(!0===w){w=new Array(v)
@@ -10419,37 +10448,37 @@
 u=0
 for(;u<v;++u){z=this.$1(y.t(a,u))
 if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ib:{
-"^":"Tp:75;a,Gq",
-$2:function(a,b){this.a.a[a]=this.Gq.$1(b)},
+"^":"Tp:300;a,Gq",
+$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 CA:{
-"^":"Tp:52;a,b",
-$1:function(a){var z,y,x,w
+"^":"Tp:200;a,b",
+$1:[function(a){var z,y,x,w
 z=this.a
 y=z.length
 for(x=0;x<y;++x){w=z[x]
 if(w==null?a==null:w===a)return x}z.push(a)
 this.b.push(null)
-return y},
+return y},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 YL:{
-"^":"Tp:137;c",
-$1:function(a){var z=this.c
+"^":"Tp:363;c",
+$1:[function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
-return z[a]},
+return z[a]},"$1",null,2,0,null,334,[],"call"],
 $isEH:true},
 KC:{
-"^":"Tp:201;d",
-$2:function(a,b){var z=this.d
+"^":"Tp:434;d",
+$2:[function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
-z[a]=b},
+z[a]=b},"$2",null,4,0,null,334,[],28,[],"call"],
 $isEH:true},
 xL:{
-"^":"Tp:16;e,f,UI,bK",
-$1:function(a){var z,y,x,w,v,u,t
+"^":"Tp:116;e,f,UI,bK",
+$1:[function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
 if(typeof a==="number")return a
@@ -10473,11 +10502,11 @@
 u=J.w1(y)
 t=0
 for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
-return y}return a},
+return y}return a},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
-la:{
+qS:{
 "^":"a;Rn>,fg>,R>",
-$isla:true,
+$isqS:true,
 $isSg:true},
 As:{
 "^":"a;",
@@ -10496,11 +10525,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.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,202],
+return H.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,435,128,[]],
 ev:function(a,b){var z=this.lF()
 return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},
 Ft:[function(a,b){var z=this.lF()
-return H.VM(new H.kV(z,b),[H.ip(z,"mW",0),null])},"$1","git",2,0,203],
+return H.VM(new H.kV(z,b),[H.ip(z,"mW",0),null])},"$1","git",2,0,436,128,[]],
 Vr:function(a,b){return this.lF().Vr(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
@@ -10529,21 +10558,21 @@
 this.p5(z)
 return y},
 $isz5:true,
-$asz5:function(){return[P.qU]},
+$asz5:function(){return[J.O]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.qU]}},
+$asQV:function(){return[J.O]}},
 GE:{
-"^":"Tp:16;a",
-$1:function(a){return a.h(0,this.a)},
+"^":"Tp:116;a",
+$1:[function(a){return a.h(0,this.a)},"$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 rl:{
-"^":"Tp:16;a",
-$1:function(a){return a.FV(0,this.a)},
+"^":"Tp:116;a",
+$1:[function(a){return a.FV(0,this.a)},"$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 uQ:{
-"^":"Tp:16;",
-$1:function(a){return a.V1(0)},
+"^":"Tp:116;",
+$1:[function(a){return a.V1(0)},"$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 D7:{
 "^":"ar;ndS,h2",
@@ -10583,36 +10612,36 @@
 gA:function(a){var z=this.gzT()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
-"^":"Tp:16;",
-$1:function(a){return!!J.x(a).$iscv},
+"^":"Tp:116;",
+$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 GS:{
-"^":"Tp:16;",
-$1:function(a){return J.QC(a)},
+"^":"Tp:116;",
+$1:[function(a){return J.QC(a)},"$1",null,2,0,null,295,[],"call"],
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
 pR:{
-"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gD5:[function(a){var z=a.tY
 if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
 else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
 else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,87,"hoverText"],
-Qx:[function(a){return this.gus(a)},"$0","gyX",0,0,22,"expander"],
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,312,"hoverText"],
+Qx:[function(a){return this.gus(a)},"$0","gyX",0,0,115,"expander"],
 vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,204,205,[],106,[],"expandEvent"],
+c.$0()}},"$2","gus",4,0,437,438,[],339,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{lu:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -10621,32 +10650,32 @@
 a.X0=w
 C.cp.ZL(a)
 C.cp.oX(a)
-return a},null,null,0,0,22,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[110],
+return a},null,null,0,0,115,"new InstanceRefElement$created"]}},
+"+InstanceRefElement":[342],
 Js:{
-"^":"Tp:16;a-29",
+"^":"Tp:116;a-85",
 $1:[function(a){var z,y
 z=J.U6(a)
 if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
 a.szz(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
-y.ct(z,C.kY,0,1)},"$1",null,2,0,16,168,[],"call"],
+y.ct(z,C.kY,0,1)},"$1",null,2,0,116,57,[],"call"],
 $isEH:true},
-"+ Js":[124]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[315]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["V9;Xh%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gQr:[function(a){return a.Xh},null,null,1,0,103,"instance",82,104],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,105,27,[],"instance",82],
-vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
-Xe:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,111,113,[],"retainedSize"],
-pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
-"@":function(){return[C.be]},
+"^":["V9;Xh%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gQr:[function(a){return a.Xh},null,null,1,0,337,"instance",308,311],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,338,30,[],"instance",308],
+vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
+Xe:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,343,344,[],"retainedSize"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
+"@":function(){return[C.qlk]},
 static:{Co:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -10654,15 +10683,15 @@
 a.X0=w
 C.pU.ZL(a)
 C.pU.oX(a)
-return a},null,null,0,0,22,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[206],
+return a},null,null,0,0,115,"new InstanceViewElement$created"]}},
+"+InstanceViewElement":[439],
 V9:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 Se:{
-"^":["Y2;B1>,SF<-207,H<-207,Zn@-125,vs@-125,ki@-125,Vh@-125,LH@-125,eT,yt-93,wd-94,oH-95,R7,aZ,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
-gtT:[function(a){return J.on(this.H)},null,null,1,0,115,"code",82],
+"^":["Y2;B1>,SF<-440,H<-440,Zn@-305,vs@-305,ki@-305,Vh@-305,LH@-305,eT,yt-326,wd-327,oH-328,R7,aZ,cp,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
+gtT:[function(a){return J.on(this.H)},null,null,1,0,346,"code",308],
 C4:function(a){var z,y,x,w,v,u,t,s,r
 z=this.B1
 y=J.UQ(z,"threshold")
@@ -10700,25 +10729,25 @@
 z.mW(a,b,c,d)
 return z}}},
 E7:{
-"^":["V10;pD%-101,zt%-109,eH%-125,NT%-125,Xv%-125,M5%-125,ik%-125,jS%-125,XX%-208,BJ%-125,qO=-29,Hm%-209,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.pD},null,null,1,0,103,"profile",82,104],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,105,27,[],"profile",82],
-gPL:[function(a){return a.zt},null,null,1,0,126,"hideTagsChecked",82,83],
-sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,127,27,[],"hideTagsChecked",82],
-gEW:[function(a){return a.eH},null,null,1,0,87,"sampleCount",82,83],
-sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,8,27,[],"sampleCount",82],
-gUo:[function(a){return a.NT},null,null,1,0,87,"refreshTime",82,83],
-sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,8,27,[],"refreshTime",82],
-gEly:[function(a){return a.Xv},null,null,1,0,87,"sampleRate",82,83],
-sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,8,27,[],"sampleRate",82],
-gIZ:[function(a){return a.M5},null,null,1,0,87,"sampleDepth",82,83],
-sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,8,27,[],"sampleDepth",82],
-gNG:[function(a){return a.ik},null,null,1,0,87,"displayCutoff",82,83],
-sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,8,27,[],"displayCutoff",82],
-gQl:[function(a){return a.jS},null,null,1,0,87,"timeSpan",82,83],
-sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,8,27,[],"timeSpan",82],
-gib:[function(a){return a.BJ},null,null,1,0,87,"tagSelector",82,83],
-sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,8,27,[],"tagSelector",82],
+"^":["V10;pD%-336,zt%-304,eH%-305,NT%-305,Xv%-305,M5%-305,ik%-305,jS%-305,XX%-441,BJ%-305,qO=-85,Hm%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,337,"profile",308,311],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,338,30,[],"profile",308],
+gPL:[function(a){return a.zt},null,null,1,0,307,"hideTagsChecked",308,309],
+sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,310,30,[],"hideTagsChecked",308],
+gEW:[function(a){return a.eH},null,null,1,0,312,"sampleCount",308,309],
+sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,32,30,[],"sampleCount",308],
+gUo:[function(a){return a.NT},null,null,1,0,312,"refreshTime",308,309],
+sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,32,30,[],"refreshTime",308],
+gEly:[function(a){return a.Xv},null,null,1,0,312,"sampleRate",308,309],
+sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",308],
+gIZ:[function(a){return a.M5},null,null,1,0,312,"sampleDepth",308,309],
+sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",308],
+gNG:[function(a){return a.ik},null,null,1,0,312,"displayCutoff",308,309],
+sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",308],
+gQl:[function(a){return a.jS},null,null,1,0,312,"timeSpan",308,309],
+sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,32,30,[],"timeSpan",308],
+gib:[function(a){return a.BJ},null,null,1,0,312,"tagSelector",308,309],
+sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,32,30,[],"tagSelector",308],
 pM:[function(a,b){var z,y,x,w
 z=a.pD
 if(z==null)return
@@ -10741,27 +10770,27 @@
 a.ik=this.ct(a,C.aH,a.ik,z)
 J.QP(a.pD).N3(a.pD)
 J.kW(a.pD,"threshold",a.XX)
-this.Cx(a)},"$1","gwm",2,0,26,65,[],"profileChanged"],
+this.Cx(a)},"$1","gwm",2,0,169,242,[],"profileChanged"],
 i4:[function(a){var z=R.Jk([])
 a.Hm=new G.XN(z,null,null)
-this.Cx(a)},"$0","gQd",0,0,21,"enteredView"],
-m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,26,65,[],"tagSelectorChanged"],
+this.Cx(a)},"$0","gQd",0,0,126,"enteredView"],
+m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,169,242,[],"tagSelectorChanged"],
 pA:[function(a,b){var z="profile?tags="+H.d(a.BJ)
-J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 Cx:[function(a){if(a.pD==null)return
-this.EX(a)},"$0","gBn",0,0,21,"_update"],
+this.EX(a)},"$0","gBn",0,0,126,"_update"],
 EX:[function(a){var z,y,x,w,v
 z=J.QP(a.pD).gBC()
 if(z==null)return
 try{a.Hm.rT(X.SJ(a.pD,z,z,null))}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,21,"_buildStackTree"],
-ba:[function(a){this.EX(a)},"$0","gvr",0,0,21,"_buildTree"],
-ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,210,98,[],"padding",83],
+N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,126,"_buildStackTree"],
+ba:[function(a){this.EX(a)},"$0","gvr",0,0,126,"_buildTree"],
+ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,443,331,[],"padding",309],
 ZZ:[function(a,b){var z=J.bY(J.xH(b.gyt(),1),9)
 if(z>>>0!==z||z>=9)return H.e(C.Ym,z)
-return C.Ym[z]},"$1","gth",2,0,210,98,[],"coloring",83],
+return C.Ym[z]},"$1","gth",2,0,443,331,[],"coloring",309],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.de(J.F8(w.gN(b)),"expand")&&!J.de(w.gN(b),d))return
@@ -10772,12 +10801,12 @@
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
-N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,195,7,[],121,[],119,[],"toggleExpanded",83],
+N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,428,21,[],351,[],82,[],"toggleExpanded",309],
 "@":function(){return[C.jR]},
-static:{"^":"B6<-29",jD:[function(a){var z,y,x,w
+static:{"^":"B6<-85",jD:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.eH=""
@@ -10794,27 +10823,27 @@
 a.X0=w
 C.kS.ZL(a)
 C.kS.oX(a)
-return a},null,null,0,0,22,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[211],
+return a},null,null,0,0,115,"new IsolateProfileElement$created"]}},
+"+IsolateProfileElement":[444],
 V10:{
 "^":"uL+Pi;",
 $isd3:true},
 SV:{
-"^":"Tp:105;a-29",
+"^":"Tp:338;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,105,212,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,338,202,[],"call"],
 $isEH:true},
-"+ SV":[124]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+"+ SV":[315]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oO:{
-"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.j6]},
 static:{Zgg:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -10823,18 +10852,18 @@
 a.X0=w
 C.LN.ZL(a)
 C.LN.oX(a)
-return a},null,null,0,0,22,"new IsolateRefElement$created"]}},
-"+IsolateRefElement":[110]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+return a},null,null,0,0,115,"new IsolateRefElement$created"]}},
+"+IsolateRefElement":[342]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
 Stq:{
-"^":["V11;Pw%-213,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,81,"isolate",82,104],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,84,27,[],"isolate",82],
+"^":["V11;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
 "@":function(){return[C.aM]},
 static:{N5:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -10842,14 +10871,136 @@
 a.X0=w
 C.Qt.ZL(a)
 C.Qt.oX(a)
-return a},null,null,0,0,22,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[214],
+return a},null,null,0,0,115,"new IsolateSummaryElement$created"]}},
+"+IsolateSummaryElement":[446],
 V11:{
 "^":"uL+Pi;",
+$isd3:true},
+IWF:{
+"^":["V12;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
+TJ:[function(a,b){return a.Pw.cv("debug/pause").ml(new D.GG(a))},"$1","gAK",2,0,447,117,[],"pause"],
+nY:[function(a,b){return a.Pw.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,447,117,[],"resume"],
+"@":function(){return[C.Xuf]},
+static:{dm:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.F2.ZL(a)
+C.F2.oX(a)
+return a},null,null,0,0,115,"new IsolateRunStateElement$created"]}},
+"+IsolateRunStateElement":[448],
+V12:{
+"^":"uL+Pi;",
+$isd3:true},
+GG:{
+"^":"Tp:116;a-85",
+$1:[function(a){return J.am(J.qz(this.a))},"$1",null,2,0,116,57,[],"call"],
+$isEH:true},
+"+ GG":[315],
+r8:{
+"^":"Tp:116;a-85",
+$1:[function(a){return J.am(J.qz(this.a))},"$1",null,2,0,116,57,[],"call"],
+$isEH:true},
+"+ r8":[315],
+Yj:{
+"^":["V13;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
+"@":function(){return[C.Ux]},
+static:{b2:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.rC.ZL(a)
+C.rC.oX(a)
+return a},null,null,0,0,115,"new IsolateLocationElement$created"]}},
+"+IsolateLocationElement":[449],
+V13:{
+"^":"uL+Pi;",
+$isd3:true},
+Oz:{
+"^":["V14;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
+"@":function(){return[C.Po]},
+static:{RP:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.kd.ZL(a)
+C.kd.oX(a)
+return a},null,null,0,0,115,"new IsolateSharedSummaryElement$created"]}},
+"+IsolateSharedSummaryElement":[450],
+V14:{
+"^":"uL+Pi;",
+$isd3:true},
+vT:{
+"^":"a;z3,Nt",
+eC:function(a){var z,y,x,w,v,u
+z=this.z3.Yb
+if(J.de(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Name"])
+z.V7("addColumn",["number","Value"])}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
+for(y=J.GP(a.gvc()),x=J.U6(a);y.G();){w=y.gl()
+v=J.uH(x.t(a,w),"%")
+if(0>=v.length)return H.e(v,0)
+u=[]
+C.Nm.FV(u,C.Nm.ez([w,H.IH(v[0],null)],P.En()))
+u=new P.Tz(u)
+u.$builtinTypeInfo=[null]
+z.V7("addRow",[u])}},
+W2:function(a){var z=this.Nt
+if(z==null){z=new G.qu(null,P.L5(null,null,null,null,null))
+z.vR=P.zV(J.UQ($.NR,"PieChart"),[a])
+this.Nt=z}z.W2(this.z3)}},
+YA:{
+"^":["V15;E1%-451,iF%-452,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ghw:[function(a){return a.E1},null,null,1,0,453,"counters",308,311],
+shw:[function(a,b){a.E1=this.ct(a,C.MR,a.E1,b)},null,null,3,0,454,30,[],"counters",308],
+ak:[function(a,b){var z,y
+z=a.E1
+if(z==null)return
+a.iF.eC(z)
+y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#counterPieChart")
+if(y!=null)a.iF.W2(y)},"$1","gAB",2,0,169,242,[],"countersChanged"],
+"@":function(){return[C.Bd]},
+static:{BP:[function(a){var z,y,x,w,v
+z=P.zV(J.UQ($.NR,"DataTable"),null)
+y=$.Nd()
+x=P.Py(null,null,null,J.O,W.I0)
+w=J.O
+v=W.cv
+v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
+a.iF=new D.vT(new G.ig(z),null)
+a.SO=y
+a.B7=x
+a.X0=v
+C.wQ.ZL(a)
+C.wQ.oX(a)
+return a},null,null,0,0,115,"new IsolateCounterChartElement$created"]}},
+"+IsolateCounterChartElement":[455],
+V15:{
+"^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
 Lr:{
-"^":"a;hO,YT",
+"^":"a;hO,Pl",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
 z=this.hO.Yb
 if(J.de(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
@@ -10871,55 +11022,56 @@
 if(r===0){q=0
 while(!0){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-y=J.q8(y[u].ghw())
+y=J.q8(J.Mv(y[u]))
 if(typeof y!=="number")return H.s(y)
 if(!(q<y))break
 c$1:{if(q===w)break c$1
 s.push(0)}++q}}else{q=0
 while(!0){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-y=J.q8(y[u].ghw())
+y=J.q8(J.Mv(y[u]))
 if(typeof y!=="number")return H.s(y)
 if(!(q<y))break
 c$1:{if(q===w)break c$1
 y=a.glI()
 if(u>=y.length)return H.e(y,u)
-s.push(C.CD.yu(J.FW(J.UQ(y[u].ghw(),q),r)*100))}++q}}y=[]
+s.push(C.CD.yu(J.FW(J.UQ(J.Mv(y[u]),q),r)*100))}++q}}y=[]
 C.Nm.FV(y,C.Nm.ez(s,P.En()))
 y=new P.Tz(y)
 y.$builtinTypeInfo=[null]
 z.V7("addRow",[y])}},
 W2:function(a){var z,y
-if(this.YT==null){z=P.L5(null,null,null,null,null)
+if(this.Pl==null){z=P.L5(null,null,null,null,null)
 y=new G.qu(null,z)
 y.vR=P.zV(J.UQ($.NR,"SteppedAreaChart"),[a])
-this.YT=y
+this.Pl=y
 z.u(0,"isStacked",!0)
-this.YT.bG.u(0,"connectSteps",!1)
-this.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.YT.W2(this.hO)}},
+this.Pl.bG.u(0,"connectSteps",!1)
+this.Pl.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.Pl.W2(this.hO)}},
 qkb:{
-"^":["V12;oY%-213,ts%-215,e6%-216,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.oY},null,null,1,0,81,"isolate",82,104],
-sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,84,27,[],"isolate",82],
+"^":["V16;oY%-445,ts%-456,e6%-457,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.oY},null,null,1,0,318,"isolate",308,311],
+sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,319,30,[],"isolate",308],
 vV:[function(a,b){var z=a.oY
-return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
-Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,21,"_updateTagProfile"],
+return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
+Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,126,"_updateTagProfile"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,21,"enteredView"],
+a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,126,"enteredView"],
 xo:[function(a){var z
 Z.uL.prototype.xo.call(this,a)
 z=a.ts
-if(z!=null)z.ed()},"$0","gbt",0,0,21,"leftView"],
+if(z!=null)z.ed()},"$0","gbt",0,0,126,"leftView"],
 Ob:[function(a){var z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#tagProfileChart")
-if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,21,"_drawTagProfileChart"],
-pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
-xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"$3","gDQ",6,0,130,53,[],57,[],123,[],"resume"],
+if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,126,"_drawTagProfileChart"],
+pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
+TJ:[function(a,b){return a.oY.cv("debug/pause").ml(new L.CV(a))},"$1","gAK",2,0,447,117,[],"pause"],
+nY:[function(a,b){return a.oY.cv("resume").ml(new L.IT(a))},"$1","gDQ",2,0,447,117,[],"resume"],
 "@":function(){return[C.NG]},
 static:{uD:[function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.NR,"DataTable"),null)
 y=$.Nd()
-x=P.Py(null,null,null,P.qU,W.I0)
-w=P.qU
+x=P.Py(null,null,null,J.O,W.I0)
+w=J.O
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
 a.e6=new L.Lr(new G.ig(z),null)
@@ -10928,27 +11080,32 @@
 a.X0=v
 C.Xe.ZL(a)
 C.Xe.oX(a)
-return a},null,null,0,0,22,"new IsolateViewElement$created"]}},
-"+IsolateViewElement":[217],
-V12:{
+return a},null,null,0,0,115,"new IsolateViewElement$created"]}},
+"+IsolateViewElement":[458],
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 BQ:{
-"^":"Tp:16;a-29",
+"^":"Tp:116;a-85",
 $1:[function(a){var z,y,x
 z=this.a
 y=J.RE(z)
 y.ge6(z).eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
 if(x!=null)y.ge6(z).W2(x)
-y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,16,218,[],"call"],
+y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,116,459,[],"call"],
 $isEH:true},
-"+ BQ":[124],
+"+ BQ":[315],
+CV:{
+"^":"Tp:116;a-85",
+$1:[function(a){return J.am(J.Ag(this.a))},"$1",null,2,0,116,57,[],"call"],
+$isEH:true},
+"+ CV":[315],
 IT:{
-"^":"Tp:16;a-29",
-$1:[function(a){J.am(J.Ag(this.a))},"$1",null,2,0,16,168,[],"call"],
+"^":"Tp:116;a-85",
+$1:[function(a){return J.am(J.Ag(this.a))},"$1",null,2,0,116,57,[],"call"],
 $isEH:true},
-"+ IT":[124]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+"+ IT":[315]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 fM:{
 "^":"a;Fv,lp",
@@ -10967,7 +11124,7 @@
 x.vM+=q
 this.KN(t,v)
 q=x.vM+=s?r:H.d(r)
-x.vM=q+"}\n"}else if(!!s.$iszM){if(typeof "  "!=="number")return H.s("  ")
+x.vM=q+"}\n"}else if(!!s.$isList){if(typeof "  "!=="number")return H.s("  ")
 r=b*"  "
 s=typeof r==="string"
 x.vM+=s?r:H.d(r)
@@ -10994,7 +11151,7 @@
 x.vM=s+"{\n"
 this.KN(v,w)
 s=x.vM+=u?t:H.d(t)
-x.vM=s+"}\n"}else if(!!u.$iszM){if(typeof "  "!=="number")return H.s("  ")
+x.vM=s+"}\n"}else if(!!u.$isList){if(typeof "  "!=="number")return H.s("  ")
 t=b*"  "
 u=typeof t==="string"
 s=x.vM+=u?t:H.d(t)
@@ -11007,12 +11164,12 @@
 u=x.vM+=typeof v==="string"?v:H.d(v)
 x.vM=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":["V13;OZ%-101,X7%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gIr:[function(a){return a.OZ},null,null,1,0,103,"map",82,104],
+"^":["V17;OZ%-336,X7%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gIr:[function(a){return a.OZ},null,null,1,0,337,"map",308,311],
 ez:function(a,b){return this.gIr(a).$1(b)},
-sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,105,27,[],"map",82],
-gdQ:[function(a){return a.X7},null,null,1,0,87,"mapAsString",82,83],
-sdQ:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,8,27,[],"mapAsString",82],
+sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,338,30,[],"map",308],
+gxU:[function(a){return a.X7},null,null,1,0,312,"mapAsString",308,309],
+sxU:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,32,30,[],"mapAsString",308],
 oC:[function(a,b){var z,y,x
 z=P.p9("")
 y=P.Ls(null,null,null,null)
@@ -11022,12 +11179,12 @@
 new Z.fM(z,y).KN(x,0)
 z.KF("}\n")
 z=z.vM
-a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,26,65,[],"mapChanged"],
+a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,169,242,[],"mapChanged"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -11035,19 +11192,19 @@
 a.X0=w
 C.Yt.ZL(a)
 C.Yt.oX(a)
-return a},null,null,0,0,22,"new JsonViewElement$created"]}},
-"+JsonViewElement":[219],
-V13:{
+return a},null,null,0,0,115,"new JsonViewElement$created"]}},
+"+JsonViewElement":[460],
+V17:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.uy]},
 static:{rA:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -11056,20 +11213,20 @@
 a.X0=w
 C.Z3.ZL(a)
 C.Z3.oX(a)
-return a},null,null,0,0,22,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[110]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+return a},null,null,0,0,115,"new LibraryRefElement$created"]}},
+"+LibraryRefElement":[342]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 KL:{
-"^":["V14;a1%-220,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.a1},null,null,1,0,221,"library",82,104],
-stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,222,27,[],"library",82],
-vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
-pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"^":["V18;a1%-461,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.a1},null,null,1,0,462,"library",308,311],
+stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,463,30,[],"library",308],
+vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
+pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 "@":function(){return[C.Oyb]},
 static:{Ro:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -11077,9 +11234,9 @@
 a.X0=w
 C.MG.ZL(a)
 C.MG.oX(a)
-return a},null,null,0,0,22,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[223],
-V14:{
+return a},null,null,0,0,115,"new LibraryViewElement$created"]}},
+"+LibraryViewElement":[464],
+V18:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
@@ -11131,17 +11288,17 @@
 $isTJ:true,
 static:{"^":"DY",Jx:function(a){return $.U0().to(a,new N.dG(a))}}},
 dG:{
-"^":"Tp:22;a",
-$0:function(){var z,y,x,w,v
+"^":"Tp:115;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 '.'"))
 y=C.xB.cn(z,".")
 if(y===-1)x=z!==""?N.Jx(""):null
 else{x=N.Jx(C.xB.Nj(z,0,y))
-z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.TJ)
+z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,J.O,N.TJ)
 v=new N.TJ(z,x,null,w,H.VM(new Q.Gj(w),[null,null]),null)
 v.QL(z,x,w)
-return v},
+return v},"$0",null,0,0,null,"call"],
 $isEH:true},
 qV:{
 "^":"a;oc>,P>",
@@ -11165,41 +11322,41 @@
 giO:function(a){return this.P},
 bu:function(a){return this.oc},
 $isqV:true,
-static:{"^":"K9,tmj,EL,LkO,reI,pd,EN,MHK,ow,lM,B9"}},
+static:{"^":"K9,tmj,EL,LkO,reI,pd,dc,MHK,ow,lM,B9"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
 bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
 $isHV:true,
-static:{"^":"xO"}}}],["","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
+static:{"^":"xO"}}}],["","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
 "^":"",
-E2:function(){N.Jx("").sOR(C.IF)
+E2:[function(){N.Jx("").sOR(C.IF)
 N.Jx("").gSZ().yI(new F.em())
 N.Jx("").To("Starting Observatory")
 var z=H.VM(new P.Zf(P.Dt(null)),[null])
 N.Jx("").To("Loading Google Charts API")
 J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],null,null))])
-z.MM.ml(G.vN()).ml(new F.Lb())},
+z.MM.ml(G.vN()).ml(new F.Lb())},"$0","qg",0,0,null],
 em:{
-"^":"Tp:225;",
+"^":"Tp:466;",
 $1:[function(a){var z
 if(J.de(a.gOR(),C.nT)){z=J.RE(a)
 if(J.co(z.gG1(a),"Error evaluating expression"))z=J.kE(z.gG1(a),"Can't assign to null: ")===!0||J.kE(z.gG1(a),"Expression is not assignable: ")===!0
 else z=!1}else z=!1
 if(z)return
-P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,224,[],"call"],
+P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,465,[],"call"],
 $isEH:true},
 Lb:{
-"^":"Tp:16;",
+"^":"Tp:116;",
 $1:[function(a){N.Jx("").To("Initializing Polymer")
-A.Ok()},"$1",null,2,0,null,17,[],"call"],
-$isEH:true}}],["metadata","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
+A.Ok()},"$1",null,2,0,null,117,[],"call"],
+$isEH:true}}],["metadata","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
 jh:{
 "^":"a;T9,Ym",
-static:{"^":"LB,en,pjg,nq,xa"}},
-WO:{
+static:{"^":"LB,ziq,pjg,nq,xa"}},
+tzK:{
 "^":"a;"},
-jA:{
+bW:{
 "^":"a;oc>"},
 PO:{
 "^":"a;"},
@@ -11207,14 +11364,14 @@
 "^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 F1:{
-"^":["V15;Mz%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gqW:[function(a){return a.Mz},null,null,1,0,126,"pad",82,104],
-sqW:[function(a,b){a.Mz=this.ct(a,C.ZU,a.Mz,b)},null,null,3,0,127,27,[],"pad",82],
+"^":["V19;Mz%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gqW:[function(a){return a.Mz},null,null,1,0,307,"pad",308,311],
+sqW:[function(a,b){a.Mz=this.ct(a,C.ZU,a.Mz,b)},null,null,3,0,310,30,[],"pad",308],
 "@":function(){return[C.nW]},
 static:{aD:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Mz=!0
@@ -11223,24 +11380,24 @@
 a.X0=w
 C.kD.ZL(a)
 C.kD.oX(a)
-return a},null,null,0,0,22,"new NavBarElement$created"]}},
-"+NavBarElement":[226],
-V15:{
+return a},null,null,0,0,115,"new NavBarElement$created"]}},
+"+NavBarElement":[467],
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
 aQ:{
-"^":["V16;KU%-125,V4%-125,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,87,"link",82,104],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,8,27,[],"link",82],
-gdU:[function(a){return a.V4},null,null,1,0,87,"anchor",82,104],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,8,27,[],"anchor",82],
-grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
+"^":["V20;KU%-305,V4%-305,Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,312,"link",308,311],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",308],
+gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",308,311],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",308],
+grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
 "@":function(){return[C.u7]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.KU="#"
@@ -11251,22 +11408,22 @@
 a.X0=w
 C.SU.ZL(a)
 C.SU.oX(a)
-return a},null,null,0,0,22,"new NavMenuElement$created"]}},
-"+NavMenuElement":[227],
-V16:{
+return a},null,null,0,0,115,"new NavMenuElement$created"]}},
+"+NavMenuElement":[468],
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
 Qa:{
-"^":["V17;KU%-125,V4%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,87,"link",82,104],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,8,27,[],"link",82],
-gdU:[function(a){return a.V4},null,null,1,0,87,"anchor",82,104],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,8,27,[],"anchor",82],
+"^":["V21;KU%-305,V4%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,312,"link",308,311],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",308],
+gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",308,311],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",308],
 "@":function(){return[C.qT]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.KU="#"
@@ -11276,31 +11433,31 @@
 a.X0=w
 C.nn.ZL(a)
 C.nn.oX(a)
-return a},null,null,0,0,22,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[228],
-V17:{
+return a},null,null,0,0,115,"new NavMenuItemElement$created"]}},
+"+NavMenuItemElement":[469],
+V21:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":["V18;rU%-29,SB%-109,Hq%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFR:[function(a){return a.rU},null,null,1,0,22,"callback",82,104],
+"^":["V22;rU%-85,SB%-304,Hq%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFR:[function(a){return a.rU},null,null,1,0,115,"callback",308,311],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,16,27,[],"callback",82],
-gxw:[function(a){return a.SB},null,null,1,0,126,"active",82,104],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,127,27,[],"active",82],
-gph:[function(a){return a.Hq},null,null,1,0,87,"label",82,104],
-sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,8,27,[],"label",82],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,116,30,[],"callback",308],
+gxw:[function(a){return a.SB},null,null,1,0,307,"active",308,311],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,310,30,[],"active",308],
+gph:[function(a){return a.Hq},null,null,1,0,312,"label",308,311],
+sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,32,30,[],"label",308],
 Ty:[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.gCB(a))},"$3","gyr",6,0,120,7,[],121,[],119,[],"buttonClick"],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,21,"refreshDone"],
+if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,350,21,[],351,[],82,[],"buttonClick"],
+ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,126,"refreshDone"],
 "@":function(){return[C.XG]},
 static:{zN:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SB=!1
@@ -11310,20 +11467,20 @@
 a.X0=w
 C.J7.ZL(a)
 C.J7.oX(a)
-return a},null,null,0,0,22,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[229],
-V18:{
+return a},null,null,0,0,115,"new NavRefreshElement$created"]}},
+"+NavRefreshElement":[470],
+V22:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["V19;Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
-"@":function(){return[C.hr]},
+"^":["V23;Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
+"@":function(){return[C.NT]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11332,27 +11489,27 @@
 a.X0=w
 C.lx.ZL(a)
 C.lx.oX(a)
-return a},null,null,0,0,22,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[230],
-V19:{
+return a},null,null,0,0,115,"new TopNavMenuElement$created"]}},
+"+TopNavMenuElement":[471],
+V23:{
 "^":"uL+Pi;",
 $isd3:true},
-Mv:{
-"^":["V20;Jo%-109,iy%-213,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
-gF1:[function(a){return a.iy},null,null,1,0,81,"isolate",82,104],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,84,27,[],"isolate",82],
-vD:[function(a,b){this.ct(a,C.Ia,0,1)},"$1","gQ1",2,0,26,65,[],"isolateChanged"],
+flR:{
+"^":["V24;Jo%-304,iy%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
+gF1:[function(a){return a.iy},null,null,1,0,318,"isolate",308,311],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,319,30,[],"isolate",308],
+vD:[function(a,b){this.ct(a,C.Ia,0,1)},"$1","gQ1",2,0,169,242,[],"isolateChanged"],
 gu6:[function(a){var z=a.iy
 if(z!=null)return z.gHP()
-else return""},null,null,1,0,87,"hashLinkWorkaround",82],
-su6:[function(a,b){},null,null,3,0,16,231,[],"hashLinkWorkaround",82],
-"@":function(){return[C.oD]},
+else return""},null,null,1,0,312,"hashLinkWorkaround",308],
+su6:[function(a,b){},null,null,3,0,116,28,[],"hashLinkWorkaround",308],
+"@":function(){return[C.zaS]},
 static:{Du:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11361,22 +11518,22 @@
 a.X0=w
 C.RR.ZL(a)
 C.RR.oX(a)
-return a},null,null,0,0,22,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[232],
-V20:{
+return a},null,null,0,0,115,"new IsolateNavMenuElement$created"]}},
+"+IsolateNavMenuElement":[472],
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
-Zt:{
-"^":["V21;Ap%-220,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.Ap},null,null,1,0,221,"library",82,104],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,222,27,[],"library",82],
-grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
+oM:{
+"^":["V25;Ap%-461,Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.Ap},null,null,1,0,462,"library",308,311],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,463,30,[],"library",308],
+grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
 "@":function(){return[C.KI]},
 static:{PQ:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11385,22 +11542,22 @@
 a.X0=w
 C.ct.ZL(a)
 C.ct.oX(a)
-return a},null,null,0,0,22,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[233],
-V21:{
+return a},null,null,0,0,115,"new LibraryNavMenuElement$created"]}},
+"+LibraryNavMenuElement":[473],
+V25:{
 "^":"uL+Pi;",
 $isd3:true},
 iL:{
-"^":["V22;Au%-101,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Au},null,null,1,0,103,"cls",82,104],
-sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,105,27,[],"cls",82],
-grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
-"@":function(){return[C.iF]},
+"^":["V26;Au%-336,Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Au},null,null,1,0,337,"cls",308,311],
+sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,338,30,[],"cls",308],
+grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
+"@":function(){return[C.qJ]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11409,35 +11566,35 @@
 a.X0=w
 C.ae.ZL(a)
 C.ae.oX(a)
-return a},null,null,0,0,22,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[234],
-V22:{
+return a},null,null,0,0,115,"new ClassNavMenuElement$created"]}},
+"+ClassNavMenuElement":[474],
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 F1i:{
-"^":["V23;k5%-109,Oe%-235,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzj:[function(a){return a.k5},null,null,1,0,126,"devtools",82,104],
-szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,127,27,[],"devtools",82],
-guw:[function(a){return a.Oe},null,null,1,0,236,"app",82,83],
-suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,237,27,[],"app",82],
+"^":["V27;k5%-304,Oe%-475,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,307,"devtools",308,311],
+szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,310,30,[],"devtools",308],
+guw:[function(a){return a.Oe},null,null,1,0,476,"app",308,309],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,477,30,[],"app",308],
 ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,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)
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.PI()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.hq()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,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)
+a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.SC()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.US()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,22,"created"],
+a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,115,"created"],
 "@":function(){return[C.kR]},
 static:{fv:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.k5=!1
@@ -11447,43 +11604,43 @@
 C.k0.ZL(a)
 C.k0.oX(a)
 C.k0.ZB(a)
-return a},null,null,0,0,22,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[238],
-V23:{
+return a},null,null,0,0,115,"new ObservatoryApplicationElement$created"]}},
+"+ObservatoryApplicationElement":[478],
+V27:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,21,"enteredView"],
-xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,21,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,239,64,[],65,[],66,[],"attributeChanged"],
-b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,240,241,[],"formatTimePrecise"],
-nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,240,241,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,240,231,[],"formatSeconds"],
-Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,18,19,[],"formatSize"],
+"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,126,"enteredView"],
+xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,126,"leftView"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,479,12,[],242,[],243,[],"attributeChanged"],
+b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,480,123,[],"formatTimePrecise"],
+nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,480,123,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,480,28,[],"formatSeconds"],
+Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,121,124,[],"formatSize"],
 at:[function(a,b){var z,y,x
 z=J.U6(b)
 y=J.UQ(z.t(b,"script"),"user_name")
 x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","guT",2,0,242,243,[],"fileAndLine"],
-b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,244,245,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,244,245,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","guT",2,0,481,482,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,483,11,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,483,11,[],"isError"],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,244,245,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,244,245,[],"isBool"],
-ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,244,245,[],"isString"],
-rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,244,245,[],"isInstance"],
-JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,244,245,[],"isDouble"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,483,11,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,483,11,[],"isBool"],
+ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,483,11,[],"isString"],
+rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,483,11,[],"isInstance"],
+JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,483,11,[],"isDouble"],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,244,245,[],"isList"],
-tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,244,245,[],"isType"],
-AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,244,245,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,483,11,[],"isList"],
+tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,483,11,[],"isType"],
+AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,483,11,[],"isUnexpected"],
 "@":function(){return[C.Br]},
 static:{Hx:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -11491,8 +11648,8 @@
 a.X0=w
 C.Pf.ZL(a)
 C.Pf.oX(a)
-return a},null,null,0,0,22,"new ObservatoryElement$created"]}},
-"+ObservatoryElement":[246]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+return a},null,null,0,0,115,"new ObservatoryElement$created"]}},
+"+ObservatoryElement":[484]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -11501,8 +11658,8 @@
 z=P.bK(this.gl1(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"$0","gqw",0,0,21],
-ni:[function(a){a.AP=null},"$0","gl1",0,0,21],
+k0:[function(a){},"$0","gqw",0,0,126],
+ni:[function(a){a.AP=null},"$0","gl1",0,0,126],
 BN:[function(a){var z,y,x
 z=a.fn
 a.fn=null
@@ -11510,7 +11667,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,126],
+return!0}return!1},"$0","gDx",0,0,307],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -11534,27 +11691,27 @@
 "^":"Pi;b9,kK,Sv,rk,YX,B6,AP,fn",
 kb:function(a){return this.rk.$1(a)},
 gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,22,"value",82],
+gP:[function(a){return this.Sv},null,null,1,0,115,"value",308],
 wE:function(a){var z,y,x,w,v
 if(this.YX)return
 this.YX=!0
 z=this.geu()
 for(y=this.b9,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=this.kK;y.G();){w=J.xq(y.lo).w4(!1)
 v=w.Lj
-w.dB=v.cR(z)
+w.pN=v.cR(z)
 w.o7=P.VH(P.AY(),v)
 w.Bd=v.Al(P.v3())
 x.push(w)}this.Ow()},
 TF:[function(a){if(this.B6)return
 this.B6=!0
-P.rb(this.gMc())},"$1","geu",2,0,26,17,[]],
+P.rb(this.gMc())},"$1","geu",2,0,169,117,[]],
 Ow:[function(){var z,y
 this.B6=!1
 z=this.b9
 if(z.length===0)return
 y=H.VM(new H.A8(z,new Y.E5()),[null,null]).br(0)
 if(this.rk!=null)y=this.kb(y)
-this.Sv=F.Wi(this,C.ls,this.Sv,y)},"$0","gMc",0,0,21],
+this.Sv=F.Wi(this,C.ls,this.Sv,y)},"$0","gMc",0,0,126],
 cO:function(a){var z,y
 z=this.b9
 if(z.length===0)return
@@ -11562,15 +11719,15 @@
 C.Nm.sB(z,0)
 C.Nm.sB(this.kK,0)
 this.Sv=null},
-k0:[function(a){return this.wE(0)},"$0","gqw",0,0,22],
-ni:[function(a){return this.cO(0)},"$0","gl1",0,0,22],
+k0:[function(a){return this.wE(0)},"$0","gqw",0,0,115],
+ni:[function(a){return this.cO(0)},"$0","gl1",0,0,115],
 $isJ3:true},
 E5:{
-"^":"Tp:16;",
-$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,69,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,99,[],"call"],
 $isEH:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
-Y3:function(){var z,y,x,w,v,u,t,s,r,q
+Y3:[function(){var z,y,x,w,v,u,t,s,r,q
 if($.Td)return
 if($.tW==null)return
 $.Td=!0
@@ -11591,45 +11748,45 @@
 for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
 q=J.U6(r)
 w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.el=$.tW.length
-$.Td=!1},
-Ht:function(){var z={}
+$.Td=!1},"$0","D6",0,0,null],
+Ht:[function(){var z={}
 z.a=!1
 z=new O.o5(z)
-return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},
+return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"$0","Zq",0,0,null],
 o5:{
-"^":"Tp:247;a",
-$2:function(a,b){var z=this.a
+"^":"Tp:485;a",
+$2:[function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.b5(z))},
+a.RK(b,new O.b5(z))},"$2",null,4,0,null,181,[],166,[],"call"],
 $isEH:true},
 b5:{
-"^":"Tp:22;a",
+"^":"Tp:115;a",
 $0:[function(){this.a.a=!1
 O.Y3()},"$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"Tp:36;b",
+"^":"Tp:182;b",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,33,[],34,[],35,[],37,[],"call"],
+return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
 $isEH:true},
 Zb:{
-"^":"Tp:22;c,d,e,f",
+"^":"Tp:115;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},
 id:{
-"^":"Tp:248;UI",
+"^":"Tp:486;UI",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,33,[],34,[],35,[],37,[],"call"],
+return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
 $isEH:true},
 iV:{
-"^":"Tp:16;bK,Gq,Rm,w3",
+"^":"Tp:116;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,231,[],"call"],
+return this.w3.$1(a)},"$1",null,2,0,null,28,[],"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
-f6:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 z=J.WB(J.xH(f,e),1)
 y=J.WB(J.xH(c,b),1)
 if(typeof z!=="number")return H.s(z)
@@ -11653,8 +11810,8 @@
 l=J.WB(J.UQ(m,t),1)
 if(v>=w)return H.e(x,v)
 k=J.WB(J.UQ(x[v],n),1)
-J.kW(x[v],t,P.J(l,k))}}return x},
-Mw:function(a){var z,y,x,w,v,u,t,s,r,q,p
+J.kW(x[v],t,P.J(l,k))}}return x},"$6","cL",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
+Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p
 z=a.length
 y=z-1
 if(0>=z)return H.e(a,0)
@@ -11681,11 +11838,11 @@
 w=r
 y=t}else{v.push(2)
 x=u.W(x,1)
-w=q}}}return H.VM(new H.iK(v),[null]).br(0)},
-rB:function(a,b,c){var z,y,x
+w=q}}}return H.VM(new H.iK(v),[null]).br(0)},"$1","fZ",2,0,null,260,[]],
+rB:[function(a,b,c){var z,y,x
 for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},
-xU:function(a,b,c){var z,y,x,w,v,u
+return c},"$3","QI",6,0,null,261,[],262,[],263,[]],
+xU:[function(a,b,c){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.gB(a)
 x=J.U6(b)
@@ -11695,8 +11852,8 @@
 u=z.t(a,y)
 w=J.xH(w,1)
 u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},
-jj:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+if(!u)break;++v}return v},"$3","M9",6,0,null,261,[],262,[],263,[]],
+jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.Wx(c)
 y=J.Wx(f)
 x=P.J(z.W(c,b),y.W(f,e))
@@ -11744,8 +11901,8 @@
 y.$builtinTypeInfo=[null]
 s=new G.DA(a,y,t,n,0)}J.wT(s.Il,z.t(d,o));++o
 break}if(s!=null)p.push(s)
-return p},
-m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return p},"$6","mu",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
+m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.RE(b)
 y=z.gWA(b)
 z=z.gvH(b)
@@ -11785,12 +11942,12 @@
 q.sjr(J.WB(q.gjr(),m))
 if(typeof m!=="number")return H.s(m)
 s+=m
-t=!0}else t=!1}if(!t)a.push(u)},
-xl:function(a,b){var z,y
+t=!0}else t=!1}if(!t)a.push(u)},"$2","pE",4,0,null,264,[],29,[]],
+xl:[function(a,b){var z,y
 z=H.VM([],[G.DA])
 for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},
-u2:function(a,b){var z,y,x,w,v,u
+return z},"$2","l0",4,0,null,76,[],265,[]],
+u2:[function(a,b){var z,y,x,w,v,u
 if(b.length===1)return b
 z=[]
 for(y=G.xl(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=a.ao;y.G();){w=y.lo
@@ -11799,7 +11956,7 @@
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
 if(!J.de(v,x[u]))z.push(w)
 continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"$2","W5",4,0,null,76,[],265,[]],
 DA:{
 "^":"a;WA>,ok<,Il<,jr@,dM",
 gvH:function(a){return this.jr},
@@ -11830,15 +11987,15 @@
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
-Wi:function(a,b,c,d){var z=J.RE(a)
+Wi:[function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},
+return d},"$4","Ha",8,0,null,101,[],266,[],242,[],243,[]],
 d3:{
 "^":"a;",
 $isd3:true},
-X6:{
-"^":"Tp:75;a,b",
-$2:function(a,b){var z,y,x,w,v
+lS:{
+"^":"Tp:300;a,b",
+$2:[function(a,b){var z,y,x,w,v
 z=this.b
 y=z.wv.rN(a).gAx()
 if(!J.de(b,y)){x=this.a
@@ -11847,14 +12004,14 @@
 x.a=v
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
-z.V2.u(0,a,y)}},
+z.V2.u(0,a,y)}},"$2",null,4,0,null,12,[],242,[],"call"],
 $isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
 "^":"",
 xh:{
 "^":"Pi;L1,AP,fn",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",82],
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},66,[],"value",82],
-bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",308],
+sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},243,[],"value",308],
+bu:function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
 "^":"er;b3,xg,ao,AP,fn",
@@ -11862,7 +12019,7 @@
 if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
 this.xg=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.ao.length},null,null,1,0,249,"length",82],
+gB:[function(a){return this.ao.length},null,null,1,0,487,"length",308],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.ao
 y=z.length
@@ -11890,10 +12047,10 @@
 u=[]
 w=new P.Yp(u)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,137,27,[],"length",82],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,363,30,[],"length",308],
 t:[function(a,b){var z=this.ao
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[P.KN]}},this.$receiver,"wn")},73,[],"[]",82],
+return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[J.bU]}},this.$receiver,"wn")},15,[],"[]",308],
 u:[function(a,b,c){var z,y,x,w
 z=this.ao
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -11905,12 +12062,12 @@
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[P.KN,a]}},this.$receiver,"wn")},73,[],27,[],"[]=",82],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,126,"isEmpty",82],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,126,"isNotEmpty",82],
+z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[J.bU,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",308],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,307,"isEmpty",308],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,307,"isNotEmpty",308],
 Mh:function(a,b,c){var z,y,x
 z=J.x(c)
-if(!z.$iszM&&!z.$isz5)c=z.br(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
 y=J.q8(c)
 z=this.xg
 if(z!=null){x=z.iE
@@ -11971,7 +12128,7 @@
 oF:function(a,b,c){var z,y,x,w
 if(b<0||b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
-if(!z.$iszM&&!z.$isz5)c=z.br(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
 y=J.q8(c)
 z=this.ao
 x=z.length
@@ -12025,7 +12182,7 @@
 if(x){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,126],
+return!0}return!1},"$0","gL6",0,0,307],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -12033,8 +12190,8 @@
 "^":"ar+Pi;",
 $isd3:true},
 Bj:{
-"^":"Tp:22;a",
-$0:function(){this.a.xg=null},
+"^":"Tp:115;a",
+$0:[function(){this.a.xg=null},"$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
 HA:{
@@ -12046,18 +12203,18 @@
 $isHA:true},
 qC:{
 "^":"Pi;Zp,AP,fn",
-gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",82],
+gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",308],
 gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",82],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",308],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,249,"length",82],
+return z.gB(z)},null,null,1,0,487,"length",308],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,126,"isEmpty",82],
+return z.gB(z)===0},null,null,1,0,307,"isEmpty",308],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,126,"isNotEmpty",82],
-di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,250,27,[],"containsValue",82],
-x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,250,76,[],"containsKey",82],
-t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},76,[],"[]",82],
+return z.gB(z)!==0},null,null,1,0,307,"isNotEmpty",308],
+di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,488,30,[],"containsValue",308],
+x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,488,49,[],"containsKey",308],
+t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},49,[],"[]",308],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -12066,8 +12223,9 @@
 w=this.AP
 if(w!=null){v=w.iE
 w=v==null?w!=null:v!==w}else w=!1
-if(w)if(y!==z.gB(z)){F.Wi(this,C.Wn,y,z.gB(z))
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))},"$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"un",void:true,args:[a,b]}},this.$receiver,"qC")},76,[],27,[],"[]=",82],
+if(w){z=z.gB(z)
+if(y!==z){F.Wi(this,C.Wn,y,z)
+this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"un",void:true,args:[a,b]}},this.$receiver,"qC")},49,[],30,[],"[]=",308],
 FV:function(a,b){J.kH(b,new V.zT(this))},
 Rz:function(a,b){var z,y,x,w,v
 z=this.Zp
@@ -12099,68 +12257,68 @@
 return y}}},
 zT:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:75;a",
-$2:function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},
+"^":"Tp:300;a",
+$2:[function(a,b){var z=this.a
+z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
 "^":"",
-Wa:function(a,b){var z=J.x(a)
+Wa:[function(a,b){var z=J.x(a)
 if(!!z.$isqI)return J.de(a.oc,b)
 if(!!z.$isHA){z=J.x(b)
 if(!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},
-yf:function(a,b){var z,y,x,w
+return J.de(a.G3,b)}return!1},"$2","Uv",4,0,null,29,[],49,[]],
+yf:[function(a,b){var z,y,x,w
 if(a==null)return
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$iszM&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
-y=J.zH(z)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
+y=H.jO(J.bB(z.gAx()).LU)
 try{if(L.TH(y,b)){x=z.rN(b).gAx()
 return x}if(L.M6(y,C.fz)){x=J.UQ(a,J.GL(b))
 return x}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.Ek))x.x9("can't get "+H.d(b)+" in "+H.d(a))
-return},
-ir:function(a,b,c){var z,y,x,w
+return},"$2","MT",4,0,null,6,[],74,[]],
+ir:[function(a,b,c){var z,y,x,w
 if(a==null)return!1
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$iszM&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
 return!0}}else if(!!J.x(b).$iswv){z=H.vn(a)
-y=J.zH(z)
+y=H.jO(J.bB(z.gAx()).LU)
 try{if(L.dR(y,b)){x=c
 z.tu(b,2,[x],C.CM)
 H.vn(x)
 return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
 return!0}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.Ek))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},
-TH:function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().Fb
+return!1},"$3","J6",6,0,null,6,[],74,[],30,[]],
+TH:[function(a,b){var z
+for(;!J.de(a,$.aA());){z=a.gYK().nb
 if(z.x4(b))return!0
 if(z.x4(C.OV))return!0
-a=L.pY(a)}return!1},
-dR:function(a,b){var z,y
+a=L.pY(a)}return!1},"$2","fY",4,0,null,11,[],12,[]],
+dR:[function(a,b){var z,y
 z=new H.GD(H.u1(H.d(b.gfN(b))+"="))
-for(;!J.de(a,$.aA());){y=a.gYK().Fb
+for(;!J.de(a,$.aA());){y=a.gYK().nb
 if(!!J.x(y.t(0,b)).$isRY)return!0
 if(y.x4(z))return!0
 if(y.x4(C.OV))return!0
-a=L.pY(a)}return!1},
-M6:function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().Fb.t(0,b)
+a=L.pY(a)}return!1},"$2","we",4,0,null,11,[],12,[]],
+M6:[function(a,b){var z
+for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
 if(!!J.x(z).$isRS&&z.guU())return!0
-a=L.pY(a)}return!1},
-pY:function(a){var z,y
+a=L.pY(a)}return!1},"$2","Wt",4,0,null,11,[],12,[]],
+pY:[function(a){var z,y
 try{z=a.gAY()
 return z}catch(y){H.Ru(y)
-return $.aA()}},
-cB:function(a){a=J.JA(a,$.c3(),"")
+return $.aA()}},"$1","WV",2,0,null,11,[]],
+cB:[function(a){a=J.JA(a,$.c3(),"")
 if(a==="")return!0
 if(0>=a.length)return H.e(a,0)
 if(a[0]===".")return!1
-return $.tN().zD(a)},
+return $.tN().zD(a)},"$1","wf",2,0,null,94,[]],
 WR:{
 "^":"Pi;ay,YB,BK,kN,cs,cT,AP,fn",
 E4:function(a){return this.cT.$1(a)},
@@ -12173,7 +12331,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,22,"value",82],
+return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",308],
 sP:[function(a,b){var z,y,x,w
 z=this.BK
 y=z.length
@@ -12189,16 +12347,16 @@
 if(w>=z.length)return H.e(z,w)
 if(L.ir(x,z[w],b)){z=this.kN
 if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,251,66,[],"value",82],
+z[y]=b}},null,null,3,0,489,243,[],"value",308],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
-this.XI()},"$0","gqw",0,0,21],
+this.XI()},"$0","gqw",0,0,126],
 ni:[function(a){var z,y
 for(z=0;y=this.cs,z<y.length;++z){y=y[z]
 if(y!=null){y.ed()
 y=this.cs
 if(z>=y.length)return H.e(y,z)
-y[z]=null}}O.Pi.prototype.ni.call(this,this)},"$0","gl1",0,0,21],
+y[z]=null}}O.Pi.prototype.ni.call(this,this)},"$0","gl1",0,0,126],
 Zy:function(a){var z,y,x,w,v,u
 if(a==null)a=this.BK.length
 z=this.BK
@@ -12255,7 +12413,7 @@
 if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(y).$iswn){z=this.cs
 w=y.gvp().w4(!1)
 v=w.Lj
-w.dB=v.cR(new L.Px(this,a,x))
+w.pN=v.cR(new L.Px(this,a,x))
 w.o7=P.VH(P.AY(),v)
 w.Bd=v.Al(P.v3())
 if(a>=z.length)return H.e(z,a)
@@ -12263,7 +12421,7 @@
 if(!!z.$isd3){v=this.cs
 w=z.gUj(y).w4(!1)
 z=w.Lj
-w.dB=z.cR(new L.C4(this,a,x))
+w.pN=z.cR(new L.C4(this,a,x))
 w.o7=P.VH(P.AY(),z)
 w.Bd=z.Al(P.v3())
 if(a>=v.length)return H.e(v,a)
@@ -12284,24 +12442,24 @@
 z.d4(a,b,c)
 return z}}},
 qL:{
-"^":"Tp:16;",
-$1:function(a){return},
+"^":"Tp:116;",
+$1:[function(a){return},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 Px:{
-"^":"Tp:253;a,b,c",
+"^":"Tp:490;a,b,c",
 $1:[function(a){var z,y
 for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"$1",null,2,0,null,252,[],"call"],
+return}},"$1",null,2,0,null,265,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:254;d,e,f",
+"^":"Tp:491;d,e,f",
 $1:[function(a){var z,y
 for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"$1",null,2,0,null,252,[],"call"],
+return}},"$1",null,2,0,null,265,[],"call"],
 $isEH:true},
 Md:{
-"^":"Tp:22;",
-$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)},
+"^":"Tp:115;",
+$0:[function(){return new H.VR(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)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
 Jk:[function(a){var z,y,x
@@ -12312,46 +12470,46 @@
 return y}if(!!z.$isQV){z=z.ez(a,R.np())
 x=Q.uX(null,null)
 x.FV(0,z)
-return x}return a},"$1","np",2,0,16,27,[]],
+return x}return a},"$1","np",2,0,116,30,[]],
 km:{
-"^":"Tp:75;a",
-$2:function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},
+"^":"Tp:300;a",
+$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"$2",null,4,0,null,376,[],122,[],"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
-JX:function(){var z,y
+JX:[function(){var z,y
 z=document.createElement("style",null)
 J.c9(z,".polymer-veiled { opacity: 0; } \n.polymer-unveil{ -webkit-transition: opacity 0.3s; transition: opacity 0.3s; }\n")
 y=document.querySelector("head")
 y.insertBefore(z,y.firstChild)
 A.B2()
-$.mC().MM.ml(new A.Zj())},
-B2:function(){var z,y,x
+$.mC().MM.ml(new A.Zj())},"$0","Ti",0,0,null],
+B2:[function(){var z,y,x
 for(z=$.IN(),z=H.VM(new H.a7(z,1,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-for(x=W.vD(document.querySelectorAll(y),null),x=x.gA(x);x.G();)J.wT(J.pP(x.lo),"polymer-veiled")}},
-yV:function(a){var z,y
+for(x=W.vD(document.querySelectorAll(y),null),x=x.gA(x);x.G();)J.wT(J.pP(x.lo),"polymer-veiled")}},"$0","Gi",0,0,null],
+yV:[function(a){var z,y
 z=$.xY().Rz(0,a)
-if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},
-oF:function(a,b){var z,y,x,w
+if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},"$1","Km",2,0,null,12,[]],
+oF:[function(a,b){var z,y,x,w
 if(J.de(a,$.H8()))return b
 b=A.oF(a.gAY(),b)
-for(z=a.gYK().Fb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
+for(z=a.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 if(y.gFo()||y.gq4())continue
 x=J.x(y)
 if(!(!!x.$isRY&&!x.gV5(y)))w=!!x.$isRS&&y.glT()
 else w=!0
 if(w)for(w=J.GP(y.gc9());w.G();)if(!!J.x(w.lo.gAx()).$isyL){if(!x.$isRS||A.bc(a,y)){if(b==null)b=P.Fl(null,null)
-b.u(0,y.gIf(),y)}break}}return b},
-yX:function(a,b){var z,y
-do{z=a.gYK().Fb.t(0,b)
+b.u(0,y.gIf(),y)}break}}return b},"$2","Cd",4,0,null,267,[],268,[]],
+Oy:[function(a,b){var z,y
+do{z=a.gYK().nb.t(0,b)
 y=J.x(z)
 if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
 a=a.gAY()}while(!J.de(a,$.H8()))
-return},
-bc:function(a,b){var z,y
+return},"$2","il",4,0,null,267,[],74,[]],
+bc:[function(a,b){var z,y
 z=H.u1(H.d(b.gIf().fN)+"=")
-y=a.gYK().Fb.t(0,new H.GD(z))
-return!!J.x(y).$isRS&&y.ghB()},
-YG:function(a,b,c){var z,y,x
+y=a.gYK().nb.t(0,new H.GD(z))
+return!!J.x(y).$isRS&&y.ghB()},"$2","i8",4,0,null,267,[],269,[]],
+YG:[function(a,b,c){var z,y,x
 z=$.cM()
 if(z==null||a==null)return
 if(!z.Bm("ShadowDOMPolyfill"))return
@@ -12359,8 +12517,8 @@
 if(y==null)return
 x=J.UQ(y,"ShadowCSS")
 if(x==null)return
-x.V7("shimStyling",[a,b,c])},
-Hl:function(a){var z,y,x,w,v,u
+x.V7("shimStyling",[a,b,c])},"$3","OA",6,0,null,270,[],12,[],271,[]],
+Hl:[function(a){var z,y,x,w,v,u
 if(a==null)return""
 w=J.RE(a)
 z=w.gmH(a)
@@ -12378,67 +12536,66 @@
 if(!!J.x(w).$isNh){y=w
 x=new H.XO(u,null)
 $.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},
-Ad:function(a,b){var z
+return""}else throw u}},"$1","BV",2,0,null,272,[]],
+Ad:[function(a,b){var z
 if(b==null)b=C.Tu
 $.Ej().u(0,a,b)
 z=$.p2().Rz(0,a)
-if(z!=null)J.Or(z)},
-xv:function(a){A.om(a,new A.Mq())},
-om:function(a,b){var z
+if(z!=null)J.Or(z)},"$2","ZK",2,2,null,85,12,[],11,[]],
+xv:[function(a){A.pb(a,new A.Mq())},"$1","N1",2,0,null,273,[]],
+pb:[function(a,b){var z
 if(a==null)return
 b.$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.om(z,b)},
-lJ:function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
-return new A.L6(a,b)},
-z9:function(a){var z
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"$2","e0",4,0,null,273,[],164,[]],
+lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
+return new A.L6(a,b)},"$4","y4",8,0,null,274,[],12,[],273,[],275,[]],
+z9:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},
-HR:function(a,b,c){var z,y,x
+return $.od().t(0,a)},"$1","b4",2,0,null,273,[]],
+HR:[function(a,b,c){var z,y,x
 z=H.vn(a)
-y=A.Rk(z.gt5(z),b)
+y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
 if(y!=null){x=y.gMP()
 x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},
-Rk:function(a,b){var z
-do{z=a.gYK().Fb.t(0,b)
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"$3","xi",6,0,null,48,[],276,[],19,[]],
+Rk:[function(a,b){var z
+do{z=a.gYK().nb.t(0,b)
 if(!!J.x(z).$isRS)return z
-a=a.gAY()}while(a!=null)},
-ZI:function(a,b){var z,y
+a=a.gAY()}while(a!=null)},"$2","ov",4,0,null,11,[],12,[]],
+ZI:[function(a,b){var z,y
 if(a==null)return
 z=document.createElement("style",null)
 J.c9(z,J.nJ(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},
-pX:function(){var z=window
+b.appendChild(z)},"$2","tO",4,0,null,277,[],278,[]],
+pX:[function(){var z=window
 C.ol.hr(z)
-C.ol.oB(z,W.aF(new A.hm()))},
-al:function(a,b){var z,y,x
+C.ol.oB(z,W.aF(new A.hm()))},"$0","ji",0,0,null],
+al:[function(a,b){var z,y,x
 z=J.x(b)
 y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
 z=J.RE(y)
 if(J.de(z.gUx(y),C.PU)||J.de(z.gUx(y),C.nN))if(a!=null){x=A.h5(a)
 if(x!=null)return P.re(x)
-z=H.vn(a)
-return z.gt5(z)}return y},
-h5:function(a){if(a==null)return C.Qf
+return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"$2","bP",4,0,null,30,[],74,[]],
+h5:[function(a){if(a==null)return C.Qf
 if(typeof a==="number"&&Math.floor(a)===a)return C.yw
 if(typeof a==="number")return C.O4
 if(typeof a==="boolean")return C.HL
 if(typeof a==="string")return C.Db
 if(!!J.x(a).$isiP)return C.Yc
-return},
-Ok:function(){if($.uP){var z=$.X3.iT(O.Ht())
+return},"$1","v9",2,0,null,30,[]],
+Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
 z.Gr(A.PB())
 return z}A.ei()
-return $.X3},
+return $.X3},"$0","ym",0,0,null],
 ei:[function(){var z=document
 W.wi(window,z,"polymer-element",C.Bm,null)
 A.Jv()
 A.JX()
-$.ax().ml(new A.rD())},"$0","PB",0,0,21],
-Jv:function(){var z,y,x,w,v,u,t
+$.ax().ml(new A.rD())},"$0","PB",0,0,126],
+Jv:[function(){var z,y,x,w,v,u,t
 for(w=$.UP(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
 try{A.pw(z)}catch(v){u=H.Ru(v)
 y=u
@@ -12449,11 +12606,11 @@
 t=y
 if(t==null)H.vh(P.u("Error must not be null"))
 if(u.Gv!==0)H.vh(P.w("Future already completed"))
-u.CG(t,x)}}},
-GA:function(a,b,c,d){var z,y,x,w,v,u
+u.CG(t,x)}}},"$0","vH",0,0,null],
+GA:[function(a,b,c,d){var z,y,x,w,v,u
 if(c==null)c=P.Ls(null,null,null,W.YN)
 if(d==null){d=[]
-d.$builtinTypeInfo=[P.qU]}if(a==null){z="warning: "+H.d(b)+" not found."
+d.$builtinTypeInfo=[J.O]}if(a==null){z="warning: "+H.d(b)+" not found."
 y=$.oK
 if(y==null)H.qw(z)
 else y.$1(z)
@@ -12467,8 +12624,8 @@
 x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
 v=$.oK
 if(v==null)H.qw(z)
-else v.$1(z)}}return d},
-pw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
+else v.$1(z)}}return d},"$4","fE",4,4,null,85,85,279,[],280,[],281,[],282,[]],
+pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=$.RQ()
 z.toString
 y=P.hK(a)
@@ -12490,19 +12647,17 @@
 s=y.tP}w=z.ku
 v=z.gJf(z)
 u=z.gtp(z)}x=z.Fi}p=P.R6(y.Ka,v,t,null,u,s,null,x,w)
-y=$.UG().Fb
+y=$.UG().nb
 o=y.t(0,p)
 n=p.r0
-r=p.Fi
-q=z.Fi
-if(r==null?q==null:r===q)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
+if(p.Fi===z.Fi)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
 else z=!1
 else z=!1
 else z=!1
 if(z){z=p.r0
 m=y.t(0,P.hK("package:"+C.xB.yn(z,J.U6(z).cn(z,"packages/")+9)))
 if(m!=null)o=m}if(o==null){$.M7().To(p.bu(0)+" library not found")
-return}z=o.gYK().Fb
+return}z=o.gYK().nb
 z=z.gUQ(z)
 y=new A.Fn()
 r=new H.U5(z,y)
@@ -12511,7 +12666,7 @@
 y=new H.SO(z,y)
 y.$builtinTypeInfo=[H.Kp(r,0)]
 for(;y.G();)A.ZB(o,z.gl())
-z=o.gYK().Fb
+z=o.gYK().nb
 z=z.gUQ(z)
 y=new A.e3()
 r=new H.U5(z,y)
@@ -12525,8 +12680,8 @@
 j=l.gYj()
 $.Ej().u(0,q,j)
 i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},
-ZB:function(a,b){var z,y,x
+if(i!=null)J.Or(i)}}}},"$1","qt",2,0,null,283,[]],
+ZB:[function(a,b){var z,y,x
 for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
 break}if(!y)return
 if(!b.gFo()){x="warning: methods marked with @initMethod should be static, "+J.AG(b.gIf())+" is not."
@@ -12539,10 +12694,10 @@
 z=$.oK
 if(z==null)H.qw(x)
 else z.$1(x)
-return}a.CI(b.gIf(),C.xD)},
+return}a.CI(b.gIf(),C.xD)},"$2","Ii",4,0,null,101,[],233,[]],
 Zj:{
-"^":"Tp:16;",
-$1:[function(a){A.pX()},"$1",null,2,0,null,17,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){A.pX()},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 XP:{
 "^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,lk",
@@ -12578,7 +12733,7 @@
 A.ZI(this.J3(a,this.kO(a,"global"),"global"),document.head)
 A.YG(this.gZf(a),y,z)
 w=P.re(a.zx)
-v=w.gYK().Fb.t(0,C.c8)
+v=w.gYK().nb.t(0,C.c8)
 if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
 this.Ba(a,y)
 A.yV(a.RT)},
@@ -12607,7 +12762,7 @@
 y=y!=null&&y.x4(w)}else y=!1
 if(y)continue
 v=new H.GD(H.u1(w))
-u=A.yX(b,v)
+u=A.Oy(b,v)
 if(u==null){window
 y="property for attribute "+w+" of polymer-element name="+H.d(a.RT)+" not found."
 if(typeof console!="undefined")console.warn(y)
@@ -12615,7 +12770,7 @@
 if(y==null){y=P.Fl(null,null)
 a.Q7=y}y.u(0,v,u)}}},
 Vk:function(a){var z,y
-z=P.L5(null,null,null,P.qU,P.a)
+z=P.L5(null,null,null,J.O,P.a)
 a.xX=z
 y=a.aa
 if(y!=null)z.FV(0,J.Ng(y))
@@ -12663,14 +12818,14 @@
 q1:function(a,b){var z,y,x,w
 if(J.de(b,$.H8()))return
 this.q1(a,b.gAY())
-for(z=b.gYK().Fb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
+for(z=b.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 if(!J.x(y).$isRS||y.gFo()||!y.guU())continue
 x=y.gIf().fN
 w=J.rY(x)
 if(w.Tc(x,"Changed")&&!w.n(x,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
 x=w.Nj(x,0,J.xH(w.gB(x),7))
 a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},
-qC:function(a,b){var z=P.L5(null,null,null,P.qU,null)
+qC:function(a,b){var z=P.L5(null,null,null,J.O,null)
 b.aN(0,new A.MX(z))
 return z},
 du:function(a){a.RT=a.getAttribute("name")
@@ -12681,48 +12836,48 @@
 C.zb.du(a)
 return a}}},
 q6:{
-"^":"Tp:22;",
-$0:function(){return[]},
+"^":"Tp:115;",
+$0:[function(){return[]},"$0",null,0,0,null,"call"],
 $isEH:true},
 CK:{
-"^":"Tp:75;a",
-$2:function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},
+"^":"Tp:300;a",
+$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 LJ:{
-"^":"Tp:75;a",
-$2:function(a,b){var z,y,x
+"^":"Tp:300;a",
+$2:[function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
 x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 ZG:{
-"^":"Tp:16;",
-$1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
+"^":"Tp:116;",
+$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 Oc:{
-"^":"Tp:16;a",
-$1:function(a){return J.Kf(a,this.a)},
+"^":"Tp:116;a",
+$1:[function(a){return J.Kf(a,this.a)},"$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 MX:{
-"^":"Tp:75;a",
-$2:function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},
+"^":"Tp:300;a",
+$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 w12:{
-"^":"Tp:22;",
-$0:function(){var z=P.L5(null,null,null,P.qU,P.qU)
+"^":"Tp:115;",
+$0:[function(){var z=P.L5(null,null,null,J.O,J.O)
 C.FS.aN(0,new A.r3y(z))
-return z},
+return z},"$0",null,0,0,null,"call"],
 $isEH:true},
 r3y:{
-"^":"Tp:75;a",
-$2:function(a,b){this.a.u(0,b,a)},
+"^":"Tp:300;a",
+$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,492,[],493,[],"call"],
 $isEH:true},
 yL:{
 "^":"ndx;",
 $isyL:true},
 zs:{
-"^":["a;KM:X0=-102",function(){return[C.Nw]}],
+"^":["a;KM:X0=-306",function(){return[C.Nw]}],
 Pa:function(a){var z
 if(W.Pv(this.gM0(a).defaultView)==null)z=$.Bh>0
 else z=!0
@@ -12787,7 +12942,7 @@
 x=y.rN(z.gIf()).gAx()
 w=Z.Zh(c,x,A.al(x,z))
 if(w==null?x!=null:w!==x){y.tu(z.gIf(),2,[w],C.CM)
-H.vn(w)}},"$2","ghW",4,0,255],
+H.vn(w)}},"$2","ghW",4,0,494,12,[],30,[]],
 B2:function(a,b){var z=J.ak(a.dZ)
 if(z==null)return
 return z.t(0,b)},
@@ -12839,14 +12994,14 @@
 J.AA(M.Ky(a))
 y=this.gIW(a)
 for(;y!=null;){A.xv(y)
-y=y.olderShadowRoot}a.Uk=!0},"$0","gJg",0,0,21],
+y=y.olderShadowRoot}a.Uk=!0},"$0","gJg",0,0,126],
 BT:function(a,b){var z
 if(a.Uk===!0){$.P5().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
 return}$.P5().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
 z=a.oq
 if(z!=null){z.TP(0)
 a.oq=null}if(b===!0)return
-A.om(this.gIW(a),new A.TV())},
+A.pb(this.gIW(a),new A.TV())},
 oW:function(a){return this.BT(a,null)},
 Xl:function(a){var z,y,x,w,v
 z=J.xR(a.dZ)
@@ -12859,7 +13014,7 @@
 x=P.L5(null,null,null,P.wv,A.bS)
 for(w=J.GP(b);w.G();){v=w.gl()
 if(!J.x(v).$isqI)continue
-J.Pz(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,256,257,[]],
+J.iF(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,495,496,[]],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
@@ -12871,12 +13026,12 @@
 if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
 w=c.gvp().w4(!1)
 x=w.Lj
-w.dB=x.cR(new A.xf(a,d,y))
+w.pN=x.cR(new A.xf(a,d,y))
 w.o7=P.VH(P.AY(),x)
 w.Bd=x.Al(P.v3())
 x=H.d(J.GL(b))+"__array"
 v=a.Sa
-if(v==null){v=P.L5(null,null,null,P.qU,P.MO)
+if(v==null){v=P.L5(null,null,null,J.O,P.MO)
 a.Sa=v}v.u(0,x,w)}},
 l5:function(a,b){var z=a.Sa.Rz(0,b)
 if(z==null)return!1
@@ -12913,7 +13068,7 @@
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
 if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,258,91,[]],
+this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,497,325,[]],
 ea:function(a,b,c,d){var z,y
 z=$.SS()
 y=z.Im(C.R5)
@@ -12929,31 +13084,31 @@
 $isD0:true,
 $isKV:true},
 WC:{
-"^":"Tp:75;a",
-$2:function(a,b){var z=J.Vs(this.a)
+"^":"Tp:300;a",
+$2:[function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).$0())
-z.t(0,a)},
+z.t(0,a)},"$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 Xi:{
-"^":"Tp:22;b",
-$0:function(){return this.b},
+"^":"Tp:115;b",
+$0:[function(){return this.b},"$0",null,0,0,null,"call"],
 $isEH:true},
 TV:{
-"^":"Tp:16;",
-$1:function(a){var z=J.x(a)
-if(!!z.$iszs)z.oW(a)},
+"^":"Tp:116;",
+$1:[function(a){var z=J.x(a)
+if(!!z.$iszs)z.oW(a)},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 Mq:{
-"^":"Tp:16;",
-$1:function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},
+"^":"Tp:116;",
+$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"$1",null,2,0,null,273,[],"call"],
 $isEH:true},
 Oa:{
-"^":"Tp:22;a",
-$0:function(){return new A.bS(this.a.jL,null)},
+"^":"Tp:115;a",
+$0:[function(){return new A.bS(this.a.jL,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 n1:{
-"^":"Tp:75;b,c,d,e",
-$2:function(a,b){var z,y,x
+"^":"Tp:300;b,c,d,e",
+$2:[function(a,b){var z,y,x
 z=this.e
 if(z!=null&&z.x4(a))J.Jr(this.b,a)
 z=this.d
@@ -12962,14 +13117,14 @@
 if(y!=null){z=this.b
 x=J.RE(b)
 J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"$2",null,4,0,null,12,[],498,[],"call"],
 $isEH:true},
 xf:{
-"^":"Tp:16;a,b,c",
-$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,257,[],"call"],
+"^":"Tp:116;a,b,c",
+$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,496,[],"call"],
 $isEH:true},
 L6:{
-"^":"Tp:75;a,b",
+"^":"Tp:300;a,b",
 $2:[function(a,b){var z,y,x
 z=$.SS()
 if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
@@ -12978,10 +13133,10 @@
 if(x!=null)y=x
 z=J.f5(b).t(0,y)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"$2",null,4,0,null,259,[],260,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"$2",null,4,0,null,292,[],273,[],"call"],
 $isEH:true},
 Rs:{
-"^":"Tp:16;c,d,e",
+"^":"Tp:116;c,d,e",
 $1:[function(a){var z,y,x,w,v,u
 z=this.e
 y=A.z9(z)
@@ -12993,26 +13148,26 @@
 u=L.Sk(v,C.xB.yn(w,1),null)
 w=u.gP(u)}else v=y
 u=J.x(a)
-x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"$1",null,2,0,null,91,[],"call"],
+x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 uJ:{
-"^":"Tp:16;",
-$1:function(a){return!a.gQ2()},
+"^":"Tp:116;",
+$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,499,[],"call"],
 $isEH:true},
 hm:{
-"^":"Tp:16;",
+"^":"Tp:116;",
 $1:[function(a){var z,y,x,w
 z=W.vD(document.querySelectorAll(".polymer-veiled"),null)
 for(y=z.gA(z);y.G();){x=J.pP(y.lo)
 w=J.w1(x)
 w.h(x,"polymer-unveil")
 w.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
-y.gtH(y).ml(new A.Ji(z))}},"$1",null,2,0,null,17,[],"call"],
+y.gtH(y).ml(new A.Ji(z))}},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 Ji:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z
-for(z=this.a,z=z.gA(z);z.G();)J.V1(J.pP(z.lo),"polymer-unveil")},"$1",null,2,0,null,17,[],"call"],
+for(z=this.a,z=z.gA(z);z.G();)J.V1(J.pP(z.lo),"polymer-unveil")},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 Bf:{
 "^":"TR;I6,iU,Jq,dY,qP,ZY,xS,PB,eS,ay",
@@ -13027,15 +13182,15 @@
 if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
 z=this.dY
 if(z==null?w!=null:z!==w)J.ta(this.xS,w)
-return}}},"$1","giz",2,0,261,252,[]],
+return}}},"$1","giz",2,0,500,265,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
 xc:{
-"^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 oX:function(a){this.Pa(a)},
 static:{G7:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -13045,7 +13200,7 @@
 C.Iv.oX(a)
 return a}}},
 jpR:{
-"^":["qE+zs;KM:X0=-102",function(){return[C.Nw]}],
+"^":["qE+zs;KM:X0=-306",function(){return[C.Nw]}],
 $iszs:true,
 $isTU:true,
 $isd3:true,
@@ -13067,104 +13222,105 @@
 if(z!=null){z.ed()
 this.ih=null}},
 tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"$0","gv6",0,0,21]},
+this.Ws()}},"$0","gv6",0,0,126]},
 V3:{
 "^":"a;ns",
 $isV3:true},
 rD:{
-"^":"Tp:16;",
+"^":"Tp:116;",
 $1:[function(a){var z=$.mC().MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(null)
-return},"$1",null,2,0,null,17,[],"call"],
+return},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 Fn:{
-"^":"Tp:16;",
-$1:function(a){return!!J.x(a).$isRS},
+"^":"Tp:116;",
+$1:[function(a){return!!J.x(a).$isRS},"$1",null,2,0,null,501,[],"call"],
 $isEH:true},
 e3:{
-"^":"Tp:16;",
-$1:function(a){return!!J.x(a).$isMs},
+"^":"Tp:116;",
+$1:[function(a){return!!J.x(a).$isMs},"$1",null,2,0,null,501,[],"call"],
 $isEH:true},
 pM:{
-"^":"Tp:16;",
-$1:function(a){return!a.gQ2()},
+"^":"Tp:116;",
+$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,499,[],"call"],
 $isEH:true},
 Mh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
 "^":"",
-Zh:function(a,b,c){var z,y,x
+Zh:[function(a,b,c){var z,y,x
 z=J.UQ($.CT(),J.Ba(c))
 if(z!=null)return z.$2(a,b)
 try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
-return a}},
+return a}},"$3","jo",6,0,null,30,[],284,[],11,[]],
 W6:{
-"^":"Tp:22;",
-$0:function(){var z=P.L5(null,null,null,null,null)
+"^":"Tp:115;",
+$0:[function(){var z=P.L5(null,null,null,null,null)
 z.u(0,C.AZ,new Z.Lf())
 z.u(0,C.ok,new Z.fT())
 z.u(0,C.N4,new Z.pp())
 z.u(0,C.Kc,new Z.nl())
 z.u(0,C.PC,new Z.ik())
 z.u(0,C.md,new Z.LfS())
-return z},
+return z},"$0",null,0,0,null,"call"],
 $isEH:true},
 Lf:{
-"^":"Tp:75;",
-$2:[function(a,b){return a},"$2",null,4,0,null,231,[],17,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){return a},"$2",null,4,0,null,28,[],117,[],"call"],
 $isEH:true},
 fT:{
-"^":"Tp:75;",
-$2:[function(a,b){return a},"$2",null,4,0,null,231,[],17,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){return a},"$2",null,4,0,null,28,[],117,[],"call"],
 $isEH:true},
 pp:{
-"^":"Tp:75;",
+"^":"Tp:300;",
 $2:[function(a,b){var z,y
 try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},"$2",null,4,0,null,231,[],262,[],"call"],
+return b}},"$2",null,4,0,null,28,[],502,[],"call"],
 $isEH:true},
 nl:{
-"^":"Tp:75;",
-$2:[function(a,b){return!J.de(a,"false")},"$2",null,4,0,null,231,[],17,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){return!J.de(a,"false")},"$2",null,4,0,null,28,[],117,[],"call"],
 $isEH:true},
 ik:{
-"^":"Tp:75;",
-$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,231,[],262,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,28,[],502,[],"call"],
 $isEH:true},
 mf:{
-"^":"Tp:16;a",
-$1:function(a){return this.a},
+"^":"Tp:116;a",
+$1:[function(a){return this.a},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 LfS:{
-"^":"Tp:75;",
-$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,231,[],262,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,28,[],502,[],"call"],
 $isEH:true},
 HK:{
-"^":"Tp:16;b",
-$1:function(a){return this.b},
+"^":"Tp:116;b",
+$1:[function(a){return this.b},"$1",null,2,0,null,117,[],"call"],
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 ul:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.Vk(a.gvc(),new T.o8(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","qP",2,0,54,70,[]],
+return z},"$1","qP",2,0,206,122,[]],
 PX:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.kl(a.gvc(),new T.ex(a)).zV(0,";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Fx",2,0,54,70,[]],
+return z},"$1","Fx",2,0,206,122,[]],
 o8:{
-"^":"Tp:16;a",
-$1:function(a){return J.de(this.a.t(0,a),!0)},
+"^":"Tp:116;a",
+$1:[function(a){return J.de(this.a.t(0,a),!0)},"$1",null,2,0,null,376,[],"call"],
 $isEH:true},
 ex:{
-"^":"Tp:16;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,158,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,376,[],"call"],
 $isEH:true},
 e9:{
 "^":"T4p;",
 op:[function(a,b,c){var z,y,x
+if(a==null)return
 z=new Y.hc(H.VM([],[Y.Pn]),P.p9(""),new P.WU(a,0,0,null),null)
 y=new U.tc()
 y=new T.FX(y,z,null,null)
@@ -13176,23 +13332,23 @@
 if(M.wR(c)){z=J.x(b)
 z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"$3","gca",6,0,263],
+return new T.Xy(this,b,x)},"$3","gca",6,0,503,274,[],12,[],273,[]],
 CE:function(a){return new T.uK(this)}},
 Xy:{
-"^":"Tp:75;a,b,c",
+"^":"Tp:300;a,b,c",
 $2:[function(a,b){var z
 if(!J.x(a).$isz6){z=this.a.nF
 a=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}z=!!J.x(b).$iscv
 if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
 if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"$2",null,4,0,null,259,[],260,[],"call"],
+return T.FL(this.c,a,null)},"$2",null,4,0,null,292,[],273,[],"call"],
 $isEH:true},
 uK:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z
 if(!!J.x(a).$isz6)z=a
 else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}return z},"$1",null,2,0,null,259,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}return z},"$1",null,2,0,null,292,[],"call"],
 $isEH:true},
 mY:{
 "^":"Pi;a9,Cu,uI,Y7,AP,fn",
@@ -13201,12 +13357,12 @@
 z=this.Y7
 if(!!J.x(a).$isfk){y=J.OS(J.kl(a.bm,new T.mB(this,a)),!1)
 this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"$1","gUG",2,0,16,70,[]],
-gP:[function(a){return this.Y7},null,null,1,0,22,"value",82],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"$1","gUG",2,0,116,122,[]],
+gP:[function(a){return this.Y7},null,null,1,0,115,"value",308],
 sP:[function(a,b){var z,y,x
 try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
 if(!!J.x(x).$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,16,70,[],"value",82],
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,116,122,[],"value",308],
 yB:function(a,b,c){var z,y,x,w
 y=this.Cu
 y.gju().yI(this.gUG()).fm(0,new T.GX(this))
@@ -13219,14 +13375,14 @@
 z.yB(a,b,c)
 return z}}},
 GX:{
-"^":"Tp:16;a",
-$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"$1",null,2,0,null,7,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 mB:{
-"^":"Tp:16;a,b",
+"^":"Tp:116;a,b",
 $1:[function(a){var z=P.L5(null,null,null,null,null)
 z.u(0,this.b.F5,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"$1",null,2,0,null,135,[],"call"],
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"$1",null,2,0,null,334,[],"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 XF:{
@@ -13239,14 +13395,14 @@
 bX:{
 "^":"Tp;a,b",
 $1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"$1",null,2,0,null,135,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"$1",null,2,0,null,334,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"CV",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
-OH:function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
+OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
 J.UK(z,new K.Ed(b))
-return z.gLv()},
-jX:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+return z.gLv()},"$2","tk",4,0,null,285,[],278,[]],
+jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
 y=new K.c4(z)
@@ -13274,79 +13430,79 @@
 if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
 else{H.vn(p).tu(new H.GD(H.u1(u)),2,[b],C.CM)
-H.vn(b)}},
-ci:function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
-return a},
+H.vn(b)}},"$3","wA",6,0,null,285,[],30,[],278,[]],
+ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
+return a},"$1","W1",2,0,null,122,[]],
 Uf:{
-"^":"Tp:75;",
-$2:function(a,b){return J.WB(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.WB(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 wJY:{
-"^":"Tp:75;",
-$2:function(a,b){return J.xH(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.xH(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 zOQ:{
-"^":"Tp:75;",
-$2:function(a,b){return J.vX(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.vX(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 W6o:{
-"^":"Tp:75;",
-$2:function(a,b){return J.FW(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.FW(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 MdQ:{
-"^":"Tp:75;",
-$2:function(a,b){return J.de(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.de(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 YJG:{
-"^":"Tp:75;",
-$2:function(a,b){return!J.de(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return!J.de(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 DOe:{
-"^":"Tp:75;",
-$2:function(a,b){return J.z8(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.z8(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 lPa:{
-"^":"Tp:75;",
-$2:function(a,b){return J.J5(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.J5(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 Ufa:{
-"^":"Tp:75;",
-$2:function(a,b){return J.u6(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.u6(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 Raa:{
-"^":"Tp:75;",
-$2:function(a,b){return J.Bl(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.Bl(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 w0:{
-"^":"Tp:75;",
-$2:function(a,b){return a===!0||b===!0},
+"^":"Tp:300;",
+$2:[function(a,b){return a===!0||b===!0},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 w4:{
-"^":"Tp:75;",
-$2:function(a,b){return a===!0&&b===!0},
+"^":"Tp:300;",
+$2:[function(a,b){return a===!0&&b===!0},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 w5:{
-"^":"Tp:75;",
-$2:function(a,b){var z=H.Og(P.a)
+"^":"Tp:300;",
+$2:[function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.$1(a)
-throw H.b(K.kG("Filters must be a one-argument function."))},
+throw H.b(K.kG("Filters must be a one-argument function."))},"$2",null,4,0,null,118,[],128,[],"call"],
 $isEH:true},
 w7:{
-"^":"Tp:16;",
-$1:function(a){return a},
+"^":"Tp:116;",
+$1:[function(a){return a},"$1",null,2,0,null,118,[],"call"],
 $isEH:true},
 w10:{
-"^":"Tp:16;",
-$1:function(a){return J.Z7(a)},
+"^":"Tp:116;",
+$1:[function(a){return J.Z7(a)},"$1",null,2,0,null,118,[],"call"],
 $isEH:true},
 w11:{
-"^":"Tp:16;",
-$1:function(a){return a!==!0},
+"^":"Tp:116;",
+$1:[function(a){return a!==!0},"$1",null,2,0,null,118,[],"call"],
 $isEH:true},
 c4:{
-"^":"Tp:22;a",
-$0:function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},
+"^":"Tp:115;a",
+$0:[function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
 $isEH:true},
 z6:{
 "^":"a;eT>,k8<,bq,G9",
@@ -13360,8 +13516,7 @@
 else{z=this.bq.Zp
 if(z.x4(b))return K.ci(z.t(0,b))
 else if(this.k8!=null){y=new H.GD(H.u1(b))
-z=this.gCH()
-x=Z.y1(z.gt5(z),y)
+x=Z.y1(H.jO(J.bB(this.gCH().Ax).LU),y)
 z=J.x(x)
 if(!z.$isRY)w=!!z.$isRS&&x.glT()
 else w=!0
@@ -13369,19 +13524,17 @@
 else if(!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
 if(z!=null)return K.ci(z.t(0,b))
 else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},
-tI:function(a){var z,y
+tI:function(a){var z
 if(J.de(a,"this"))return
 else{z=this.bq
 if(z.Zp.x4(a))return z
 else{z=H.u1(a)
-y=this.gCH()
-if(Z.y1(y.gt5(y),new H.GD(z))!=null)return this.k8}}z=this.eT
+if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return this.k8}}z=this.eT
 if(z!=null)return z.tI(a)},
-tg:function(a,b){var z,y
+tg:function(a,b){var z
 if(this.bq.Zp.x4(b))return!0
 else{z=H.u1(b)
-y=this.gCH()
-if(Z.y1(y.gt5(y),new H.GD(z))!=null)return!0}z=this.eT
+if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return!0}z=this.eT
 if(z!=null)return z.tg(0,b)
 return!1},
 $isz6:true},
@@ -13430,13 +13583,13 @@
 return x},
 ZR:function(a){var z,y,x,w,v
 z=J.UK(a.ghP(),this)
-if(a.gre()==null)y=null
-else{x=a.gre()
-w=this.gnG()
-x.toString
-y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.fa(z,y,a,null,null,null,P.bK(null,null,!1,null))
+y=a.gre()
+if(y==null)x=null
+else{w=this.gnG()
+y.toString
+x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
-if(y!=null)H.bQ(y,new K.Os(v))
+if(x!=null)H.bQ(x,new K.Os(v))
 return v},
 ti:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
 o0:function(a){var z,y
@@ -13447,7 +13600,7 @@
 YV:function(a){var z,y,x
 z=J.UK(a.gG3(a),this)
 y=J.UK(a.gv4(),this)
-x=new K.jV(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
 return x},
@@ -13471,16 +13624,16 @@
 y.sbO(x)
 return x}},
 Os:{
-"^":"Tp:16;a",
-$1:function(a){var z=this.a
+"^":"Tp:116;a",
+$1:[function(a){var z=this.a
 a.sbO(z)
-return z},
+return z},"$1",null,2,0,null,118,[],"call"],
 $isEH:true},
 B8:{
-"^":"Tp:16;a",
-$1:function(a){var z=this.a
+"^":"Tp:116;a",
+$1:[function(a){var z=this.a
 a.sbO(z)
-return z},
+return z},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Wh:{
 "^":"Ay;KL,bO,tj,Lv,k6",
@@ -13508,11 +13661,11 @@
 $iskB:true,
 $ishw:true},
 ID:{
-"^":"Tp:75;",
-$2:function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},
+"^":"Tp:300;",
+$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
+return a},"$2",null,4,0,null,202,[],21,[],"call"],
 $isEH:true},
-jV:{
+qR:{
 "^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
 RR:function(a,b){return b.YV(this)},
 $asAy:function(){return[U.wk]},
@@ -13534,12 +13687,12 @@
 $isw6:true,
 $ishw:true},
 Qv:{
-"^":"Tp:16;a,b,c",
-$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
+"^":"Tp:116;a,b,c",
+$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
 $isEH:true},
 Xm:{
-"^":"Tp:16;d",
-$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
+"^":"Tp:116;d",
+$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 mv:{
 "^":"Ay;wz<,KL,bO,tj,Lv,k6",
@@ -13575,8 +13728,8 @@
 $isuk:true,
 $ishw:true},
 uA:{
-"^":"Tp:16;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,17,[],"call"],
+"^":"Tp:116;a,b",
+$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 vl:{
 "^":"Ay;hP<,KL,bO,tj,Lv,k6",
@@ -13596,12 +13749,12 @@
 $isx9:true,
 $ishw:true},
 Li:{
-"^":"Tp:16;a,b,c",
-$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
+"^":"Tp:116;a,b,c",
+$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
 $isEH:true},
 WK:{
-"^":"Tp:16;d",
-$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
+"^":"Tp:116;d",
+$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 iT:{
 "^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
@@ -13611,18 +13764,18 @@
 return}y=this.Jn.gLv()
 x=J.U6(z)
 this.Lv=x.t(z,y)
-if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},
 RR:function(a,b){return b.CU(this)},
 $asAy:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
-ja:{
-"^":"Tp:16;a,b,c",
-$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
+tE:{
+"^":"Tp:116;a,b,c",
+$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
 $isEH:true},
 ey:{
-"^":"Tp:16;d",
-$1:function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},
+"^":"Tp:116;d",
+$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 fa:{
 "^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
@@ -13646,16 +13799,16 @@
 $isJy:true,
 $ishw:true},
 WW:{
-"^":"Tp:16;",
-$1:[function(a){return a.gLv()},"$1",null,2,0,null,53,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){return a.gLv()},"$1",null,2,0,null,118,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:254;a,b,c",
-$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
+"^":"Tp:491;a,b,c",
+$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
 $isEH:true},
 a9:{
-"^":"Tp:16;d",
-$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
+"^":"Tp:116;d",
+$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 VA:{
 "^":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
@@ -13673,15 +13826,15 @@
 $isX7:true,
 $ishw:true},
 J1:{
-"^":"Tp:16;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,17,[],"call"],
+"^":"Tp:116;a,b",
+$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 fk:{
 "^":"a;F5,bm",
 $isfk:true},
 wL:{
-"^":"a:16;lR,ex",
-$1:function(a){return this.lR.F2(this.ex,[a],null).Ax},
+"^":"a:116;lR,ex",
+$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"$1","gKu",2,0,null,504,[]],
 $iswL:true,
 $isEH:true},
 B0:{
@@ -13690,27 +13843,27 @@
 $isB0:true,
 static:{kG:function(a){return new K.B0(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
 "^":"",
-Pu:function(a,b){var z,y
+Pu:[function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
 if(a==null||b==null)return!1
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},
-au:function(a){a.toString
-return U.xk(H.n3(a,0,new U.xs()))},
-Zm:function(a,b){var z=J.WB(a,b)
+if(!J.de(y,b[z]))return!1}return!0},"$2","xV",4,0,null,118,[],199,[]],
+au:[function(a){a.toString
+return U.xk(H.n3(a,0,new U.xs()))},"$1","bT",2,0,null,286,[]],
+Zm:[function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},
-xk:function(a){if(typeof a!=="number")return H.s(a)
+return a^a>>>6},"$2","uN",4,0,null,238,[],30,[]],
+xk:[function(a){if(typeof a!=="number")return H.s(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},
+return 536870911&a+((16383&a)<<15>>>0)},"$1","Zy",2,0,null,238,[]],
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,264,7,[],53,[]],
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,505,21,[],118,[]],
 F2:function(a,b,c){return new U.Jy(a,b,c)}},
 hw:{
 "^":"a;",
@@ -13851,8 +14004,8 @@
 return U.xk(U.Zm(U.Zm(U.Zm(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:75;",
-$2:function(a,b){return U.Zm(a,J.v1(b))},
+"^":"Tp:300;",
+$2:[function(a,b){return U.Zm(a,J.v1(b))},"$2",null,4,0,null,506,[],507,[],"call"],
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
@@ -13878,12 +14031,9 @@
 this.w5()
 w=this.o9()
 this.Sk.toString
-a=new U.X7(a,w)}else{if(J.de(J.Iz(this.fL.lo),8)){z=this.fL.lo.gG8()
-if(typeof z!=="number")return z.F()
-if(typeof b!=="number")return H.s(b)
-z=z>=b}else z=!1
-if(z)a=this.Tw(a)
-else break}return a},
+a=new U.X7(a,w)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
+else break
+return a},
 qL:function(a,b){var z,y
 z=J.x(b)
 if(!!z.$isw6){z=z.gP(b)
@@ -13892,17 +14042,12 @@
 y=b.gre()
 this.Sk.toString
 return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
-Tw:function(a){var z,y,x,w
+Tw:function(a){var z,y,x
 z=this.fL.lo
 this.w5()
 y=this.WT()
 while(!0){x=this.fL.lo
-if(x!=null)if(J.de(J.Iz(x),8)||J.de(J.Iz(this.fL.lo),3)||J.de(J.Iz(this.fL.lo),9)){x=this.fL.lo.gG8()
-w=z.gG8()
-if(typeof x!=="number")return x.D()
-if(typeof w!=="number")return H.s(w)
-w=x>w
-x=w}else x=!1
+if(x!=null)x=(J.de(J.Iz(x),8)||J.de(J.Iz(this.fL.lo),3)||J.de(J.Iz(this.fL.lo),9))&&J.z8(this.fL.lo.gG8(),z.gG8())
 else x=!1
 if(!x)break
 y=this.BH(y,this.fL.lo.gG8())}x=J.Vm(z)
@@ -14012,17 +14157,17 @@
 return y},
 tw:function(){return this.yj("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,71,72,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,287,127,[]],
 Ae:{
-"^":"a;vH>-93,P>-265",
+"^":"a;vH>-326,P>-508",
 n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,16,69,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,249,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,87,"toString"],
+return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,116,99,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,487,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,312,"toString"],
 $isAe:true,
 "@":function(){return[C.Nw]},
 "<>":[3],
-static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[P.KN,a]}},this.$receiver,"Ae")},73,[],27,[],"new IndexedValue"]}},
+static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.bU,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
 "+IndexedValue":[0],
 Bt:{
 "^":"mW;ty",
@@ -14051,19 +14196,19 @@
 return!1},
 $asAC:function(a){return[[K.Ae,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{
 "^":"",
-y1:function(a,b){var z,y,x
-if(a.gYK().Fb.x4(b))return a.gYK().Fb.t(0,b)
+y1:[function(a,b){var z,y,x
+if(a.gYK().nb.x4(b))return a.gYK().nb.t(0,b)
 z=a.gAY()
 if(z!=null&&!J.de(J.Ba(z),C.PU)){y=Z.y1(a.gAY(),b)
 if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return},"$2","rz",4,0,null,288,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
-wX:function(a){switch(a){case 102:return 12
+wX:[function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
 case 118:return 11
-default:return a}},
+default:return a}},"$1","uO",2,0,null,289,[]],
 Pn:{
 "^":"a;fY>,P>,G8<",
 bu:function(a){return"("+this.fY+", '"+this.P+"')"},
@@ -14161,7 +14306,7 @@
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,266,267,[]]},
+DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,509,94,[]]},
 d2:{
 "^":"fr;",
 W9:function(a){return this.xn(a)},
@@ -14174,7 +14319,8 @@
 this.xn(a)},
 ZR:function(a){var z
 J.UK(a.ghP(),this)
-if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
+z=a.gre()
+if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
 this.xn(a)},
 ti:function(a){return this.xn(a)},
 o0:function(a){var z
@@ -14194,14 +14340,14 @@
 this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 NQ:{
-"^":["V24;kW%-235,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-guw:[function(a){return a.kW},null,null,1,0,236,"app",82,104],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,237,27,[],"app",82],
+"^":["V28;kW%-475,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,476,"app",308,311],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,477,30,[],"app",308],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -14209,52 +14355,52 @@
 a.X0=w
 C.Cc.ZL(a)
 C.Cc.oX(a)
-return a},null,null,0,0,22,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[268],
-V24:{
+return a},null,null,0,0,115,"new ResponseViewerElement$created"]}},
+"+ResponseViewerElement":[510],
+V28:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
 "^":"",
-ov:{
-"^":["V25;QV%-269,t7%-93,hX%-93,FZ%-109,Bs%-270,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.QV},null,null,1,0,271,"script",82,104],
-sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,272,27,[],"script",82],
-gBV:[function(a){return a.t7},null,null,1,0,249,"pos",82,104],
-sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,137,27,[],"pos",82],
-giX:[function(a){return a.hX},null,null,1,0,249,"endPos",82,104],
-siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,137,27,[],"endPos",82],
-gHp:[function(a){return a.FZ},null,null,1,0,126,"coverage",82,104],
-sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,127,27,[],"coverage",82],
-gSw:[function(a){return a.Bs},null,null,1,0,273,"lines",82,83],
-sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,274,27,[],"lines",82],
+SM:{
+"^":["V29;QV%-511,t7%-326,hX%-326,FZ%-304,Bs%-512,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.QV},null,null,1,0,513,"script",308,311],
+sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,514,30,[],"script",308],
+gBV:[function(a){return a.t7},null,null,1,0,487,"pos",308,311],
+sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,363,30,[],"pos",308],
+giX:[function(a){return a.hX},null,null,1,0,487,"endPos",308,311],
+siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,363,30,[],"endPos",308],
+gHp:[function(a){return a.FZ},null,null,1,0,307,"coverage",308,311],
+sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,310,30,[],"coverage",308],
+gSw:[function(a){return a.Bs},null,null,1,0,515,"lines",308,309],
+sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,516,30,[],"lines",308],
 rh:[function(a,b){this.VH(a)
-this.ct(a,C.du,0,1)},"$1","grO",2,0,26,65,[],"scriptChanged"],
-Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,26,65,[],"posChanged"],
+this.ct(a,C.wq,0,1)},"$1","grO",2,0,169,242,[],"scriptChanged"],
+Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,169,242,[],"posChanged"],
 OM:[function(a,b){this.ct(a,C.Cv,0,1)
-this.ct(a,C.du,0,1)},"$1","gTA",2,0,16,65,[],"coverageChanged"],
+this.ct(a,C.wq,0,1)},"$1","gTA",2,0,116,242,[],"coverageChanged"],
 qEQ:[function(a,b){var z,y
 z=a.QV
 if(z==null||a.FZ!==!0)return"min-width:32px;"
 y=J.UQ(z.gu9(),b.gRd())
 if(y==null)return"min-width:32px;"
 if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"$1","gL0",2,0,275,276,[],"hitStyle",83],
+return"min-width:32px;background-color:green"},"$1","gL0",2,0,517,192,[],"hitStyle",309],
 VH:[function(a){var z,y,x,w,v
 if(J.iS(a.QV)!==!0){J.SK(a.QV).ml(new T.ZJ(a))
 return}this.ct(a,C.Cv,0,1)
 J.U2(a.Bs)
 z=a.QV.q6(a.t7)
-y=a.hX
+if(z!=null){y=a.hX
 x=a.QV
 if(y==null)J.wT(a.Bs,J.UQ(J.Ew(x),J.xH(z,1)))
 else{w=x.q6(y)
-for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.wT(a.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}},"$0","gI2",0,0,21,"_updateProperties"],
+for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.wT(a.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}}},"$0","gI2",0,0,126,"_updateProperties"],
 "@":function(){return[C.OLi]},
-static:{"^":"bN<-29,JP<-29,VnP<-29",T5:[function(a){var z,y,x,w,v
+static:{"^":"bN<-85,JP<-85,VnP<-85",T5:[function(a){var z,y,x,w,v
 z=R.Jk([])
 y=$.Nd()
-x=P.Py(null,null,null,P.qU,W.I0)
-w=P.qU
+x=P.Py(null,null,null,J.O,W.I0)
+w=J.O
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
 a.FZ=!1
@@ -14264,48 +14410,48 @@
 a.X0=v
 C.HD.ZL(a)
 C.HD.oX(a)
-return a},null,null,0,0,22,"new ScriptInsetElement$created"]}},
-"+ScriptInsetElement":[277],
-V25:{
+return a},null,null,0,0,115,"new ScriptInsetElement$created"]}},
+"+ScriptInsetElement":[518],
+V29:{
 "^":"uL+Pi;",
 $isd3:true},
 ZJ:{
-"^":"Tp:16;a-29",
+"^":"Tp:116;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,16,17,[],"call"],
+if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,116,117,[],"call"],
 $isEH:true},
-"+ ZJ":[124]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+"+ ZJ":[315]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
-kn:{
-"^":["x4;jJ%-93,AP,fn,tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gBV:[function(a){return a.jJ},null,null,1,0,249,"pos",82,104],
-sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,137,27,[],"pos",82],
+knI:{
+"^":["x4;jJ%-326,AP,fn,tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gBV:[function(a){return a.jJ},null,null,1,0,487,"pos",308,311],
+sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,363,30,[],"pos",308],
 gD5:[function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.gD5.call(this,a)
-return z.gzz()},null,null,1,0,87,"hoverText"],
-Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,26,65,[],"posChanged"],
+return z.gzz()},null,null,1,0,312,"hoverText"],
+Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,169,242,[],"posChanged"],
 r6:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,26,17,[],"_updateProperties"],
+this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,169,117,[],"_updateProperties"],
 goc:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
 y=a.tY
 if(z===!0)return H.d(Q.xI.prototype.goc.call(this,a))+":"+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,87,"name"],
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,312,"name"],
 gO3:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
 y=a.tY
 if(z===!0)return Q.xI.prototype.gO3.call(this,a)+"#line="+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,87,"url"],
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,312,"url"],
 "@":function(){return[C.Ur]},
 static:{Th:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.jJ=-1
@@ -14315,31 +14461,31 @@
 a.X0=w
 C.c0.ZL(a)
 C.c0.oX(a)
-return a},null,null,0,0,22,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[278],
+return a},null,null,0,0,115,"new ScriptRefElement$created"]}},
+"+ScriptRefElement":[519],
 x4:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V26;Uz%-269,HJ%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.Uz},null,null,1,0,271,"script",82,104],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,272,27,[],"script",82],
-gjG:[function(a){return a.HJ},null,null,1,0,126,"showCoverage",82,104],
-sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,127,27,[],"showCoverage",82],
+"^":["V30;Uz%-511,HJ%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,513,"script",308,311],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,514,30,[],"script",308],
+gjG:[function(a){return a.HJ},null,null,1,0,307,"showCoverage",308,311],
+sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,310,30,[],"showCoverage",308],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Uz
 if(z==null)return
-J.SK(z)},"$0","gQd",0,0,21,"enteredView"],
-ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,16,65,[],"showCoverageChanged"],
-pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
-j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,26,106,[],"refreshCoverage"],
+J.SK(z)},"$0","gQd",0,0,126,"enteredView"],
+ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,116,242,[],"showCoverageChanged"],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,169,339,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
 static:{Ry:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.HJ=!1
@@ -14348,9 +14494,9 @@
 a.X0=w
 C.cJ.ZL(a)
 C.cJ.oX(a)
-return a},null,null,0,0,22,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[279],
-V26:{
+return a},null,null,0,0,115,"new ScriptViewElement$created"]}},
+"+ScriptViewElement":[520],
+V30:{
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
@@ -14370,7 +14516,7 @@
 v.$builtinTypeInfo=[w]
 v=new Q.wn(null,null,v,null,null)
 v.$builtinTypeInfo=[w]
-w=P.KN
+w=J.bU
 u=D.N8
 t=new V.qC(P.Py(null,null,null,w,u),null,null)
 t.$builtinTypeInfo=[w,u]
@@ -14380,10 +14526,9 @@
 break
 case"Isolate":z=new V.qC(P.Py(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
-z=R.Jk(z)
-x=P.L5(null,null,null,P.qU,D.af)
+x=P.L5(null,null,null,J.O,D.af)
 w=[]
-w.$builtinTypeInfo=[P.qU]
+w.$builtinTypeInfo=[J.O]
 v=[]
 v.$builtinTypeInfo=[D.e5]
 u=D.U4
@@ -14391,9 +14536,9 @@
 t.$builtinTypeInfo=[u]
 t=new Q.wn(null,null,t,null,null)
 t.$builtinTypeInfo=[u]
-u=P.L5(null,null,null,P.qU,P.CP)
+u=P.L5(null,null,null,J.O,J.Pp)
 u=R.Jk(u)
-s=new D.bv(z,!1,!1,!1,!1,x,new D.tL(w,v,null,null,20,0),null,t,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.bv(z,null,!1,!1,!0,x,new D.tL(w,v,null,null,20,0),null,t,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Library":z=D.U4
 x=[]
@@ -14431,8 +14576,8 @@
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-z=P.KN
-w=P.KN
+z=J.bU
+w=J.bU
 v=new V.qC(P.Py(null,null,null,z,w),null,null)
 v.$builtinTypeInfo=[z,w]
 s=new D.rj(x,v,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
@@ -14441,16 +14586,16 @@
 z.$builtinTypeInfo=[null,null]
 s=new D.SI(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
 return s},
-D5:function(a){var z
+D5:[function(a){var z
 if(a!=null){z=J.U6(a)
 z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
-return z},
-ES:function(a,b){var z=J.x(a)
+return z},"$1","SSc",2,0,null,202,[]],
+ES:[function(a,b){var z=J.x(a)
 if(!!z.$isSI)return
 if(!!z.$isqC)D.Gf(a,b)
-else if(!!z.$iswn)D.f3(a,b)},
-Gf:function(a,b){a.aN(0,new D.UZ(a,b))},
-f3:function(a,b){var z,y,x,w,v,u
+else if(!!z.$iswn)D.f3(a,b)},"$2","Ja",4,0,null,290,[],156,[]],
+Gf:[function(a,b){a.aN(0,new D.UZ(a,b))},"$2","nV",4,0,null,162,[],156,[]],
+f3:[function(a,b){var z,y,x,w,v,u
 for(z=a.ao,y=0;y<z.length;++y){x=z[y]
 w=J.x(x)
 v=!!w.$isqC
@@ -14458,29 +14603,29 @@
 else u=!1
 if(u)a.u(0,y,b.Zr(x))
 else if(!!w.$iswn)D.f3(x,b)
-else if(v)D.Gf(x,b)}},
+else if(v)D.Gf(x,b)}},"$2","PV",4,0,null,76,[],156,[]],
 af:{
 "^":"Pi;bN@,GR@",
-gXP:[function(){return this.P3},null,null,1,0,280,"owner",82],
+gXP:[function(){return this.P3},null,null,1,0,521,"owner",308],
 gzf:[function(a){var z=this.P3
-return z.gzf(z)},null,null,1,0,281,"vm",82],
+return z.gzf(z)},null,null,1,0,522,"vm",308],
 gF1:[function(a){var z=this.P3
-return z.gF1(z)},null,null,1,0,81,"isolate",82],
-gjO:[function(a){return this.KG},null,null,1,0,87,"id",82],
-gzS:[function(){return this.mQ},null,null,1,0,87,"serviceType",82],
+return z.gF1(z)},null,null,1,0,318,"isolate",308],
+gjO:[function(a){return this.KG},null,null,1,0,312,"id",308],
+gzS:[function(){return this.mQ},null,null,1,0,312,"serviceType",308],
 gPj:[function(a){var z,y
 z=this.gF1(this)
 y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,87,"link",82],
-gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,87,"hashLink",82],
-sHP:[function(a){},null,null,3,0,16,69,[],"hashLink",82],
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,312,"link",308],
+gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,312,"hashLink",308],
+sHP:[function(a){},null,null,3,0,116,99,[],"hashLink",308],
 gox:function(a){return this.kT},
 gUm:function(){return!1},
 gM8:function(){return!1},
-goc:[function(a){return this.gbN()},null,null,1,0,87,"name",82,83],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,8,27,[],"name",82],
-gzz:[function(){return this.gGR()},null,null,1,0,87,"vmName",82,83],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,8,27,[],"vmName",82],
+goc:[function(a){return this.gbN()},null,null,1,0,312,"name",308,309],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",308],
+gzz:[function(){return this.gGR()},null,null,1,0,312,"vmName",308,309],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",308],
 xW:function(a){if(this.kT)return P.Ab(this,null)
 return this.VD(0)},
 VD:function(a){var z
@@ -14501,7 +14646,7 @@
 this.bF(0,a,y)},
 $isaf:true},
 Pa:{
-"^":"Tp:283;a",
+"^":"Tp:454;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -14509,31 +14654,31 @@
 y=this.a
 if(!J.de(z,y.mQ))return D.ac(y.P3,a)
 y.eC(a)
-return y},"$1",null,2,0,null,282,[],"call"],
+return y},"$1",null,2,0,null,162,[],"call"],
 $isEH:true},
 jI:{
-"^":"Tp:22;b",
+"^":"Tp:115;b",
 $0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
 $isEH:true},
 u0g:{
 "^":"af;"},
-H6:{
+zM:{
 "^":"O1w;Li<,G2<",
-gzf:[function(a){return this},null,null,1,0,281,"vm",82],
-gF1:[function(a){return},null,null,1,0,81,"isolate",82],
+gzf:[function(a){return this},null,null,1,0,522,"vm",308],
+gF1:[function(a){return},null,null,1,0,318,"isolate",308],
 gi2:[function(){var z=this.z7
-return z.gUQ(z)},null,null,1,0,284,"isolates",82],
-gPj:[function(a){return H.d(this.KG)},null,null,1,0,87,"link",82],
-gYe:[function(a){return this.Ox},null,null,1,0,87,"version",82,83],
-sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,8,27,[],"version",82],
-gF6:[function(){return this.GY},null,null,1,0,87,"architecture",82,83],
-sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,8,27,[],"architecture",82],
-gUn:[function(){return this.Rp},null,null,1,0,285,"uptime",82,83],
-sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,286,27,[],"uptime",82],
-gC3:[function(){return this.Ts},null,null,1,0,126,"assertsEnabled",82,83],
-sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,127,27,[],"assertsEnabled",82],
-gPV:[function(){return this.Va},null,null,1,0,126,"typeChecksEnabled",82,83],
-sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,127,27,[],"typeChecksEnabled",82],
+return z.gUQ(z)},null,null,1,0,523,"isolates",308],
+gPj:[function(a){return H.d(this.KG)},null,null,1,0,312,"link",308],
+gYe:[function(a){return this.Ox},null,null,1,0,312,"version",308,309],
+sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,32,30,[],"version",308],
+gF6:[function(){return this.GY},null,null,1,0,312,"architecture",308,309],
+sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,32,30,[],"architecture",308],
+gUn:[function(){return this.Rp},null,null,1,0,524,"uptime",308,309],
+sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,525,30,[],"uptime",308],
+gC3:[function(){return this.Ts},null,null,1,0,307,"assertsEnabled",308,309],
+sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,310,30,[],"assertsEnabled",308],
+gPV:[function(){return this.Va},null,null,1,0,307,"typeChecksEnabled",308,309],
+sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,310,30,[],"typeChecksEnabled",308],
 bZ:function(a){var z,y,x,w
 z=$.rc().R4(0,a)
 if(z==null)return
@@ -14571,7 +14716,7 @@
 return this.Tn(x).ml(new D.oe(this,w))}v=this.A4.t(0,z.a)
 if(v!=null)return J.am(v)
 return this.jU(z.a).ml(new D.kk(z,this))},
-Nw:[function(a,b){return b},"$2","gS6",4,0,75],
+Nw:[function(a,b){return b},"$2","gS6",4,0,300,49,[],30,[]],
 b2:function(a){var z,y,x
 z=null
 try{y=new P.Cf(this.gS6())
@@ -14583,7 +14728,7 @@
 if(J.de(z.t(a,"type"),"ServiceError"))return P.Vu(D.ac(this,a),null,null)
 else if(J.de(z.t(a,"type"),"ServiceException"))return P.Vu(D.ac(this,a),null,null)
 return P.Ab(a,null)},
-jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.I2(this),new D.mR())},
+jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.mR(this),new D.bp())},
 bF:function(a,b,c){var z,y
 if(c)return
 this.kT=!0
@@ -14601,7 +14746,7 @@
 this.xA(z.t(b,"isolates"))},
 xA:function(a){var z,y,x,w,v,u
 z=this.z7
-y=P.L5(null,null,null,P.qU,D.bv)
+y=P.L5(null,null,null,J.O,D.bv)
 for(x=J.GP(a);x.G();){w=x.gl()
 v=J.UQ(w,"id")
 u=z.t(0,v)
@@ -14615,37 +14760,37 @@
 this.A4.u(0,"vm",this)
 var z=P.EF(["id","vm","type","@VM"],null,null)
 this.eC(R.Jk(z))},
-$isH6:true},
+$iszM:true},
 O1w:{
 "^":"u0g+Pi;",
 $isd3:true},
 MZ:{
-"^":"Tp:16;a,b",
-$1:[function(a){if(!J.x(a).$isH6)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,168,[],"call"],
+"^":"Tp:116;a,b",
+$1:[function(a){if(!J.x(a).$iszM)return
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,57,[],"call"],
 $isEH:true},
 oe:{
-"^":"Tp:16;b,c",
+"^":"Tp:116;b,c",
 $1:[function(a){var z
 if(a==null)return this.b
 z=this.c
 if(z==null)return J.am(a)
-else return a.cv(z)},"$1",null,2,0,null,10,[],"call"],
+else return a.cv(z)},"$1",null,2,0,null,16,[],"call"],
 $isEH:true},
 kk:{
-"^":"Tp:283;a,d",
+"^":"Tp:454;a,d",
 $1:[function(a){var z,y
 z=this.d
 y=D.ac(z,a)
 if(y.gUm())z.A4.to(this.a.a,new D.QZ(y))
-return y},"$1",null,2,0,null,282,[],"call"],
+return y},"$1",null,2,0,null,162,[],"call"],
 $isEH:true},
 QZ:{
-"^":"Tp:22;e",
-$0:function(){return this.e},
+"^":"Tp:115;e",
+$0:[function(){return this.e},"$0",null,0,0,null,"call"],
 $isEH:true},
 Ey:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z,y,x,w
 z=null
 try{z=this.a.b2(a)}catch(x){w=H.Ru(x)
@@ -14653,36 +14798,36 @@
 P.JS("Hit V8 bug.")
 w=P.EF(["type","ServiceException","id","","kind","DecodeException","response","This is likely a result of a known V8 bug. Although the the bug has been fixed the fix may not be in your Chrome version. For more information see dartbug.com/18385. Observatory is still functioning and you should try your action again.","message","Could not decode JSON: "+H.d(y)],null,null)
 w=R.Jk(w)
-return P.Vu(D.ac(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,190,[],"call"],
+return P.Vu(D.ac(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,423,[],"call"],
 $isEH:true},
 tm:{
-"^":"Tp:16;b",
+"^":"Tp:116;b",
 $1:[function(a){var z=this.b.G2
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,30,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,171,[],"call"],
 $isEH:true},
 Gk:{
-"^":"Tp:16;",
-$1:[function(a){return!!J.x(a).$isfJ},"$1",null,2,0,null,7,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){return!!J.x(a).$isfJ},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
-I2:{
-"^":"Tp:16;c",
+mR:{
+"^":"Tp:116;c",
 $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,90,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,324,[],"call"],
 $isEH:true},
-mR:{
-"^":"Tp:16;",
-$1:[function(a){return!!J.x(a).$ishR},"$1",null,2,0,null,7,[],"call"],
+bp:{
+"^":"Tp:116;",
+$1:[function(a){return!!J.x(a).$ishR},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Yu:{
-"^":"Tp:75;",
-$2:function(a,b){J.am(b)},
+"^":"Tp:300;",
+$2:[function(a,b){J.am(b)},"$2",null,4,0,null,526,[],16,[],"call"],
 $isEH:true},
 e5:{
-"^":"a;SP<,hw<,wZ",
+"^":"a;SP<,hw>,wZ",
 gaQ:function(){return this.wZ},
 Bv:function(a){var z,y,x,w,v
 z=this.hw
@@ -14726,43 +14871,43 @@
 for(z=this.hD,x=this.lI,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
 v=Array(v)
 v.fixed$length=init
-v.$builtinTypeInfo=[P.KN]
+v.$builtinTypeInfo=[J.bU]
 u=new D.e5(0,v,0)
 u.CJ()
 x.push(u)}if(typeof v!=="number")return H.s(v)
 z=Array(v)
 z.fixed$length=init
-z=new D.e5(0,H.VM(z,[P.KN]),0)
+z=new D.e5(0,H.VM(z,[J.bU]),0)
 this.yP=z
 z.Bv(y)
 return}z=this.RP
 if(typeof z!=="number")return H.s(z)
 z=Array(z)
 z.fixed$length=init
-u=new D.e5(a,H.VM(z,[P.KN]),0)
+u=new D.e5(a,H.VM(z,[J.bU]),0)
 u.nZ(y,this.yP.hw)
 this.yP.wY(0,y)
 z=this.lI
 z.push(u)
 if(z.length>this.hD)C.Nm.KI(z,0)}},
 bv:{
-"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,DC,zb,bN:KT@,GR:f5@,Er,cL,LE<-287,Cf,W1,p2,Hw,S9,yv,BC@-207,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
-gzf:[function(a){return this.P3},null,null,1,0,281,"vm",82],
-gF1:[function(a){return this},null,null,1,0,81,"isolate",82],
-ghw:[function(){return this.V3},null,null,1,0,288,"counters",82,83],
-shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,283,27,[],"counters",82],
+"^":["uz4;V3,Jr,EY,eU,zG,A4,KJ,v9,DC,zb,bN:KT@,GR:f5@,Er,cL,LE<-527,Cf,W1,p2,Hw,S9,yv,BC@-440,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+gzf:[function(a){return this.P3},null,null,1,0,522,"vm",308],
+gF1:[function(a){return this},null,null,1,0,318,"isolate",308],
+ghw:[function(a){return this.V3},null,null,1,0,453,"counters",308,309],
+shw:[function(a,b){this.V3=F.Wi(this,C.MR,this.V3,b)},null,null,3,0,454,30,[],"counters",308],
 gPj:function(a){return this.KG},
 gHP:function(){return"#/"+H.d(this.KG)},
-gko:[function(){return this.l2},null,null,1,0,126,"pausedOnStart",82,83],
-sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,127,27,[],"pausedOnStart",82],
-geB:[function(){return this.No},null,null,1,0,126,"pausedOnExit",82,83],
-seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,127,27,[],"pausedOnExit",82],
-gLd:[function(){return this.EY},null,null,1,0,126,"running",82,83],
-sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,127,27,[],"running",82],
-gaj:[function(){return this.eU},null,null,1,0,126,"idle",82,83],
-saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,127,27,[],"idle",82],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,289,290,[],"relativeLink",82],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,289,290,[],"relativeHashLink",82],
+gBP:[function(a){return this.Jr},null,null,1,0,337,"pauseEvent",308,309],
+sBP:[function(a,b){this.Jr=F.Wi(this,C.yG,this.Jr,b)},null,null,3,0,338,30,[],"pauseEvent",308],
+gLd:[function(){return this.EY},null,null,1,0,307,"running",308,309],
+sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,310,30,[],"running",308],
+gaj:[function(){return this.eU},null,null,1,0,307,"idle",308,309],
+saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,310,30,[],"idle",308],
+gMN:[function(){return this.zG},null,null,1,0,307,"loading",308,309],
+sMN:[function(a){this.zG=F.Wi(this,C.jA,this.zG,a)},null,null,3,0,310,30,[],"loading",308],
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,528,529,[],"relativeLink",308],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,528,529,[],"relativeHashLink",308],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -14780,7 +14925,7 @@
 for(z=J.GP(y);z.G();){w=z.gl()
 J.UQ(w,"code").eL(w,b,x)}},
 Ms:function(a){return this.cv("coverage").ml(this.gm6())},
-Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gm6",2,0,291,292,[]],
+Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gm6",2,0,530,531,[]],
 Zr:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -14793,33 +14938,33 @@
 cv:function(a){var z=this.A4.t(0,a)
 if(z!=null)return J.am(z)
 return this.P3.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gVc:[function(){return this.v9},null,null,1,0,221,"rootLib",82,83],
-sVc:[function(a){this.v9=F.Wi(this,C.iG,this.v9,a)},null,null,3,0,222,27,[],"rootLib",82],
-gvU:[function(){return this.DC},null,null,1,0,293,"libraries",82,83],
-svU:[function(a){this.DC=F.Wi(this,C.Ij,this.DC,a)},null,null,3,0,294,27,[],"libraries",82],
-gf4:[function(){return this.zb},null,null,1,0,288,"topFrame",82,83],
-sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,283,27,[],"topFrame",82],
-goc:[function(a){return this.KT},null,null,1,0,87,"name",82,83],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,8,27,[],"name",82],
-gzz:[function(){return this.f5},null,null,1,0,87,"vmName",82,83],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,8,27,[],"vmName",82],
-gQ9:[function(){return this.Er},null,null,1,0,87,"mainPort",82,83],
-sQ9:[function(a){this.Er=F.Wi(this,C.dH,this.Er,a)},null,null,3,0,8,27,[],"mainPort",82],
-gw2:[function(){return this.cL},null,null,1,0,295,"entry",82,83],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,296,27,[],"entry",82],
-gCi:[function(){return this.Cf},null,null,1,0,249,"newHeapUsed",82,83],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,137,27,[],"newHeapUsed",82],
-gcu:[function(){return this.W1},null,null,1,0,249,"oldHeapUsed",82,83],
-scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,137,27,[],"oldHeapUsed",82],
-gab:[function(){return this.p2},null,null,1,0,249,"newHeapCapacity",82,83],
-sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,137,27,[],"newHeapCapacity",82],
-gfi:[function(){return this.Hw},null,null,1,0,249,"oldHeapCapacity",82,83],
-sfi:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,137,27,[],"oldHeapCapacity",82],
-guT:[function(a){return this.S9},null,null,1,0,87,"fileAndLine",82,83],
+gVc:[function(){return this.v9},null,null,1,0,462,"rootLib",308,309],
+sVc:[function(a){this.v9=F.Wi(this,C.xe,this.v9,a)},null,null,3,0,463,30,[],"rootLib",308],
+gvU:[function(){return this.DC},null,null,1,0,532,"libraries",308,309],
+svU:[function(a){this.DC=F.Wi(this,C.Ij,this.DC,a)},null,null,3,0,533,30,[],"libraries",308],
+gf4:[function(){return this.zb},null,null,1,0,453,"topFrame",308,309],
+sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,454,30,[],"topFrame",308],
+goc:[function(a){return this.KT},null,null,1,0,312,"name",308,309],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",308],
+gzz:[function(){return this.f5},null,null,1,0,312,"vmName",308,309],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",308],
+gQ9:[function(){return this.Er},null,null,1,0,312,"mainPort",308,309],
+sQ9:[function(a){this.Er=F.Wi(this,C.dH,this.Er,a)},null,null,3,0,32,30,[],"mainPort",308],
+gw2:[function(){return this.cL},null,null,1,0,534,"entry",308,309],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,535,30,[],"entry",308],
+gCi:[function(){return this.Cf},null,null,1,0,487,"newHeapUsed",308,309],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,363,30,[],"newHeapUsed",308],
+gcu:[function(){return this.W1},null,null,1,0,487,"oldHeapUsed",308,309],
+scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,363,30,[],"oldHeapUsed",308],
+gab:[function(){return this.p2},null,null,1,0,487,"newHeapCapacity",308,309],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,363,30,[],"newHeapCapacity",308],
+gQBR:[function(){return this.Hw},null,null,1,0,487,"oldHeapCapacity",308,309],
+sQBR:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,363,30,[],"oldHeapCapacity",308],
+guT:[function(a){return this.S9},null,null,1,0,312,"fileAndLine",308,309],
 at:function(a,b){return this.guT(this).$1(b)},
-suT:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,8,27,[],"fileAndLine",82],
-gkc:[function(a){return this.yv},null,null,1,0,297,"error",82,83],
-skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,298,27,[],"error",82],
+suT:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",308],
+gkc:[function(a){return this.yv},null,null,1,0,536,"error",308,309],
+skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,537,30,[],"error",308],
 bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z=J.U6(b)
 y=z.t(b,"mainPort")
@@ -14830,10 +14975,11 @@
 this.f5=F.Wi(this,C.KS,this.f5,y)
 if(c)return
 this.kT=!0
+this.zG=F.Wi(this,C.jA,this.zG,!1)
 D.ES(b,this)
 if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(b))
 return}y=z.t(b,"rootLib")
-this.v9=F.Wi(this,C.iG,this.v9,y)
+this.v9=F.Wi(this,C.xe,this.v9,y)
 if(z.t(b,"entry")!=null){y=z.t(b,"entry")
 this.cL=F.Wi(this,C.tP,this.cL,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
 this.zb=F.Wi(this,C.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
@@ -14879,14 +15025,12 @@
 this.p2=F.Wi(this,C.So,this.p2,y)
 y=J.UQ(z.t(b,"heap"),"capacityOld")
 this.Hw=F.Wi(this,C.Le,this.Hw,y)
-y=z.t(b,"pausedOnStart")
-this.l2=F.Wi(this,C.NT,this.l2,y)
-y=z.t(b,"pausedOnExit")
-this.No=F.Wi(this,C.wq,this.No,y)
-y=z.t(b,"topFrame")
-y=F.Wi(this,C.X8,this.EY,y!=null)
-this.EY=y
-y=this.l2!==!0&&this.No!==!0&&y!==!0
+y=z.t(b,"pauseEvent")
+y=F.Wi(this,C.yG,this.Jr,y)
+this.Jr=y
+y=y==null&&z.t(b,"topFrame")!=null
+this.EY=F.Wi(this,C.X8,this.EY,y)
+y=this.Jr==null&&z.t(b,"topFrame")==null
 this.eU=F.Wi(this,C.q2,this.eU,y)
 y=z.t(b,"error")
 this.yv=F.Wi(this,C.YU,this.yv,y)
@@ -14934,50 +15078,50 @@
 "^":"u0g+Pi;",
 $isd3:true},
 iz:{
-"^":"Tp:16;",
-$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
+"^":"Tp:116;",
+$1:[function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
 a.Du=0
 a.fF=0
 a.mM=F.Wi(a,C.eF,a.mM,"")
 a.qH=F.Wi(a,C.uU,a.qH,"")
 J.U2(a.VS)
 J.U2(a.ci)
-J.U2(a.Oo)}},
+J.U2(a.Oo)}},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 oa:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,299,[],"call"],
+z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,538,[],"call"],
 $isEH:true},
 KQ:{
-"^":"Tp:283;a,b",
+"^":"Tp:454;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.ac(z,a)
 if(y.gUm())z.A4.to(this.b,new D.Ai(y))
-return y},"$1",null,2,0,null,282,[],"call"],
+return y},"$1",null,2,0,null,162,[],"call"],
 $isEH:true},
 Ai:{
-"^":"Tp:22;c",
-$0:function(){return this.c},
+"^":"Tp:115;c",
+$0:[function(){return this.c},"$0",null,0,0,null,"call"],
 $isEH:true},
 Qq:{
-"^":"Tp:16;a",
+"^":"Tp:116;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,300,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,539,[],"call"],
 $isEH:true},
 Yn:{
-"^":"Tp:75;",
-$2:[function(a,b){return J.oE(J.O6(a),J.O6(b))},"$2",null,4,0,null,53,[],57,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){return J.oE(J.O6(a),J.O6(b))},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 AP:{
-"^":"Tp:283;a",
+"^":"Tp:454;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.KJ
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,212,[],"call"],
+return y},"$1",null,2,0,null,202,[],"call"],
 $isEH:true},
 SI:{
 "^":"af;RF,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
@@ -15014,13 +15158,13 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 BN:[function(a){var z=this.RF
-return z.BN(z)},"$0","gDx",0,0,126],
+return z.BN(z)},"$0","gDx",0,0,307],
 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)},
-k0:[function(a){return},"$0","gqw",0,0,21],
+k0:[function(a){return},"$0","gqw",0,0,126],
 ni:[function(a){this.RF.AP=null
-return},"$0","gl1",0,0,21],
+return},"$0","gl1",0,0,126],
 gUj:function(a){var z=this.RF
 return z.gUj(z)},
 gnz:function(a){var z,y
@@ -15037,14 +15181,14 @@
 static:{"^":"VZ"}},
 pD:{
 "^":"wVq;J6,LD,jo,Ne,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
-gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
-gFA:[function(a){return this.jo},null,null,1,0,103,"exception",82,83],
-sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,105,27,[],"exception",82],
-gur:[function(){return this.Ne},null,null,1,0,103,"stacktrace",82,83],
-sur:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,105,27,[],"stacktrace",82],
+gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
+gG1:[function(a){return this.LD},null,null,1,0,312,"message",308,309],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",308],
+gFA:[function(a){return this.jo},null,null,1,0,337,"exception",308,309],
+sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,338,30,[],"exception",308],
+gK7:[function(){return this.Ne},null,null,1,0,337,"stacktrace",308,309],
+sK7:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,338,30,[],"stacktrace",308],
 bF:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"kind")
@@ -15065,10 +15209,10 @@
 $isd3:true},
 fJ:{
 "^":"dZL;J6,LD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
-gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
+gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
+gG1:[function(a){return this.LD},null,null,1,0,312,"message",308,309],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",308],
 bF:function(a,b,c){var z,y
 this.kT=!0
 z=J.U6(b)
@@ -15086,12 +15230,12 @@
 $isd3:true},
 hR:{
 "^":"w8F;J6,LD,IV,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
-gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
-gvJ:[function(a){return this.IV},null,null,1,0,22,"response",82,83],
-svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,16,27,[],"response",82],
+gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
+gG1:[function(a){return this.LD},null,null,1,0,312,"message",308,309],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",308],
+gvJ:[function(a){return this.IV},null,null,1,0,115,"response",308,309],
+svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,116,30,[],"response",308],
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
@@ -15109,9 +15253,9 @@
 "^":"af+Pi;",
 $isd3:true},
 U4:{
-"^":["V4b;dj,JJ<-29,XR<-29,DD>-29,Z3<-29,mu<-29,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null],
-gO3:[function(a){return this.dj},null,null,1,0,87,"url",82,83],
-sO3:[function(a,b){this.dj=F.Wi(this,C.Fh,this.dj,b)},null,null,3,0,8,27,[],"url",82],
+"^":["V4b;dj,JJ<-85,XR<-85,DD>-85,Z3<-85,mu<-85,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null],
+gO3:[function(a){return this.dj},null,null,1,0,312,"url",308,309],
+sO3:[function(a,b){this.dj=F.Wi(this,C.Fh,this.dj,b)},null,null,3,0,32,30,[],"url",308],
 gUm:function(){return!0},
 gM8:function(){return!1},
 bF:function(a,b,c){var z,y,x,w
@@ -15156,22 +15300,22 @@
 "^":"af+Pi;",
 $isd3:true},
 c2:{
-"^":["a;Rd<-93,a4>-125",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd<-326,a4>-305",function(){return[C.Nw]},function(){return[C.Nw]}],
 $isc2:true},
 rj:{
-"^":["Zqa;Sw>-29,u9<-29,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
-gVB:[function(){return this.wJ},null,null,1,0,249,"firstTokenPos",82,83],
+"^":["Zqa;Sw>-85,u9<-85,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
+gVB:[function(){return this.wJ},null,null,1,0,487,"firstTokenPos",308,309],
 sVB:[function(a){var z=this.wJ
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Gd,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.wJ=a},null,null,3,0,137,27,[],"firstTokenPos",82],
-gug:[function(){return this.lx},null,null,1,0,249,"lastTokenPos",82,83],
+this.nq(this,z)}this.wJ=a},null,null,3,0,363,30,[],"firstTokenPos",308],
+gug:[function(){return this.lx},null,null,1,0,487,"lastTokenPos",308,309],
 sug:[function(a){var z=this.lx
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.kA,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.lx=a},null,null,3,0,137,27,[],"lastTokenPos",82],
+this.nq(this,z)}this.lx=a},null,null,3,0,363,30,[],"lastTokenPos",308],
 gUm:function(){return!0},
 gM8:function(){return!0},
 rK:function(a){return J.UQ(this.Sw,J.xH(a,1))},
@@ -15254,21 +15398,21 @@
 "^":"a;Yu<,Du<,fF<",
 $isN8:true},
 Z9:{
-"^":["Pi;Yu<,LR<-93,VF<-93,KO<-93,fY>-125,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
-gNl:[function(a){return this.ar},null,null,1,0,271,"script",82,83],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,272,27,[],"script",82],
-gUE:[function(){return this.MT},null,null,1,0,87,"formattedLine",82,83],
-sUE:[function(a){this.MT=F.Wi(this,C.oI,this.MT,a)},null,null,3,0,8,27,[],"formattedLine",82],
+"^":["Pi;Yu<,LR<-326,VF<-326,KO<-326,fY>-305,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
+gNl:[function(a){return this.ar},null,null,1,0,513,"script",308,309],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,514,30,[],"script",308],
+gUE:[function(){return this.MT},null,null,1,0,312,"formattedLine",308,309],
+sUE:[function(a){this.MT=F.Wi(this,C.Zt,this.MT,a)},null,null,3,0,32,30,[],"formattedLine",308],
 c9s:[function(){var z,y
 z=this.LR
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","guV",0,0,87,"formattedDeoptId",82],
+return y.bu(z)},"$0","guV",0,0,312,"formattedDeoptId",308],
 M2Y:[function(){var z,y
 z=this.VF
 y=J.x(z)
 if(y.n(z,-1))return""
-return y.bu(z)},"$0","gZO",0,0,87,"formattedTokenPos",82],
+return y.bu(z)},"$0","gZO",0,0,312,"formattedTokenPos",308],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.fX,this.ar,null)
 z=this.VF
@@ -15277,33 +15421,33 @@
 if(y==null)return
 this.ar=F.Wi(this,C.fX,this.ar,a)
 z=J.nJ(a.rK(y))
-this.MT=F.Wi(this,C.oI,this.MT,z)},
+this.MT=F.Wi(this,C.Zt,this.MT,z)},
 $isZ9:true},
 Q4:{
-"^":["Pi;Yu<-93,Fm<-125,L4<-125,dh,uH@-301,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
-gPO:[function(){return this.dh},null,null,1,0,302,"jumpTarget",82,83],
-sPO:[function(a){var z=this.dh
+"^":["Pi;Yu<-326,Fm<-305,L4<-305,dh,uH@-540,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
+gwi:[function(){return this.dh},null,null,1,0,541,"jumpTarget",308,309],
+swi:[function(a){var z=this.dh
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Qn,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.dh=a},null,null,3,0,303,27,[],"jumpTarget",82],
-gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,126,"isComment",82],
-ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,126,"hasDescriptors",82],
+this.nq(this,z)}this.dh=a},null,null,3,0,542,30,[],"jumpTarget",308],
+gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,307,"isComment",308],
+ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,307,"hasDescriptors",308],
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,87,"formattedAddress",82],
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,312,"formattedAddress",308],
 Io:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
 if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,304,305,[],"formattedInclusive",82],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,543,154,[],"formattedInclusive",308],
 HU:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,304,305,[],"formattedExclusive",82],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,543,154,[],"formattedExclusive",308],
 eQ:function(){var z,y,x,w
 y=J.uH(this.L4," ")
 x=y.length
@@ -15332,18 +15476,18 @@
 this.nq(this,z)}this.dh=u
 return}++w}P.JS("Could not find instruction at "+x.WZ(y,16))},
 $isQ4:true,
-static:{Tn:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"}}},
+static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","I9",4,0,null,118,[],119,[]]}},
 WAE:{
 "^":"a;uX",
 bu:function(a){return this.uX},
-static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:function(a){var z=J.x(a)
+static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.nj
 else if(z.n(a,"Dart"))return C.l8
 else if(z.n(a,"Collected"))return C.WA
 else if(z.n(a,"Reused"))return C.yP
 else if(z.n(a,"Tag"))return C.oA
 N.Jx("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.hS())}}},
+throw H.b(P.hS())},"$1","Ma",2,0,null,94,[]]}},
 Vi:{
 "^":"a;tT>,Av<",
 $isVi:true},
@@ -15351,28 +15495,28 @@
 "^":"a;tT>,Av<,wd>,Jv",
 $ist9:true},
 kx:{
-"^":["D3i;J6,xM,Du@-93,fF@-93,vg@-93,Mb@-93,VS<-29,ci<-29,va<-29,Oo<-29,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,306,"kind",82,83],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,307,27,[],"kind",82],
-glt:[function(){return this.xM},null,null,1,0,249,"totalSamplesInProfile",82,83],
-slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,137,27,[],"totalSamplesInProfile",82],
-gS7:[function(){return this.mM},null,null,1,0,87,"formattedInclusiveTicks",82,83],
-sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,8,27,[],"formattedInclusiveTicks",82],
-gN8:[function(){return this.qH},null,null,1,0,87,"formattedExclusiveTicks",82,83],
-sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,8,27,[],"formattedExclusiveTicks",82],
-gL1E:[function(){return this.Ni},null,null,1,0,103,"objectPool",82,83],
-sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,105,27,[],"objectPool",82],
-gMj:[function(a){return this.MO},null,null,1,0,103,"function",82,83],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,105,27,[],"function",82],
-gNl:[function(a){return this.ar},null,null,1,0,271,"script",82,83],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,272,27,[],"script",82],
-gla:[function(){return this.MH},null,null,1,0,126,"isOptimized",82,83],
-sla:[function(a){this.MH=F.Wi(this,C.FQ,this.MH,a)},null,null,3,0,127,27,[],"isOptimized",82],
+"^":["D3i;J6,xM,Du@-326,fF@-326,vg@-326,Mb@-326,VS<-85,ci<-85,va<-85,Oo<-85,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,544,"kind",308,309],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,545,30,[],"kind",308],
+glt:[function(){return this.xM},null,null,1,0,487,"totalSamplesInProfile",308,309],
+slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,363,30,[],"totalSamplesInProfile",308],
+gS7:[function(){return this.mM},null,null,1,0,312,"formattedInclusiveTicks",308,309],
+sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",308],
+gN8:[function(){return this.qH},null,null,1,0,312,"formattedExclusiveTicks",308,309],
+sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",308],
+gL1E:[function(){return this.Ni},null,null,1,0,337,"objectPool",308,309],
+sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,338,30,[],"objectPool",308],
+gMj:[function(a){return this.MO},null,null,1,0,337,"function",308,309],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,338,30,[],"function",308],
+gNl:[function(a){return this.ar},null,null,1,0,513,"script",308,309],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,514,30,[],"script",308],
+gur:[function(){return this.MH},null,null,1,0,307,"isOptimized",308,309],
+sur:[function(a){this.MH=F.Wi(this,C.FQ,this.MH,a)},null,null,3,0,310,30,[],"isOptimized",308],
 gUm:function(){return!0},
 gM8:function(){return!0},
 tx:[function(a){var z,y
 this.ar=F.Wi(this,C.fX,this.ar,a)
-for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,308,309,[]],
+for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,546,547,[]],
 QW:function(){if(this.ar!=null)return
 if(!J.de(this.J6,C.l8))return
 var z=this.MO
@@ -15417,9 +15561,10 @@
 this.vg=H.BU(z.t(b,"start"),16,null)
 this.Mb=H.BU(z.t(b,"end"),16,null)
 y=this.P3
-x=y.gF1(y).Zr(z.t(b,"function"))
+y=y.gF1(y)
+x=y.Zr(z.t(b,"function"))
 this.MO=F.Wi(this,C.nf,this.MO,x)
-y=y.gF1(y).Zr(z.t(b,"object_pool"))
+y=y.Zr(z.t(b,"object_pool"))
 this.Ni=F.Wi(this,C.xG,this.Ni,y)
 w=z.t(b,"disassembly")
 if(w!=null)this.xs(w)
@@ -15430,8 +15575,8 @@
 this.kT=!J.de(y.gB(z),0)||!J.de(this.J6,C.l8)
 z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
 this.TD=F.Wi(this,C.zS,this.TD,z)},
-gvS:[function(){return this.TD},null,null,1,0,126,"hasDisassembly",82,83],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,127,27,[],"hasDisassembly",82],
+gvS:[function(){return this.TD},null,null,1,0,307,"hasDisassembly",308,309],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,310,30,[],"hasDisassembly",308],
 xs:function(a){var z,y,x,w,v,u,t,s,r
 z=this.va
 y=J.w1(z)
@@ -15476,43 +15621,43 @@
 w+=3}},
 tg:function(a,b){J.J5(b,this.vg)
 return!1},
-gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,126,"isDartCode",82],
+gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,307,"isDartCode",308],
 $iskx:true,
-static:{Vb:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"}}},
+static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","Mr",4,0,null,118,[],119,[]]}},
 D3i:{
 "^":"af+Pi;",
 $isd3:true},
 Em:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z,y
 z=this.a
 y=J.UQ(z.MO,"script")
 if(y==null)return
-J.SK(y).ml(z.gKn())},"$1",null,2,0,null,310,[],"call"],
+J.SK(y).ml(z.gKn())},"$1",null,2,0,null,548,[],"call"],
 $isEH:true},
 fx:{
-"^":"Tp:75;",
-$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,53,[],57,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 UZ:{
-"^":"Tp:75;a,b",
-$2:function(a,b){var z,y
+"^":"Tp:300;a,b",
+$2:[function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
 if(y&&D.D5(b))this.a.u(0,a,this.b.Zr(b))
 else if(!!z.$iswn)D.f3(b,this.b)
-else if(y)D.Gf(b,this.b)},
+else if(y)D.Gf(b,this.b)},"$2",null,4,0,null,376,[],122,[],"call"],
 $isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
 "^":"",
 zMr:{
-"^":["V27;jA%-311,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.jA},null,null,1,0,312,"error",82,104],
-skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,313,27,[],"error",82],
+"^":["V31;jA%-549,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.jA},null,null,1,0,550,"error",308,311],
+skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,551,30,[],"error",308],
 "@":function(){return[C.uvO]},
 static:{hp:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15520,21 +15665,21 @@
 a.X0=w
 C.SX.ZL(a)
 C.SX.oX(a)
-return a},null,null,0,0,22,"new ServiceErrorViewElement$created"]}},
-"+ServiceErrorViewElement":[314],
-V27:{
+return a},null,null,0,0,115,"new ServiceErrorViewElement$created"]}},
+"+ServiceErrorViewElement":[552],
+V31:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
 "^":"",
 nk:{
-"^":["V28;Xc%-315,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFA:[function(a){return a.Xc},null,null,1,0,316,"exception",82,104],
-sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,317,27,[],"exception",82],
+"^":["V32;Xc%-553,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFA:[function(a){return a.Xc},null,null,1,0,554,"exception",308,311],
+sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,555,30,[],"exception",308],
 "@":function(){return[C.vr3]},
 static:{dS:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15542,30 +15687,30 @@
 a.X0=w
 C.Vd.ZL(a)
 C.Vd.oX(a)
-return a},null,null,0,0,22,"new ServiceExceptionViewElement$created"]}},
-"+ServiceExceptionViewElement":[318],
-V28:{
+return a},null,null,0,0,115,"new ServiceExceptionViewElement$created"]}},
+"+ServiceExceptionViewElement":[556],
+V32:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
 XK:{
-"^":"H6;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+"^":"zM;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
 z6:function(a,b){var z
 N.Jx("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
 z=this.Jf
 if(typeof z!=="string")return z.g()
-return W.Kn(J.WB(z,b),null,null).OA(new U.dT())},
+return W.It(J.WB(z,b),null,null).OA(new U.dT())},
 SC:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
 dT:{
-"^":"Tp:16;",
+"^":"Tp:116;",
 $1:[function(a){var z
 N.Jx("").hh("HttpRequest.getString failed.")
 z=J.RE(a)
 z.gN(a)
-return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,30,[],"call"],
+return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,171,[],"call"],
 $isEH:true},
 ho:{
-"^":"H6;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+"^":"zM;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
 q3:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -15575,7 +15720,7 @@
 z=this.ja
 v=z.t(0,y)
 z.Rz(0,y)
-J.Xf(v,w)},"$1","gVx",2,0,26,319,[]],
+J.Xf(v,w)},"$1","gVx",2,0,169,22,[]],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -15591,9 +15736,9 @@
 N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 ob:{
-"^":["V29;mC%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gWA:[function(a){return a.mC},null,null,1,0,85,"object",82,104],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,86,27,[],"object",82],
+"^":["V33;mC%-341,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gWA:[function(a){return a.mC},null,null,1,0,320,"object",308,311],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,321,30,[],"object",308],
 hu:[function(a){var z
 switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
 J.CJ(z,a.mC)
@@ -15648,7 +15793,7 @@
 return z
 default:z=W.r3("json-view",null)
 J.wD(z,a.mC)
-return z}},"$0","gbs",0,0,320,"_constructElementForObject"],
+return z}},"$0","gbs",0,0,557,"_constructElementForObject"],
 xJ:[function(a,b){var z,y,x
 this.pj(a)
 z=a.mC
@@ -15657,12 +15802,12 @@
 x=this.hu(a)
 if(x==null){N.Jx("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,16,65,[],"objectChanged"],
+N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,116,242,[],"objectChanged"],
 "@":function(){return[C.Tl]},
-static:{zy:[function(a){var z,y,x,w
+static:{lv:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15670,40 +15815,40 @@
 a.X0=w
 C.ZO.ZL(a)
 C.ZO.oX(a)
-return a},null,null,0,0,22,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[321],
-V29:{
+return a},null,null,0,0,115,"new ServiceObjectViewElement$created"]}},
+"+ServiceObjectViewElement":[558],
+V33:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["Vfx;tY%-108,Pe%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gnv:[function(a){return a.tY},null,null,1,0,85,"ref",82,104],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,86,27,[],"ref",82],
-gjT:[function(a){return a.Pe},null,null,1,0,126,"internal",82,104],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,127,27,[],"internal",82],
+"^":["Vfx;tY%-341,Pe%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gnv:[function(a){return a.tY},null,null,1,0,320,"ref",308,311],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,321,30,[],"ref",308],
+gjT:[function(a){return a.Pe},null,null,1,0,307,"internal",308,311],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,310,30,[],"internal",308],
 P9:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
 this.ct(a,C.KG,0,1)
-this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,26,65,[],"refChanged"],
+this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,169,242,[],"refChanged"],
 gO3:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,87,"url"],
+return z.gHP()},null,null,1,0,312,"url"],
 gOL:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,87,"serviceId"],
+return J.F8(z)},null,null,1,0,312,"serviceId"],
 gD5:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,87,"hoverText"],
+return z.gzz()},null,null,1,0,312,"hoverText"],
 goc:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,87,"name"],
-gRw:[function(a){return J.FN(this.goc(a))},null,null,1,0,126,"nameIsEmpty"],
+return J.O6(z)},null,null,1,0,312,"name"],
+gRw:[function(a){return J.FN(this.goc(a))},null,null,1,0,307,"nameIsEmpty"],
 "@":function(){return[C.JD]},
 static:{lK:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -15712,27 +15857,27 @@
 a.X0=w
 C.wU.ZL(a)
 C.wU.oX(a)
-return a},null,null,0,0,22,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[322],
+return a},null,null,0,0,115,"new ServiceRefElement$created"]}},
+"+ServiceRefElement":[559],
 Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
 "^":"",
 Uj:{
-"^":["Bc;kF%-109,IK%-125,Qt%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gTq:[function(a){return a.kF},null,null,1,0,126,"checked",82,104],
-sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,127,27,[],"checked",82],
-gEu:[function(a){return a.IK},null,null,1,0,87,"checkedText",82,104],
-sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,8,27,[],"checkedText",82],
-gRY:[function(a){return a.Qt},null,null,1,0,87,"uncheckedText",82,104],
-sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,8,27,[],"uncheckedText",82],
+"^":["LPc;kF%-304,IK%-305,No%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gTq:[function(a){return a.kF},null,null,1,0,307,"checked",308,311],
+sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,310,30,[],"checked",308],
+gEu:[function(a){return a.IK},null,null,1,0,312,"checkedText",308,311],
+sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",308],
+gRY:[function(a){return a.No},null,null,1,0,312,"uncheckedText",308,311],
+sRY:[function(a,b){a.No=this.ct(a,C.WY,a.No,b)},null,null,3,0,32,30,[],"uncheckedText",308],
 RC:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,120,7,[],323,[],119,[],"change"],
+a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,350,21,[],560,[],82,[],"change"],
 "@":function(){return[C.mS]},
 static:{Al:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15740,21 +15885,21 @@
 a.X0=w
 C.fA.ZL(a)
 C.fA.oX(a)
-return a},null,null,0,0,22,"new SlidingCheckboxElement$created"]}},
-"+SlidingCheckboxElement":[324],
-Bc:{
+return a},null,null,0,0,115,"new SlidingCheckboxElement$created"]}},
+"+SlidingCheckboxElement":[561],
+LPc:{
 "^":"xc+Pi;",
 $isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 xT:{
-"^":["V30;rd%-325,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.rd},null,null,1,0,288,"frame",82,104],
-sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,283,27,[],"frame",82],
+"^":["V34;rd%-451,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.rd},null,null,1,0,453,"frame",308,311],
+sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,454,30,[],"frame",308],
 "@":function(){return[C.Xv]},
 static:{an:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15762,22 +15907,22 @@
 a.X0=w
 C.dX.ZL(a)
 C.dX.oX(a)
-return a},null,null,0,0,22,"new StackFrameElement$created"]}},
-"+StackFrameElement":[326],
-V30:{
+return a},null,null,0,0,115,"new StackFrameElement$created"]}},
+"+StackFrameElement":[562],
+V34:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 uwf:{
-"^":["V31;B3%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtN:[function(a){return a.B3},null,null,1,0,103,"trace",82,104],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,105,27,[],"trace",82],
-pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"^":["V35;B3%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtN:[function(a){return a.B3},null,null,1,0,337,"trace",308,311],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,338,30,[],"trace",308],
+pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 "@":function(){return[C.js]},
 static:{bV:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15785,18 +15930,18 @@
 a.X0=w
 C.bg.ZL(a)
 C.bg.oX(a)
-return a},null,null,0,0,22,"new StackTraceElement$created"]}},
-"+StackTraceElement":[327],
-V31:{
+return a},null,null,0,0,115,"new StackTraceElement$created"]}},
+"+StackTraceElement":[563],
+V35:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
-IP:function(a){var z=J.x(a)
+IP:[function(a){var z=J.x(a)
 if(!!z.$isQl)return C.i3.f0(a)
 switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
 case"radio":case"select-multiple":case"select-one":return z.gi9(a)
-default:return z.gLm(a)}},
-iX:function(a,b){var z,y,x,w,v,u,t,s
+default:return z.gLm(a)}},"$1","tF",2,0,null,142,[]],
+iX:[function(a,b){var z,y,x,w,v,u,t,s
 z=M.pN(a,b)
 y=J.x(a)
 if(!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
@@ -15807,8 +15952,8 @@
 if(s==null)continue
 if(u==null)u=P.Py(null,null,null,null,null)
 u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.K6(z,u,w,t)},
-HP:function(a,b,c,d,e){var z,y,x
+return new M.K6(z,u,w,t)},"$2","Nc",4,0,null,273,[],291,[]],
+HP:[function(a,b,c,d,e){var z,y,x
 if(b==null)return
 if(b.gN2()!=null){z=b.gN2()
 M.Ky(a).wh(z)
@@ -15817,17 +15962,17 @@
 if(z.gwd(b)==null)return
 y=b.gTe()-a.childNodes.length
 for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},
-bM:function(a){var z
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"$5","K4",10,0,null,273,[],162,[],292,[],291,[],293,[]],
+bM:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
 if(!!z.$isYN||!!z.$isI0||!!z.$ishy)return a
-return},
-pN:function(a,b){var z,y
+return},"$1","ay",2,0,null,273,[]],
+pN:[function(a,b){var z,y
 z=J.x(a)
 if(!!z.$iscv)return M.F5(a,b)
 if(!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},
-F5:function(a,b){var z,y,x
+if(y!=null)return["text",y]}return},"$2","vw",4,0,null,273,[],291,[]],
+F5:[function(a,b){var z,y,x
 z={}
 z.a=null
 z.b=!1
@@ -15837,8 +15982,8 @@
 if(y==null){x=[]
 z.a=x
 y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},
-Iu:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
+y.push(M.F4("{{}}","bind",a,b))}return z.a},"$2","OT",4,0,null,142,[],291,[]],
+Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 for(z=J.U6(a),y=d!=null,x=!!J.x(b).$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
 u=z.t(a,w+1)
 t=u.gEJ()
@@ -15867,8 +16012,8 @@
 t.push(L.Sk(j,l,null))}o.wE(0)
 p=o
 s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},
-F4:function(a,b,c,d){var z,y,x,w,v,u,t,s
+if(y)d.push(i)}},"$4","NJ",6,2,null,85,298,[],273,[],292,[],293,[]],
+F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s
 z=a.length
 if(z===0)return
 for(y=d==null,x=J.U6(a),w=null,v=0;v<z;){u=x.XU(a,"{{",v)
@@ -15883,14 +16028,14 @@
 v=t+2}if(v===z)w.push("")
 z=new M.HS(w,null)
 z.Yn(w)
-return z},
-SH:function(a,b){var z,y
+return z},"$4","jF",8,0,null,94,[],12,[],273,[],291,[]],
+SH:[function(a,b){var z,y
 z=a.firstChild
 if(z==null)return
 y=new M.yp(z,a.lastChild,b)
 for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},
-Ky:function(a){var z,y,x,w
+z=z.nextSibling}},"$2","St",4,0,null,220,[],292,[]],
+Ky:[function(a){var z,y,x,w
 z=$.rw()
 z.toString
 y=H.VK(a,"expando$values")
@@ -15904,12 +16049,12 @@
 else w=!0
 x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
 z.u(0,a,x)
-return x},
-wR:function(a){var z=J.x(a)
+return x},"$1","La",2,0,null,273,[]],
+wR:[function(a){var z=J.x(a)
 if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
 else z=!0
 else z=!1
-return z},
+return z},"$1","xS",2,0,null,211,[]],
 V2:{
 "^":"TU;N1,mD,Ck",
 Z1:function(a,b,c,d){var z,y,x,w,v
@@ -15958,8 +16103,8 @@
 this.Ca.ed()
 X.TR.prototype.cO.call(this,this)}},
 DO:{
-"^":"Tp:22;",
-$0:function(){var z,y,x,w,v
+"^":"Tp:115;",
+$0:[function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
 y.st5(z,"checkbox")
@@ -15972,15 +16117,15 @@
 v=document.createEvent("MouseEvent")
 J.e2(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
 z.dispatchEvent(v)
-return x.length===1?C.mt:C.Nm.gtH(x)},
+return x.length===1?C.mt:C.Nm.gtH(x)},"$0",null,0,0,null,"call"],
 $isEH:true},
 fTP:{
-"^":"Tp:16;a",
-$1:[function(a){this.a.push(C.T1)},"$1",null,2,0,null,7,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){this.a.push(C.pi)},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ppY:{
-"^":"Tp:16;b",
-$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,7,[],"call"],
+"^":"Tp:116;b",
+$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 NP:{
 "^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
@@ -15989,8 +16134,8 @@
 J.ta(z,a==null?"":H.d(a))},
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"$1","gqf",2,0,26,7,[]]},
-Vh:{
+O.Y3()},"$1","gqf",2,0,169,21,[]]},
+jt:{
 "^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
 EC:function(a){var z=X.TR.prototype.gH.call(this)
@@ -16000,8 +16145,8 @@
 J.ta(this.xS,z)
 if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
 x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
-if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,26,7,[]],
-static:{kv:function(a){var z,y,x
+if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,169,21,[]],
+static:{kv:[function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
 z.toString
@@ -16009,10 +16154,10 @@
 return z.ev(z,new M.r0(a))}else{y=M.bM(a)
 if(y==null)return C.xD
 x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.jz(a))}}}},
+return x.ev(x,new M.jz(a))}},"$1","VE",2,0,null,142,[]]}},
 r0:{
-"^":"Tp:16;a",
-$1:function(a){var z,y
+"^":"Tp:116;a",
+$1:[function(a){var z,y
 z=this.a
 y=J.x(a)
 if(!y.n(a,z))if(!!y.$isMi)if(a.type==="radio"){y=a.name
@@ -16020,12 +16165,12 @@
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},
+return z},"$1",null,2,0,null,295,[],"call"],
 $isEH:true},
 jz:{
-"^":"Tp:16;b",
-$1:function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},
+"^":"Tp:116;b",
+$1:[function(a){var z=J.x(a)
+return!z.n(a,this.b)&&z.gMB(a)==null},"$1",null,2,0,null,295,[],"call"],
 $isEH:true},
 SA:{
 "^":"b2i;Dh,Ca,qP,ZY,xS,PB,eS,ay",
@@ -16054,18 +16199,18 @@
 y=J.x(z)
 if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"$1","gqf",2,0,26,7,[]],
+J.ta(this.xS,z)}},"$1","gqf",2,0,169,21,[]],
 $isSA:true,
-static:{qb:function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
-return typeof a==="number"&&Math.floor(a)===a?a:0}}},
+static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
+return typeof a==="number"&&Math.floor(a)===a?a:0},"$1","v7",2,0,null,30,[]]}},
 hB:{
-"^":"Tp:75;a",
+"^":"Tp:300;a",
 $2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,231,[],328,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,28,[],564,[],"call"],
 $isEH:true},
 nv:{
-"^":"Tp:16;",
-$1:function(a){return 0},
+"^":"Tp:116;",
+$1:[function(a){return 0},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 ee:{
 "^":"V2;N1,mD,Ck",
@@ -16073,7 +16218,8 @@
 Z1:function(a,b,c,d){var z,y,x
 z=J.x(b)
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
+y=this.gN1()
+J.MV(!!J.x(y).$isTU?y:this,b)
 J.Vs(this.N1).Rz(0,b)
 y=this.gCd(this)
 if(z.n(b,"value")){z=this.N1
@@ -16083,7 +16229,7 @@
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}else{z=this.N1
 x=d!=null?d:""
-x=new M.Vh(null,z,c,null,null,"checked",x)
+x=new M.jt(null,z,c,null,null,"checked",x)
 x.Og(z,"checked",c,d)
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}y.u(0,b,z)
@@ -16105,9 +16251,10 @@
 for(z=this.gCd(this),z=z.gUQ(z),z=P.F(z,!0,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!=null)J.wC(y)}this.mD=null},
 gCd:function(a){var z=this.mD
-if(z==null){z=P.L5(null,null,null,P.qU,X.TR)
+if(z==null){z=P.L5(null,null,null,J.O,X.TR)
 this.mD=z}return z},
-glN:function(){return!!J.x(this.gN1()).$isTU?this.gN1():this},
+glN:function(){var z=this.gN1()
+return!!J.x(z).$isTU?z:this},
 $isTU:true},
 yp:{
 "^":"a;rg,Ug,k8<"},
@@ -16118,7 +16265,8 @@
 if(J.de(b,"selectedindex"))b="selectedIndex"
 z=J.x(b)
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
+z=this.gN1()
+J.MV(!!J.x(z).$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
 y=this.N1
@@ -16241,7 +16389,7 @@
 return!0},
 Sy:function(){return this.wh(null)},
 $isDT:true,
-static:{"^":"mn,EW,Sf,To",Fz:function(a,b){var z,y,x
+static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
 z=J.Lh(b,a,!1)
 y=J.x(z)
 if(!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
@@ -16249,13 +16397,13 @@
 else y=!1
 if(y)return z
 for(x=J.Q8(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},TA:function(a){var z,y,x,w
+return z},"$2","Tkw",4,0,null,273,[],294,[]],TA:[function(a){var z,y,x,w
 z=J.VN(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
 if(y==null){y=z.implementation.createHTMLDocument("")
 for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},eX:function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"$1","lA",2,0,null,270,[]],eX:[function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gKV(a).insertBefore(y,a)
@@ -16269,25 +16417,25 @@
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
-break}}return y},KE:function(a,b,c){var z,y,x,w
+break}}return y},"$1","Bw",2,0,null,295,[]],KE:[function(a,b,c){var z,y,x,w
 z=J.G6(a)
 if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},GM:function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},"$3","BZ",6,0,null,270,[],295,[],296,[]],GM:[function(a){var z,y
 z=new M.OB()
 y=J.MK(a,$.cz())
 if(M.wR(a))z.$1(a)
-y.aN(y,z)},oR:function(){if($.To===!0)return
+y.aN(y,z)},"$1","DR",2,0,null,297,[]],oR:[function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
 J.c9(z,H.d($.cz())+" { display: none; }")
-document.head.appendChild(z)}}},
+document.head.appendChild(z)},"$0","Lv",0,0,null]}},
 OB:{
-"^":"Tp:26;",
-$1:function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},
+"^":"Tp:169;",
+$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},"$1",null,2,0,null,270,[],"call"],
 $isEH:true},
 lP:{
-"^":"Tp:16;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,158,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,376,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
@@ -16307,8 +16455,8 @@
 this.ud=null},
 $isTR:true},
 NW:{
-"^":"Tp:75;a,b,c,d",
-$2:function(a,b){var z,y,x,w
+"^":"Tp:300;a,b,c,d",
+$2:[function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)if(z.n(a,"if")){this.a.b=!0
 if(b==="")b="{{}}"}else if(z.n(a,"bind")||z.n(a,"repeat")){this.a.c=!0
@@ -16319,7 +16467,7 @@
 z.a=w
 z=w}else z=x
 z.push(a)
-z.push(y)}},
+z.push(y)}},"$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 HS:{
 "^":"a;EJ<,PU",
@@ -16338,7 +16486,7 @@
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"$1","gBg",2,0,329,27,[]],
+return y+H.d(z[3])},"$1","gBg",2,0,565,30,[]],
 DJ:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
@@ -16348,7 +16496,7 @@
 u=w+2
 if(u>=z.length)return H.e(z,u)
 t=z[u]
-y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,330,331,[]],
+y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,566,567,[]],
 Yn:function(a){this.PU=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
 "^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -16369,12 +16517,12 @@
 u=this.eD
 v.push(L.Sk(z,u,null))
 w.wE(0)}this.FS=w.gUj(w).yI(new M.R7(this))
-this.Az(w.gP(w))},"$0","gjM",0,0,22],
+this.Az(w.gP(w))},"$0","gjM",0,0,115],
 Az:function(a){var z,y,x,w
 z=this.xG
 this.Gb()
 y=J.x(a)
-if(!!y.$iszM){this.xG=a
+if(!!y.$isList){this.xG=a
 x=a}else if(!!y.$isQV){x=y.br(a)
 this.xG=x}else{this.xG=null
 x=null}if(x!=null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
@@ -16449,7 +16597,7 @@
 k=null}else{m=[]
 if(this.DO!=null)o=this.Mv(o)
 k=o!=null?z.a5(o,x,m):null
-l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,332,333,[]],
+l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,568,264,[]],
 uS:function(a){var z
 for(z=J.GP(a);z.G();)J.wC(z.gl())},
 Gb:function(){var z=this.IY
@@ -16466,21 +16614,21 @@
 this.FS=null}this.e9.kr=null
 this.pq=!0}},
 VU:{
-"^":"Tp:16;",
-$1:[function(a){return[a]},"$1",null,2,0,null,231,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){return[a]},"$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:334;a",
+"^":"Tp:569;a",
 $1:[function(a){var z,y,x
 z=J.U6(a)
 y=z.t(a,0)
 x=z.t(a,1)
 if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"$1",null,2,0,null,331,[],"call"],
+return this.a?y:[y]},"$1",null,2,0,null,567,[],"call"],
 $isEH:true},
 R7:{
-"^":"Tp:16;b",
-$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,128,[],"call"],
+"^":"Tp:116;b",
+$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,353,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
@@ -16506,7 +16654,8 @@
 gN1:function(){return this.N1},
 Z1:function(a,b,c,d){var z,y,x
 if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
+z=this.gN1()
+J.MV(!!J.x(z).$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
 y=this.N1
@@ -16544,18 +16693,18 @@
 this.EC(J.Vm(this.xS))},
 $isTR:true},
 VD:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,128,[],"call"],
+return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,353,[],"call"],
 $isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
 "^":"",
 I5:{
-"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.Ye]},
 static:{cF:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -16564,21 +16713,21 @@
 a.X0=w
 C.V8.ZL(a)
 C.V8.oX(a)
-return a},null,null,0,0,22,"new VMRefElement$created"]}},
-"+VMRefElement":[110]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
+return a},null,null,0,0,115,"new VMRefElement$created"]}},
+"+VMRefElement":[342]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
 "^":"",
-SC:{
-"^":["V32;ID%-80,lc%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzf:[function(a){return a.ID},null,null,1,0,281,"vm",82,104],
-szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,336,27,[],"vm",82],
-gkc:[function(a){return a.lc},null,null,1,0,297,"error",82,104],
-skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,298,27,[],"error",82],
-pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+en:{
+"^":["V36;ID%-317,lc%-570,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzf:[function(a){return a.ID},null,null,1,0,522,"vm",308,311],
+szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,571,30,[],"vm",308],
+gkc:[function(a){return a.lc},null,null,1,0,536,"error",308,311],
+skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,537,30,[],"error",308],
+pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 "@":function(){return[C.Hk]},
 static:{oH:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -16586,28 +16735,34 @@
 a.X0=w
 C.nt.ZL(a)
 C.nt.oX(a)
-return a},null,null,0,0,22,"new VMViewElement$created"]}},
-"+VMViewElement":[337],
-V32:{
+return a},null,null,0,0,115,"new VMViewElement$created"]}},
+"+VMViewElement":[572],
+V36:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
-P.qU.$isqU=true
-P.qU.$isTx=true
-P.qU.$asTx=[P.qU]
-P.qU.$isa=true
-P.lf.$isTx=true
-P.lf.$asTx=[P.lf]
-P.lf.$isa=true
-P.KN.$isKN=true
-P.KN.$isTx=true
-P.KN.$asTx=[P.lf]
-P.KN.$isa=true
-P.CP.$isCP=true
-P.CP.$isTx=true
-P.CP.$asTx=[P.lf]
-P.CP.$isa=true
+J.O.$isString=true
+J.O.$isTx=true
+J.O.$asTx=[J.O]
+J.O.$isa=true
+J.P.$isTx=true
+J.P.$asTx=[J.P]
+J.P.$isa=true
+J.bU.$isint=true
+J.bU.$isTx=true
+J.bU.$asTx=[J.P]
+J.bU.$isTx=true
+J.bU.$asTx=[J.P]
+J.bU.$isTx=true
+J.bU.$asTx=[J.P]
+J.bU.$isa=true
+J.Pp.$isdouble=true
+J.Pp.$isTx=true
+J.Pp.$asTx=[J.P]
+J.Pp.$isTx=true
+J.Pp.$asTx=[J.P]
+J.Pp.$isa=true
 W.KV.$isKV=true
 W.KV.$isD0=true
 W.KV.$isa=true
@@ -16621,9 +16776,9 @@
 P.a6.$isTx=true
 P.a6.$asTx=[P.a6]
 P.a6.$isa=true
-P.zM.$iszM=true
-P.zM.$isQV=true
-P.zM.$isa=true
+J.Q.$isList=true
+J.Q.$isQV=true
+J.Q.$isa=true
 P.Od.$isa=true
 P.a.$isa=true
 W.cv.$iscv=true
@@ -16663,8 +16818,8 @@
 P.wv.$isa=true
 T.yj.$isyj=true
 T.yj.$isa=true
-P.a2.$isa2=true
-P.a2.$isa=true
+J.kn.$isbool=true
+J.kn.$isa=true
 W.OJ.$isea=true
 W.OJ.$isa=true
 A.XP.$isXP=true
@@ -16713,9 +16868,9 @@
 W.ea.$isa=true
 P.qh.$isqh=true
 P.qh.$isa=true
-W.Aj.$isAj=true
-W.Aj.$isea=true
-W.Aj.$isa=true
+W.Wp.$isWp=true
+W.Wp.$isea=true
+W.Wp.$isa=true
 G.DA.$isDA=true
 G.DA.$isa=true
 M.Ya.$isa=true
@@ -16823,14 +16978,14 @@
 P.QV.$isa=true
 P.nP.$isnP=true
 P.nP.$isa=true
+P.b8.$isb8=true
+P.b8.$isa=true
 P.iP.$isiP=true
 P.iP.$isTx=true
 P.iP.$asTx=[null]
 P.iP.$isa=true
 P.fIm.$isfIm=true
 P.fIm.$isa=true
-P.b8.$isb8=true
-P.b8.$isa=true
 O.Qb.$isQb=true
 O.Qb.$isa=true
 D.fJ.$isfJ=true
@@ -16869,10 +17024,10 @@
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
 return J.ks(a)}
-J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
+J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.bU.prototype
 return J.Pp.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.Jh.prototype
-if(typeof a=="boolean")return J.yEe.prototype
+if(typeof a=="boolean")return J.kn.prototype
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
@@ -16894,6 +17049,7 @@
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EY=function(a,b){return J.RE(a).od(a,b)}
 J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
+J.Eh=function(a,b){return J.Wx(a).O(a,b)}
 J.Ew=function(a){return J.RE(a).gSw(a)}
 J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
 J.F6=function(a,b){return J.RE(a).stD(a,b)}
@@ -16936,6 +17092,7 @@
 J.MQ=function(a){return J.w1(a).grZ(a)}
 J.MV=function(a,b){return J.RE(a).Ih(a,b)}
 J.Mu=function(a,b){return J.RE(a).sig(a,b)}
+J.Mv=function(a){return J.RE(a).ghw(a)}
 J.Mz=function(a){return J.rY(a).hc(a)}
 J.NI=function(a){return J.RE(a).gBb(a)}
 J.Nf=function(a,b){return J.RE(a).syw(a,b)}
@@ -16944,11 +17101,11 @@
 J.No=function(a,b){return J.RE(a).sR(a,b)}
 J.O2=function(a,b){return J.RE(a).Ch(a,b)}
 J.O6=function(a){return J.RE(a).goc(a)}
+J.OBt=function(a){return J.RE(a).gfg(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
 J.OS=function(a,b){return J.w1(a).tt(a,b)}
 J.Or=function(a){return J.RE(a).yx(a)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
-J.Pz=function(a,b){return J.RE(a).szZ(a,b)}
 J.Q5=function(a){return J.RE(a).gwl(a)}
 J.Q8=function(a){return J.RE(a).gp8(a)}
 J.QC=function(a){return J.w1(a).wg(a)}
@@ -16989,6 +17146,7 @@
 J.Xf=function(a,b){return J.RE(a).oo(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
 J.Y8=function(a,b,c){return J.w1(a).UZ(a,b,c)}
+J.YD=function(a){return J.RE(a).gR(a)}
 J.YP=function(a){return J.RE(a).gQ7(a)}
 J.YV=function(a){return J.RE(a).goE(a)}
 J.Yl=function(a){return J.w1(a).np(a)}
@@ -17000,11 +17158,11 @@
 J.aK=function(a,b,c){return J.U6(a).XU(a,b,c)}
 J.ak=function(a){return J.RE(a).gNF(a)}
 J.am=function(a){return J.RE(a).VD(a)}
+J.bB=function(a){return J.x(a).gbx(a)}
 J.bY=function(a,b){return J.Wx(a).Y(a,b)}
 J.bd=function(a,b){return J.RE(a).sBu(a,b)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
 J.bs=function(a){return J.RE(a).JP(a)}
-J.c1=function(a,b){return J.Wx(a).O(a,b)}
 J.c9=function(a,b){return J.RE(a).sa4(a,b)}
 J.cG=function(a){return J.RE(a).Ki(a)}
 J.cR=function(a,b){return J.Wx(a).WZ(a,b)}
@@ -17017,20 +17175,20 @@
 J.dk=function(a,b){return J.RE(a).sMj(a,b)}
 J.e2=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
 J.eI=function(a,b){return J.RE(a).bA(a,b)}
-J.eY=function(a){return J.RE(a).gR(a)}
 J.f5=function(a){return J.RE(a).gI(a)}
 J.fH=function(a,b){return J.RE(a).stT(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.fi=function(a,b){return J.RE(a).ps(a,b)}
 J.i4=function(a,b){return J.w1(a).Zv(a,b)}
+J.iF=function(a,b){return J.RE(a).szZ(a,b)}
 J.iS=function(a){return J.RE(a).gox(a)}
 J.iZ=function(a){return J.RE(a).gzZ(a)}
+J.ja=function(a,b){return J.w1(a).Vr(a,b)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
 J.kE=function(a,b){return J.U6(a).tg(a,b)}
 J.kH=function(a,b){return J.w1(a).aN(a,b)}
 J.kW=function(a,b,c){if((a.constructor==Array||H.wV(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
 return J.w1(a).u(a,b,c)}
-J.kd=function(a){return J.RE(a).gfg(a)}
 J.kl=function(a,b){return J.w1(a).ez(a,b)}
 J.kq=function(a,b){return J.RE(a).sF1(a,b)}
 J.ky=function(a,b,c){return J.RE(a).dR(a,b,c)}
@@ -17040,7 +17198,6 @@
 J.m4=function(a){return J.RE(a).gig(a)}
 J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
 return J.Wx(a).i(a,b)}
-J.nG=function(a,b){return J.RE(a).vV(a,b)}
 J.nJ=function(a){return J.RE(a).ga4(a)}
 J.oE=function(a,b){return J.Qc(a).iM(a,b)}
 J.oJ=function(a,b){return J.RE(a).srs(a,b)}
@@ -17048,13 +17205,13 @@
 J.on=function(a){return J.RE(a).gtT(a)}
 J.pO=function(a){return J.U6(a).gor(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
-J.pb=function(a,b){return J.w1(a).Vr(a,b)}
 J.pe=function(a,b){return J.RE(a).pr(a,b)}
 J.q8=function(a){return J.U6(a).gB(a)}
 J.qA=function(a){return J.w1(a).br(a)}
 J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.qK=function(a,b){return J.RE(a).aJ(a,b)}
 J.qd=function(a,b,c,d){return J.RE(a).aC(a,b,c,d)}
+J.qz=function(a){return J.RE(a).gPw(a)}
 J.r4=function(a){return J.RE(a).pj(a)}
 J.rK=function(a,b){return J.RE(a).szf(a,b)}
 J.rP=function(a,b){return J.RE(a).sTq(a,b)}
@@ -17087,6 +17244,7 @@
 J.xR=function(a){return J.RE(a).ghf(a)}
 J.xq=function(a){return J.RE(a).gUj(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
+J.yn=function(a,b){return J.RE(a).vV(a,b)}
 J.yxg=function(a){return J.RE(a).gGd(a)}
 J.z2=function(a){return J.RE(a).gG1(a)}
 J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
@@ -17094,16 +17252,17 @@
 J.zH=function(a){return J.RE(a).gt5(a)}
 J.zJ=function(a){return J.RE(a).aA(a)}
 J.zj=function(a){return J.RE(a).gvH(a)}
+C.Uy=X.hV.prototype
 C.J0=B.pz.prototype
 C.ae=A.iL.prototype
 C.oq=Q.Tg.prototype
 C.ka=Z.Jc.prototype
 C.IK=O.CN.prototype
-C.YD=F.Be.prototype
+C.ux=F.Be.prototype
 C.j8=R.i6.prototype
 C.O0=R.lw.prototype
 C.OD=F.Ir.prototype
-C.Gh=L.bf.prototype
+C.Gh=L.rm.prototype
 C.UF=R.Lt.prototype
 C.MC=D.UL.prototype
 C.LT=A.jM.prototype
@@ -17114,19 +17273,23 @@
 C.W3=W.zU.prototype
 C.cp=B.pR.prototype
 C.pU=Z.hx.prototype
-C.RR=A.Mv.prototype
+C.wQ=D.YA.prototype
+C.rC=D.Yj.prototype
+C.RR=A.flR.prototype
 C.kS=X.E7.prototype
 C.LN=N.oO.prototype
+C.F2=D.IWF.prototype
+C.kd=D.Oz.prototype
 C.Qt=D.Stq.prototype
 C.Xe=L.qkb.prototype
 C.Nm=J.Q.prototype
 C.ON=J.Pp.prototype
-C.jn=J.imn.prototype
+C.jn=J.bU.prototype
 C.jN=J.Jh.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
 C.Yt=Z.vj.prototype
-C.ct=A.Zt.prototype
+C.ct=A.oM.prototype
 C.Z3=R.LU.prototype
 C.MG=M.KL.prototype
 C.S2=W.H9.prototype
@@ -17141,8 +17304,8 @@
 C.zb=A.XP.prototype
 C.Iv=A.xc.prototype
 C.Cc=Q.NQ.prototype
-C.HD=T.ov.prototype
-C.c0=A.kn.prototype
+C.HD=T.SM.prototype
+C.c0=A.knI.prototype
 C.cJ=U.fI.prototype
 C.SX=R.zMr.prototype
 C.Vd=D.nk.prototype
@@ -17154,30 +17317,40 @@
 C.lx=A.tz.prototype
 C.vB=J.is.prototype
 C.V8=X.I5.prototype
-C.nt=U.SC.prototype
+C.nt=U.en.prototype
 C.ol=W.u9.prototype
 C.KZ=new H.hJ()
 C.OL=new U.EZ()
 C.Gw=new H.yq()
+C.E3=new J.Q()
+C.Fm=new J.kn()
+C.yX=new J.Pp()
+C.c1=new J.bU()
+C.x0=new J.Jh()
+C.oD=new J.P()
+C.Kn=new J.O()
 C.J19=new K.ndx()
 C.IU=new P.TO()
 C.Us=new A.yL()
 C.Nw=new K.vly()
 C.Wj=new P.JF()
 C.xd=new A.Mh()
-C.vT=new P.mg()
+C.OY=new P.mg()
 C.NU=new P.R8()
-C.v8=new P.nU()
+C.v8=new P.AHi()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.nj=new D.WAE("Native")
 C.yP=new D.WAE("Reused")
 C.oA=new D.WAE("Tag")
+C.F9=new A.V3("action-link")
 C.vr3=new A.V3("service-exception-view")
+C.Ux=new A.V3("isolate-location")
 C.Br=new A.V3("observatory-element")
 C.dA=new A.V3("heap-profile")
 C.I3=new A.V3("script-view")
 C.XG=new A.V3("nav-refresh")
+C.Bd=new A.V3("isolate-counter-chart")
 C.E6=new A.V3("field-ref")
 C.aM=new A.V3("isolate-summary")
 C.Is=new A.V3("response-viewer")
@@ -17196,11 +17369,12 @@
 C.Hk=new A.V3("vm-view")
 C.Oyb=new A.V3("library-view")
 C.H3=new A.V3("code-ref")
-C.hr=new A.V3("top-nav-menu")
+C.NT=new A.V3("top-nav-menu")
 C.js=new A.V3("stack-trace")
 C.Ur=new A.V3("script-ref")
 C.tSc=new A.V3("class-ref")
-C.PT=new A.V3("breakpoint-list")
+C.Po=new A.V3("isolate-shared-summary")
+C.jy=new A.V3("breakpoint-list")
 C.VW=new A.V3("instance-ref")
 C.Ye=new A.V3("vm-ref")
 C.Gu=new A.V3("collapsible-content")
@@ -17208,10 +17382,11 @@
 C.kR=new A.V3("observatory-application")
 C.uvO=new A.V3("service-error-view")
 C.Qz=new A.V3("eval-box")
-C.oD=new A.V3("isolate-nav-menu")
-C.iF=new A.V3("class-nav-menu")
+C.zaS=new A.V3("isolate-nav-menu")
+C.qJ=new A.V3("class-nav-menu")
 C.uW=new A.V3("error-view")
 C.u7=new A.V3("nav-menu")
+C.Xuf=new A.V3("isolate-run-state")
 C.KH=new A.V3("json-view")
 C.j6=new A.V3("isolate-ref")
 C.o3=new A.V3("function-ref")
@@ -17220,17 +17395,17 @@
 C.JD=new A.V3("service-ref")
 C.nW=new A.V3("nav-bar")
 C.DKS=new A.V3("curly-block")
-C.be=new A.V3("instance-view")
+C.qlk=new A.V3("instance-view")
 C.ny=new P.a6(0)
-C.mt=H.VM(new W.e0("change"),[W.ea])
-C.T1=H.VM(new W.e0("click"),[W.Aj])
-C.MD=H.VM(new W.e0("error"),[W.ew])
-C.PP=H.VM(new W.e0("hashchange"),[W.ea])
-C.i3=H.VM(new W.e0("input"),[W.ea])
-C.fK=H.VM(new W.e0("load"),[W.ew])
-C.Ns=H.VM(new W.e0("message"),[W.cx])
-C.DK=H.VM(new W.e0("mousedown"),[W.Aj])
-C.W2=H.VM(new W.e0("mousemove"),[W.Aj])
+C.mt=H.VM(new W.UC("change"),[W.ea])
+C.pi=H.VM(new W.UC("click"),[W.Wp])
+C.MD=H.VM(new W.UC("error"),[W.ew])
+C.PP=H.VM(new W.UC("hashchange"),[W.ea])
+C.i3=H.VM(new W.UC("input"),[W.ea])
+C.fK=H.VM(new W.UC("load"),[W.ew])
+C.Ns=H.VM(new W.UC("message"),[W.cx])
+C.DK=H.VM(new W.UC("mousedown"),[W.Wp])
+C.W2=H.VM(new W.UC("mousemove"),[W.Wp])
 C.Mc=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -17383,7 +17558,7 @@
 C.Me=H.VM(I.makeConstantList([]),[P.Ms])
 C.dn=H.VM(I.makeConstantList([]),[P.tg])
 C.hU=H.VM(I.makeConstantList([]),[P.X9])
-C.iH=H.VM(I.makeConstantList([]),[P.KN])
+C.iH=H.VM(I.makeConstantList([]),[J.bU])
 C.xD=I.makeConstantList([])
 C.Qy=I.makeConstantList(["in","this"])
 C.Ym=I.makeConstantList(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
@@ -17395,8 +17570,8 @@
 C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.jH)
 C.uS=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
-C.p5=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
+C.a5k=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
+C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.a5k)
 C.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
 C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
 C.CM=new H.LPe(0,{},C.xD)
@@ -17443,7 +17618,7 @@
 C.WG=new H.GD("formattedCollections")
 C.uU=new H.GD("formattedExclusiveTicks")
 C.eF=new H.GD("formattedInclusiveTicks")
-C.oI=new H.GD("formattedLine")
+C.Zt=new H.GD("formattedLine")
 C.ST=new H.GD("formattedTotalCollectionTime")
 C.QH=new H.GD("fragmentation")
 C.rE=new H.GD("frame")
@@ -17454,7 +17629,7 @@
 C.D2=new H.GD("hasParent")
 C.Ia=new H.GD("hashLinkWorkaround")
 C.lb=new H.GD("hideTagsChecked")
-C.du=new H.GD("hitStyle")
+C.wq=new H.GD("hitStyle")
 C.bA=new H.GD("hoverText")
 C.AZ=new H.GD("dart.core.String")
 C.Di=new H.GD("iconClass")
@@ -17477,6 +17652,7 @@
 C.eh=new H.GD("lineMode")
 C.Cv=new H.GD("lines")
 C.dB=new H.GD("link")
+C.jA=new H.GD("loading")
 C.dH=new H.GD("mainPort")
 C.p3=new H.GD("map")
 C.t6=new H.GD("mapAsString")
@@ -17493,8 +17669,7 @@
 C.Le=new H.GD("oldHeapCapacity")
 C.SW=new H.GD("oldHeapUsed")
 C.ZU=new H.GD("pad")
-C.wq=new H.GD("pausedOnExit")
-C.NT=new H.GD("pausedOnStart")
+C.yG=new H.GD("pauseEvent")
 C.Kl=new H.GD("pos")
 C.vb=new H.GD("profile")
 C.zc=new H.GD("qualified")
@@ -17505,7 +17680,7 @@
 C.mE=new H.GD("response")
 C.UY=new H.GD("result")
 C.Aa=new H.GD("results")
-C.iG=new H.GD("rootLib")
+C.xe=new H.GD("rootLib")
 C.X8=new H.GD("running")
 C.ok=new H.GD("dart.core.Null")
 C.md=new H.GD("dart.core.double")
@@ -17535,78 +17710,95 @@
 C.KS=new H.GD("vmName")
 C.v6=new H.GD("void")
 C.n8=H.uV('qC')
-C.WP=new H.bB(C.n8,"K",0)
+C.WP=new H.QT(C.n8,"K",0)
 C.SL=H.uV('Ae')
-C.xC=new H.bB(C.SL,"V",0)
+C.xC=new H.QT(C.SL,"V",0)
 C.QJ=H.uV('xh')
-C.wW=new H.bB(C.QJ,"T",0)
+C.wW=new H.QT(C.QJ,"T",0)
 C.Gsc=H.uV('wn')
-C.io=new H.bB(C.Gsc,"E",0)
-C.nz=new H.bB(C.n8,"V",0)
-C.RP=H.uV('hx')
-C.I7=H.uV('bf')
+C.io=new H.QT(C.Gsc,"E",0)
+C.nz=new H.QT(C.n8,"V",0)
+C.k5t=H.uV('hx')
+C.KSy=H.uV('Yj')
 C.q0S=H.uV('Dg')
 C.z6Y=H.uV('Tg')
+C.xFi=H.uV('rm')
+C.eY=H.uV('n6')
 C.J9=H.uV('zMr')
+C.Vh=H.uV('Pz')
+C.hgE=H.uV('flR')
 C.zq=H.uV('Qa')
-C.tf=H.uV('Zt')
 C.qfw=H.uV('qW')
+C.z7=H.uV('YA')
 C.GTO=H.uV('F1')
-C.wc=H.uV('kn')
 C.nY=H.uV('a')
 C.Yc=H.uV('iP')
-C.Pt=H.uV('ov')
 C.jRs=H.uV('Be')
 C.Ow=H.uV('oO')
-C.xF=H.uV('NQ')
-C.Xb=H.uV('pz')
+C.PT=H.uV('I2')
+C.p8F=H.uV('NQ')
+C.xLI=H.uV('pz')
 C.xz=H.uV('Stq')
+C.T1=H.uV('Wy')
 C.aj=H.uV('fI')
 C.Kh=H.uV('I5')
+C.lg=H.uV('hV')
+C.la=H.uV('ZX')
 C.G4=H.uV('CN')
-C.O4=H.uV('CP')
-C.yw=H.uV('KN')
+C.O4=H.uV('double')
+C.yw=H.uV('int')
 C.b7=H.uV('uwf')
 C.RcY=H.uV('aQ')
 C.KJ=H.uV('mk')
+C.ST4=H.uV('en')
 C.X6M=H.uV('jM')
+C.yiu=H.uV('knI')
 C.dUi=H.uV('Uj')
 C.U9=H.uV('UL')
+C.iG=H.uV('yc')
 C.HI=H.uV('Pg')
 C.ab=H.uV('xI')
+C.lk=H.uV('mJ')
 C.lpG=H.uV('LU')
+C.EG=H.uV('Oz')
 C.Ch=H.uV('KL')
+C.kbo=H.uV('SM')
+C.jV=H.uV('rF')
 C.OdR=H.uV('pL')
 C.cj=H.uV('E7')
-C.eB=H.uV('F1i')
+C.UNa=H.uV('F1i')
 C.wE=H.uV('vj')
-C.yB=H.uV('Mv')
 C.JW=H.uV('Ww')
 C.qo=H.uV('jY')
 C.l49=H.uV('uL')
 C.yQ=H.uV('EH')
+C.Im=H.uV('X6')
 C.FU=H.uV('lw')
+C.p5=H.uV('oM')
+C.nG=H.uV('zt')
 C.px=H.uV('tz')
 C.epC=H.uV('Jc')
-C.Xd=H.uV('b0B')
+C.eB=H.uV('IWF')
+C.JA3=H.uV('b0B')
 C.PF=H.uV('nk')
-C.Db=H.uV('qU')
-C.BP=H.uV('qkb')
+C.Db=H.uV('String')
 C.Tu=H.uV('xc')
+C.jwA=H.uV('qkb')
 C.bh=H.uV('i6')
 C.Bm=H.uV('XP')
-C.wDw=H.uV('SC')
 C.hg=H.uV('hd')
 C.Fv=H.uV('ob')
 C.Wza=H.uV('pR')
 C.leN=H.uV('Lt')
-C.HL=H.uV('a2')
-C.Qf=H.uV('L9')
+C.HL=H.uV('bool')
+C.Qf=H.uV('Null')
 C.HH=H.uV('dynamic')
 C.vVv=H.uV('iL')
 C.Gp=H.uV('cw')
 C.ri=H.uV('yy')
 C.X0=H.uV('Ir')
+C.CS=H.uV('vm')
+C.hN=H.uV('oI')
 C.R4R=H.uV('xT')
 C.xM=new P.z0(!1)
 C.hi=H.VM(new W.bO(W.pq()),[W.OJ])
@@ -17614,7 +17806,7 @@
 $.te="$cachedFunction"
 $.eb="$cachedInvocation"
 $.OK=0
-$.mJ=null
+$.bf=null
 $.P4=null
 $.Jl=!1
 $.NF=null
@@ -17642,14 +17834,14 @@
 $.uP=!0
 $.VZ="objects/"
 $.To=null
-$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","Ft","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","P9","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xe","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gI","gID","gIF","gIK","gIO","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gMz","gN","gNF","gNG","gNT","gNW","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPl","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gRw","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZf","ga1","ga3","ga4","gai","gbP","gbY","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","giX","gib","gig","gik","git","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goM","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqW","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","gu6","guD","guT","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rL","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDD","sDe","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sID","sIF","sIK","sIO","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sMz","sN","sNF","sNG","sNT","sNW","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPl","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sa1","sa3","sa4","sai","sbP","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","siX","sib","sig","sik","sit","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soM","soY","soc","sox","soy","sp8","spD","sph","sqO","sqW","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","su6","suD","suT","suw","svH","svJ","svt","swd","sx","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vD","vQ","vV","w","wB","wE","wL","wY","wg","x3","xJ","xU","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
-$.Au=[C.RP,Z.hx,{created:Z.Co},C.I7,L.bf,{created:L.Rp},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.J9,R.zMr,{created:R.hp},C.zq,A.Qa,{created:A.JR},C.tf,A.Zt,{created:A.PQ},C.qfw,U.qW,{created:U.Wz},C.GTO,A.F1,{created:A.aD},C.wc,A.kn,{created:A.Th},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.xF,Q.NQ,{created:Q.Zo},C.Xb,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.X6M,A.jM,{created:A.Sy},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.eB,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Xd,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.wDw,U.SC,{created:U.oH},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
+$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","Ft","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","P9","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xe","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","ak","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE1","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gHu","gI","gID","gIF","gIK","gIO","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gKW","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gMz","gN","gNF","gNG","gNT","gNW","gNl","gNo","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gR","gRA","gRH","gRY","gRn","gRu","gRw","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gYr","gZf","ga1","ga3","ga4","gai","gbP","gbY","gbx","gcC","gdB","gdG","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","gfi","ghU","ghX","ghf","ghi","gho","ghw","gi9","giC","giF","giO","giX","gib","gig","gik","git","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goM","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqW","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","gu6","guD","guT","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxU","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","nY","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pp","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rL","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDD","sDe","sE1","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sHu","sID","sIF","sIK","sIO","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sKW","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sMz","sN","sNF","sNG","sNT","sNW","sNl","sNo","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sYr","sa1","sa3","sa4","sai","sbP","sbY","scC","sdB","sdG","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","sfi","shU","shX","shf","shi","sho","shw","siC","siF","siX","sib","sig","sik","sit","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soM","soY","soc","sox","soy","sp8","spD","sph","sqO","sqW","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","su6","suD","suT","suw","svH","svJ","svt","swd","sx","sxU","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vD","vQ","vV","w","wB","wE","wL","wY","wg","x3","xJ","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
+$.Au=[C.k5t,Z.hx,{created:Z.Co},C.KSy,D.Yj,{created:D.b2},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.J9,R.zMr,{created:R.hp},C.hgE,A.flR,{created:A.Du},C.zq,A.Qa,{created:A.JR},C.qfw,U.qW,{created:U.Wz},C.z7,D.YA,{created:D.BP},C.GTO,A.F1,{created:A.aD},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.p8F,Q.NQ,{created:Q.Zo},C.xLI,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.lg,X.hV,{created:X.zy},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.EG,D.Oz,{created:D.RP},C.Ch,M.KL,{created:M.Ro},C.kbo,T.SM,{created:T.T5},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.UNa,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.p5,A.oM,{created:A.PQ},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.eB,D.IWF,{created:D.dm},C.JA3,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.Tu,A.xc,{created:A.G7},C.jwA,L.qkb,{created:L.uD},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.lv},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
 I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
 I.$lazy($,"globalWindow","cO","C5",function(){return $.jk().window})
 I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
 I.$lazy($,"globalPostMessageDefined","Da","JU",function(){return $.jk().postMessage!==void 0})
 I.$lazy($,"thisScript","Kb","Ak",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[P.KN])})
+I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[J.bU])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.LX(H.S7({toString:function(){return"$receiver$"}}))})
 I.$lazy($,"notClosurePattern","k1","OI",function(){return H.LX(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
 I.$lazy($,"nullCallPattern","Re","PH",function(){return H.LX(H.S7(null))})
@@ -17664,7 +17856,7 @@
 I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.LX(function(){try{(void 0).$method$}catch(z){return z.message}}())})
 I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().$0()})
 I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
-I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
+I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
 I.$lazy($,"_dynamicType","QG","P8",function(){return new H.EE(C.nN)})
 I.$lazy($,"_voidType","Q3","oj",function(){return new H.EE(C.v6)})
 I.$lazy($,"librariesByName","Ct","vK",function(){return H.dF()})
@@ -17682,21 +17874,21 @@
 I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(a){this.o=a}})
 I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
 I.$lazy($,"_pageSeparationColor","RD","eK",function(){return[0,0,0,255]})
-I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(P.qU,N.TJ)})
+I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(J.O,N.TJ)})
 I.$lazy($,"_logger","G3","iU",function(){return N.Jx("Observable.dirtyCheck")})
 I.$lazy($,"objectType","XV","aA",function(){return P.re(C.nY)})
 I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.Md().$0()})
-I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR("\\s",H.v4("\\s",!1,!0,!1),null,null)})
+I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR(H.v4("\\s",!1,!0,!1),null,null)})
 I.$lazy($,"_logger","y7","aT",function(){return N.Jx("observe.PathObserver")})
-I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
-I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,P.qU,A.XP)})
-I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,P.qU,[P.zM,A.XP])})
-I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,P.qU,A.XP)})
+I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,J.O,P.uq)})
+I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,J.O,A.XP)})
+I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,J.O,[J.Q,A.XP])})
+I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,J.O,A.XP)})
 I.$lazy($,"_objectType","p0","H8",function(){return P.re(C.nY)})
 I.$lazy($,"_sheetLog","Fa","vM",function(){return N.Jx("polymer.stylesheet")})
 I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w12().$0()})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,P.qU,P.a)
+I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR(H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,J.O,P.a)
 z.FV(0,C.eu)
 return new A.HJ(z)})
 I.$lazy($,"_ready","tS","mC",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
@@ -17714,8 +17906,8 @@
 I.$lazy($,"_logger","m0","eH",function(){return N.Jx("polymer_expressions")})
 I.$lazy($,"_BINARY_OPERATORS","Af","Ra",function(){return P.EF(["+",new K.Uf(),"-",new K.wJY(),"*",new K.zOQ(),"/",new K.W6o(),"==",new K.MdQ(),"!=",new K.YJG(),">",new K.DOe(),">=",new K.lPa(),"<",new K.Ufa(),"<=",new K.Raa(),"||",new K.w0(),"&&",new K.w4(),"|",new K.w5()],null,null)})
 I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return P.EF(["+",new K.w7(),"-",new K.w10(),"!",new K.w11()],null,null)})
-I.$lazy($,"_currentIsolateMatcher","tV","PY",function(){return new H.VR("isolates/\\d+",H.v4("isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"_currentIsolateMatcher","tV","PY",function(){return new H.VR(H.v4("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR(H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.DO().$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
@@ -17723,7 +17915,7 @@
 I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
 
 init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"sender","e",{func:"pL",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"Dv",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"ny"},{func:"pB",ret:P.vr,args:[P.a]},"reflectee",{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.MN]},,"error","stackTrace",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent","zone",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},"f",{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},{func:"Ib",ret:P.a2,args:[null,null]},{func:"bX",ret:P.KN,args:[null]},"a",{func:"uJ",ret:P.a,args:[null]},"object",{func:"P2",ret:P.KN,args:[P.Tx,P.Tx]},"b",{func:"E0",ret:P.a2,args:[P.a,P.a]},{func:"Gm",ret:P.KN,args:[P.a]},{func:"K4",ret:P.KN,args:[P.qU],named:{onError:{func:"Tl",ret:P.KN,args:[P.qU]},radix:P.KN}},{func:"Tf",ret:P.qU,args:[W.D0]},"receiver",{func:"jn",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o","v",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"iterable","index","invocation",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"hF",args:[null,P.qU]},G.dZ,D.H6,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:P.qU},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event","obj",P.KN,[P.zM,G.Y2],[P.zM,P.qU],{func:"r5",ret:[P.zM,P.KN]},{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"wI",args:[P.KN,P.KN]},D.SI,[P.Z0,P.qU,W.cv],{func:"Eg",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.pv,D.af,P.a2,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},"target",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,"c",H.Tp,P.qU,{func:"Uf",ret:P.a2},{func:"zk",args:[P.a2]},"r",R.Vct,{func:"ZT",void:true,args:[null,null,null]},R.LP,{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"i",{func:"VG",ret:P.Ms,args:[P.KN]},{func:"Z5",args:[P.KN]},{func:"UC",ret:P.X9,args:[P.KN]},{func:"ag",args:[P.qU,P.qU]},"data",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","element",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each",{func:"Yz",ret:P.a2,args:[P.jp]},{func:"Tl",ret:P.KN,args:[P.qU]},{func:"Zh",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Dt",ret:P.KN,args:[P.KN]},{func:"GF",ret:P.KN,args:[null,null]},"byteString",{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"xhr","k",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[P.qU]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[P.qU]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[P.qU]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Aj]},L.WZq,"result",R.Nr,A.pva,U.rs,{func:"fO",ret:P.qU,args:[D.SI]},"function",N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:P.KN,args:[[P.QV,P.KN]]},"color",{func:"S1",void:true,args:[P.KN,P.qU,[P.QV,P.KN]]},"classId",{func:"D8",void:true,args:[null,P.KN]},"classList","freeClassId",{func:"XK",ret:[P.QV,P.KN],args:[P.KN]},{func:"D9",ret:P.qU,args:[[P.hL,P.KN]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,P.KN]]},{func:"j4",void:true,args:[P.KN]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:P.a2,args:[P.Z0]},{func:"Xb",args:[P.Z0,P.KN]},{func:"Na",ret:P.qU,args:[P.a2]},"newSpace",K.V4,{func:"iR",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[P.qU]}]},{func:"uj",ret:P.QV,args:[{func:"qt",ret:P.QV,args:[P.qU]}]},{func:"pw",void:true,args:[P.a2,null]},"expand",Z.V9,D.t9,P.CP,G.XN,{func:"nzZ",ret:P.qU,args:[G.Y2]},X.V10,"m",D.bv,D.V11,P.tU,L.Lr,L.V12,"tagProfile",Z.V13,D.U4,{func:"ax",ret:D.U4},{func:"SN",args:[D.U4]},M.V14,"rec",{func:"IM",args:[N.HV]},A.V15,A.V16,A.V17,A.V18,A.V19,"x",A.V20,A.V21,A.V22,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V23,{func:"Z8",void:true,args:[P.qU,null,null]},{func:"Pz",ret:P.qU,args:[P.CP]},"time",{func:"vI",ret:P.qU,args:[P.Z0]},"frame",{func:"h6",ret:P.a2,args:[P.qU]},"type",A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"kG",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:P.KN},{func:"Lc",ret:P.a2,args:[P.a]},{func:"DF",void:true,args:[P.a]},"records",{func:"ZD",args:[[P.zM,G.DA]]},{func:"oe",args:[[P.zM,T.yj]]},{func:"rj",void:true,args:[P.qU,P.qU]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"model","node",{func:"K7",void:true,args:[[P.zM,T.yj]]},"def",{func:"Zu",args:[P.qU,null,null]},{func:"pp",ret:U.zX,args:[U.hw,U.hw]},3,{func:"Nt",args:[U.hw]},"s",Q.V24,D.rj,[P.zM,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[P.zM,D.c2]},{func:"mRV",args:[[P.zM,D.c2]]},{func:"Yg",ret:P.qU,args:[D.c2]},"line",T.V25,A.x4,U.V26,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.H6},"map",{func:"JC",args:[V.qC]},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:P.CP},{func:"mV",args:[P.CP]},[P.Z0,P.qU,P.CP],{func:"c7",ret:V.qC},{func:"zs",ret:P.qU,args:[P.qU]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"EIX",ret:[Q.wn,D.U4]},{func:"P5",args:[[Q.wn,D.U4]]},{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[P.zM,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:P.qU,args:[D.kx]},"code",{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V27,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V28,"msg",{func:"nR",ret:Z.uL},U.V29,Q.Vfx,"details",Q.Bc,V.qC,K.V30,X.V31,"y",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.zM,P.a]]},"values",{func:"PzC",void:true,args:[[P.zM,G.DA]]},"splices",{func:"UxH",args:[P.zM]},D.pD,{func:"Af",args:[D.H6]},U.V32,];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","charCode","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isSuperCall","stubName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"ny"},{func:"Dv",args:[null]},"_","a","total","pad",{func:"Pt",ret:J.O,args:[J.bU]},"v","time","bytes",{func:"RJ",ret:J.O,args:[null]},{func:"kl",void:true},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","fields","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map",{func:"n9",void:true,args:[{func:"kl",void:true}]},"callback","errorHandler","zone","listeners","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,J.O]},"line",{func:"kx",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bX",ret:J.bU,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","indent",{func:"P2",ret:J.bU,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"Gm",ret:J.bU,args:[P.a]},{func:"K4",ret:J.bU,args:[J.O],named:{onError:{func:"Tl",ret:J.bU,args:[J.O]},radix:J.bU}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","length","createProxy","mustCopy","nativeImageData","imageData","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","val",{func:"bh",args:[null,null]},{func:"Za",args:[J.O,null]},"parameter",{func:"hF",args:[null,J.O]},J.kn,J.O,[P.Z0,J.O,W.cv],{func:"Uf",ret:J.kn},C.Nw,C.J19,{func:"zk",args:[J.kn]},C.Us,{func:"I0",ret:J.O},{func:"ZT",void:true,args:[null,null,null]},X.LP,H.Tp,G.dZ,D.zM,{func:"Wy",ret:D.bv},{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event",J.bU,[J.Q,G.Y2],[J.Q,J.O],{func:"r5",ret:[J.Q,J.bU]},{func:"qE",ret:J.O,args:[J.bU,J.bU]},"row","column",{func:"wI",args:[J.bU,J.bU]},"i","j",D.SI,{func:"Eg",ret:D.SI},{func:"Q5",args:[D.SI]},"done",B.pv,D.af,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},"dummy",Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,"r",R.Vct,R.Nr,"library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"typeArgument","tv",{func:"VG",ret:P.Ms,args:[J.bU]},{func:"Z5",args:[J.bU]},{func:"UC",ret:P.X9,args:[J.bU]},"reflectiveName",{func:"ag",args:[J.O,J.O]},{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each","k",{func:"Yz",ret:J.kn,args:[P.jp]},"matched",{func:"Tl",ret:J.bU,args:[J.O]},{func:"Zh",ret:J.Pp,args:[J.O]},"ch",{func:"cd",ret:J.kn,args:[J.bU]},{func:"Dt",ret:J.bU,args:[J.bU]},"digit","part",{func:"GF",ret:J.bU,args:[null,null]},"byteString",{func:"HE",ret:J.bU,args:[J.bU,J.bU]},"byte","buffer","xhr","header","prevValue",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.WZq,R.Bc,A.pva,U.rs,{func:"fO",ret:J.O,args:[D.SI]},N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.bU,args:[[P.QV,J.bU]]},"color",{func:"S1",void:true,args:[J.bU,J.O,[P.QV,J.bU]]},"classId",{func:"D8",void:true,args:[null,J.bU]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.bU],args:[J.bU]},{func:"D9",ret:J.O,args:[[P.hL,J.bU]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,J.bU]]},{func:"j4",void:true,args:[J.bU]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.bU]},{func:"Yi",ret:J.O,args:[J.kn]},"newSpace",K.V4,{func:"iR",args:[J.bU,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[J.O]}]},{func:"uj",ret:P.QV,args:[{func:"qt",ret:P.QV,args:[J.O]}]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V9,D.t9,J.Pp,G.XN,{func:"nzZ",ret:J.O,args:[G.Y2]},X.V10,D.bv,D.V11,{func:"KD",ret:P.b8,args:[null]},D.V12,D.V13,D.V14,V.qC,D.vT,{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},D.V15,P.tU,L.Lr,L.V16,"tagProfile",Z.V17,D.U4,{func:"ax",ret:D.U4},{func:"SN",args:[D.U4]},M.V18,"rec",{func:"IM",args:[N.HV]},A.V19,A.V20,A.V21,A.V22,A.V23,A.V24,A.V25,A.V26,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V27,{func:"Z8",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.Pp]},{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"kG",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:J.bU},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"ZD",args:[[J.Q,G.DA]]},{func:"oe",args:[[J.Q,T.yj]]},"onName","eventType",{func:"rj",void:true,args:[J.O,J.O]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"pair","p",{func:"YT",void:true,args:[[J.Q,T.yj]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"PO",ret:U.zX,args:[U.hw,U.hw]},"h","item",3,{func:"Qc",args:[U.hw]},Q.V28,D.rj,[J.Q,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[J.Q,D.c2]},{func:"mRV",args:[[J.Q,D.c2]]},{func:"Yg",ret:J.O,args:[D.c2]},T.V29,A.x4,U.V30,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:J.Pp},{func:"mV",args:[J.Pp]},"isolateId",[P.Z0,J.O,J.Pp],{func:"zs",ret:J.O,args:[J.O]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"EIX",ret:[Q.wn,D.U4]},{func:"P5",args:[[Q.wn,D.U4]]},{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[J.Q,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V31,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V32,{func:"nR",ret:Z.uL},U.V33,Q.Vfx,"details",Q.LPc,K.V34,X.V35,"y",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"UxH",args:[J.Q]},D.pD,{func:"Af",args:[D.zM]},U.V36,];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index 6fbc01e..69f642c 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -10,7 +10,156 @@
   <script src="index_devtools.html_bootstrap.dart.js"></script>
   
 </head>
-<body><polymer-element name="observatory-element">
+<body><polymer-element name="curly-block">
+  <template>
+    <style>
+      .idle {
+        display: inline-block;
+        color: #0489c3;
+        cursor: pointer;
+      }
+      .busy {
+        display: inline-block;
+        color: white;
+        cursor: wait;
+      }
+    </style>
+    <template if="{{ expanded }}">
+      <template if="{{ busy }}">
+        {<div class="busy">&nbsp;&nbsp;⊟&nbsp;&nbsp;</div>
+        <br>
+        <content></content>
+        }
+      </template>
+      <template if="{{ !busy }}">
+        {<a on-click="{{ toggleExpand }}"><div class="idle">&nbsp;&nbsp;⊟&nbsp;&nbsp;</div></a>
+        <br>
+        <content></content>
+        }
+      </template>
+    </template>
+
+    <template if="{{ !expanded }}">
+      <template if="{{ busy }}">
+        {<div class="busy">&nbsp;&nbsp;⊞&nbsp;&nbsp;</div>}
+      </template>
+      <template if="{{ !busy }}">
+        {<a on-click="{{ toggleExpand }}"><div class="idle">&nbsp;&nbsp;⊞&nbsp;&nbsp;</div></a>}
+      </template>
+    </template>
+  </template>
+  
+</polymer-element>
+<polymer-element name="observatory-element">
+  
+</polymer-element>
+<polymer-element name="service-ref" extends="observatory-element">
+  
+</polymer-element><polymer-element name="instance-ref" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <style>
+      .errorBox {
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: pre;
+      }
+    </style>
+    <span>
+      <template if="{{ isError(ref.serviceType) }}">
+        <pre class="errorBox">{{ ref.message }}</pre>
+      </template>
+
+      <template if="{{ isUnexpected(ref.serviceType) }}">
+        unexpected reference type &lt;{{ ref.serviceType }}&gt;
+      </template>
+
+      <template if="{{ isNull(ref.serviceType) }}">
+        <div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
+      </template>
+
+      <template if="{{ (isString(ref.serviceType) ||
+                        isBool(ref.serviceType) ||
+                        isInt(ref.serviceType)) ||
+                        isDouble(ref.serviceType)) }}">
+        <a href="{{ url }}">{{ ref['valueAsString'] }}</a>
+      </template>
+
+      <template if="{{ (isType(ref.serviceType)) }}">
+        <a href="{{ url }}">{{ ref['user_name'] }}</a>
+      </template>
+
+      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
+                       ref['closureFunc'] != null}}">
+        <a href="{{ url }}">
+          <!-- TODO(turnidge): Switch this to fully-qualified function -->
+          {{ ref['closureFunc']['user_name'] }}
+        </a>
+      </template>
+
+      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
+                       ref['closureFunc'] == null}}">
+        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
+        <curly-block callback="{{ expander() }}">
+          <div class="memberList">
+            <template repeat="{{ field in ref['fields'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  {{ field['decl']['user_name'] }}
+                </div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block>
+      </template>
+
+      <template if="{{ isList(ref.serviceType) }}">
+        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
+        <curly-block callback="{{ expander() }}">
+          <div class="memberList">
+            <template repeat="{{ element in ref['elements'] }}">
+              <div class="memberItem">
+                <div class="memberName">[{{ element['index']}}]</div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block>
+      </template>
+    </span>
+  </template>
+  
+</polymer-element>
+<polymer-element name="action-link">
+  <template>
+    <style>
+      .idle {
+        color: #0489c3;
+        cursor: pointer;
+      }
+      .busy {
+        color: #aaa;
+        cursor: wait;
+      }
+    </style>
+
+    <template if="{{ busy }}">
+      <span class="busy">[{{ label }}]</span>
+    </template>
+    <template if="{{ !busy }}">
+      <span class="idle"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+    </template>
+
+  </template>
   
 </polymer-element>
 <polymer-element name="nav-bar" extends="observatory-element">
@@ -91,7 +240,8 @@
       }
     </style>
 
-    <li class="menu"><a href="{{ link }}">{{ anchor }}</a>
+    <li class="menu">
+      <a href="{{ link }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
     <template if="{{ !last }}">
@@ -239,138 +389,12 @@
   </template>
   
 </polymer-element>
-<polymer-element name="service-ref" extends="observatory-element">
-  
-</polymer-element><polymer-element name="class-ref" extends="service-ref">
+<polymer-element name="class-ref" extends="service-ref">
 
 <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
 
 </polymer-element>
-<polymer-element name="curly-block">
-  <template>
-    <style>
-      .idle {
-        display: inline-block;
-        color: #0489c3;
-        cursor: pointer;
-      }
-      .busy {
-        display: inline-block;
-        color: white;
-        cursor: wait;
-      }
-    </style>
-    <template if="{{ expanded }}">
-      <template if="{{ busy }}">
-        {<div class="busy">&nbsp;&nbsp;⊟&nbsp;&nbsp;</div>
-        <br>
-        <content></content>
-        }
-      </template>
-      <template if="{{ !busy }}">
-        {<a on-click="{{ toggleExpand }}"><div class="idle">&nbsp;&nbsp;⊟&nbsp;&nbsp;</div></a>
-        <br>
-        <content></content>
-        }
-      </template>
-    </template>
-
-    <template if="{{ !expanded }}">
-      <template if="{{ busy }}">
-        {<div class="busy">&nbsp;&nbsp;⊞&nbsp;&nbsp;</div>}
-      </template>
-      <template if="{{ !busy }}">
-        {<a on-click="{{ toggleExpand }}"><div class="idle">&nbsp;&nbsp;⊞&nbsp;&nbsp;</div></a>}
-      </template>
-    </template>
-  </template>
-  
-</polymer-element>
-<polymer-element name="instance-ref" extends="service-ref">
-  <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
-    <style>
-      .errorBox {
-        background-color: #f5f5f5;
-        border: 1px solid #ccc;
-        padding: 10px;
-        font-family: consolas, courier, monospace;
-        font-size: 1em;
-        line-height: 1.2em;
-        white-space: pre;
-      }
-    </style>
-    <span>
-      <template if="{{ isError(ref.serviceType) }}">
-        <pre class="errorBox">{{ ref.message }}</pre>
-      </template>
-
-      <template if="{{ isUnexpected(ref.serviceType) }}">
-        unexpected reference type &lt;{{ ref.serviceType }}&gt;
-      </template>
-
-      <template if="{{ isNull(ref.serviceType) }}">
-        <div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
-      </template>
-
-      <template if="{{ (isString(ref.serviceType) ||
-                        isBool(ref.serviceType) ||
-                        isInt(ref.serviceType)) ||
-                        isDouble(ref.serviceType)) }}">
-        <a href="{{ url }}">{{ ref['valueAsString'] }}</a>
-      </template>
-
-      <template if="{{ (isType(ref.serviceType)) }}">
-        <a href="{{ url }}">{{ ref['user_name'] }}</a>
-      </template>
-
-      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
-                       ref['closureFunc'] != null}}">
-        <a href="{{ url }}">
-          <!-- TODO(turnidge): Switch this to fully-qualified function -->
-          {{ ref['closureFunc']['user_name'] }}
-        </a>
-      </template>
-
-      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
-                       ref['closureFunc'] == null}}">
-        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
-        <curly-block callback="{{ expander() }}">
-          <div class="memberList">
-            <template repeat="{{ field in ref['fields'] }}">
-              <div class="memberItem">
-                <div class="memberName">
-                  {{ field['decl']['user_name'] }}
-                </div>
-                <div class="memberValue">
-                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
-                </div>
-              </div>
-            </template>
-          </div>
-        </curly-block>
-      </template>
-
-      <template if="{{ isList(ref.serviceType) }}">
-        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
-        <curly-block callback="{{ expander() }}">
-          <div class="memberList">
-            <template repeat="{{ element in ref['elements'] }}">
-              <div class="memberItem">
-                <div class="memberName">[{{ element['index']}}]</div>
-                <div class="memberValue">
-                  <instance-ref ref="{{ element['value'] }}"></instance-ref>
-                </div>
-              </div>
-            </template>
-          </div>
-        </curly-block>
-      </template>
-    </span>
-  </template>
-  
-</polymer-element>
 <polymer-element name="eval-box" extends="observatory-element">
   <template>
     <style>
@@ -1149,64 +1173,173 @@
 <polymer-element name="isolate-summary" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
-    <style>
-      .counters {
-        display: flex;
-        flex-direction: row;
-        justify-content: center;
-      }
-      .counter {
-        margin: 10px;
-      }
-    </style>
     <div class="flex-row">
-      <div class="flex-item-fixed-1-12"><img src="packages/observatory/src/elements/img/isolate_icon.png"></div>
-      <div class="flex-item-fixed-1-12">{{ isolate.mainPort }}</div>
-      <div class="flex-item-fixed-4-12">
-        <div class="flex-row">
-          <isolate-ref ref="{{ isolate }}"></isolate-ref>
-        </div>
-        <div class="flex-row">
-          <small>
-            (<a href="{{ isolate.rootLib.hashLink }}">library</a>)
-            (<a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>)
-            (<a href="{{ isolate.relativeHashLink('profile') }}">profile</a>)
-          </small>
-        </div>
+      <div class="flex-item-10-percent">
+        <img src="packages/observatory/src/elements/img/isolate_icon.png">
       </div>
-
-      <div class="flex-item-fixed-2-12">
-        <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
-          {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
-        </a>
-        ( <a href="{{ isolate.relativeHashLink('heapmap') }}">map</a> )
+      <div class="flex-item-10-percent">
+        <isolate-ref ref="{{ isolate }}"></isolate-ref>
       </div>
-      <div class="flex-item-fixed-2-12">
-        <template if="{{ isolate.topFrame == null }}">
-          idle
-        </template>
-        <template if="{{ isolate.topFrame != null }}">
-          run
-        </template>
-        ( <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a> )
+      <div class="flex-item-20-percent">
+        <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
+      </div>
+      <div class="flex-item-50-percent">
+        <isolate-location isolate="{{ isolate }}"></isolate-location>
+      </div>
+      <div class="flex-item-10-percent">
       </div>
     </div>
 
-    <div class="counters">
-      <template repeat="{{ key in isolate.counters.keys }}">
-        <div class="counter">{{ key }} ({{ isolate.counters[key] }})</div>
-      </template>
+    <div class="flex-row">
+      <div class="flex-item-20-percent"></div>
+      <div class="flex-item-60-percent">
+        <hr>
+      </div>
+      <div class="flex-item-20-percent"></div>
     </div>
 
-    <template if="{{ isolate.topFrame != null }}">
-      <script-inset script="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}">
-        <function-ref ref="{{ isolate.topFrame['function'] }}"></function-ref>
-        (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
-      </script-inset>
+    <isolate-shared-summary isolate="{{ isolate }}"></isolate-shared-summary>
+
+  </template>
+</polymer-element>
+
+<polymer-element name="isolate-run-state" extends="observatory-element">
+  <template>
+    <template if="{{ isolate.pauseEvent != null }}">
+      <strong>paused</strong>
+      <action-link callback="{{ resume }}" label="resume"></action-link>
+    </template>
+
+    <template if="{{ isolate.running }}">
+      <strong>running</strong>
+      <action-link callback="{{ pause }}" label="pause"></action-link>
+    </template>
+
+    <template if="{{ isolate.idle }}">
+      <strong>idle</strong>
+    </template>
+
+    <template if="{{ isolate.loading }}">
+      <strong>loading...</strong>
     </template>
   </template>
-  
 </polymer-element>
+
+<polymer-element name="isolate-location" extends="observatory-element">
+  <template>
+    <template if="{{ isolate.pauseEvent != null }}">
+      <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateCreated' }}">
+        at isolate start
+      </template>
+      <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateShutdown' }}">
+        at isolate exit
+      </template>
+      <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateInterrupted' }}">
+        at
+        <function-ref ref="{{ isolate.topFrame['function'] }}">
+        </function-ref>
+        (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+      </template>
+      <template if="{{ isolate.pauseEvent['eventType'] == 'BreakpointReached' }}">
+        at breakpoint {{ isolate.pauseEvent['breakpoint']['id'] }}
+        <function-ref ref="{{ isolate.topFrame['function'] }}">
+        </function-ref>
+        (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+      </template>
+    </template>
+
+    <template if="{{ isolate.running }}">
+      at
+      <function-ref ref="{{ isolate.topFrame['function'] }}">
+      </function-ref>
+      (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+    </template>
+
+  </template>
+</polymer-element>
+
+<polymer-element name="isolate-shared-summary" extends="observatory-element">
+  <template>
+    <style>
+      .errorBox {
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: pre;
+      }
+    </style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <template if="{{ isolate.error != null }}">
+      <div class="content-centered">
+        <pre class="errorBox">{{ isolate.error.message }}</pre>
+        <br>
+      </div>
+    </template>
+    <div class="flex-row">
+      <div class="flex-item-10-percent">
+      </div>
+      <div class="flex-item-40-percent">
+        <isolate-counter-chart counters="{{ isolate.counters }}"></isolate-counter-chart>
+      </div>
+      <div class="flex-item-40-percent">
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberName">new heap</div>
+              <div class="memberValue">
+                {{ isolate.newHeapUsed | formatSize }}
+                of
+                {{ isolate.newHeapCapacity | formatSize }}
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberName">old heap</div>
+              <div class="memberValue">
+                {{ isolate.oldHeapUsed | formatSize }}
+                of
+                {{ isolate.oldHeapCapacity | formatSize }}
+              </div>
+            </div>
+          </div>
+          <br>
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+            </div>
+          </div>
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+              </div>
+            </div>
+          </div>
+      </div>
+      <div class="flex-item-10-percent">
+      </div>
+    </div>
+  </template>
+</polymer-element>
+
+<polymer-element name="isolate-counter-chart" extends="observatory-element">
+  <template>
+    <div id="counterPieChart" style="height: 200px"></div>
+  </template>
+</polymer-element>
+
+
 <polymer-element name="isolate-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
@@ -1229,85 +1362,48 @@
 
     <div class="content">
       <h1>isolate '{{ isolate.name }}'</h1>
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberName">status</div>
-          <div class="memberValue">
-            <template if="{{ isolate.pausedOnStart }}">
-              <strong style="color:darkred;">paused</strong> @ isolate start
-              <span style="padding-left:20px;">
-                [<a on-click="{{ resume }}">resume</a>]
-              </span>
-            </template>
-
-            <template if="{{ isolate.pausedOnExit }}">
-              <strong style="color:darkred;">paused</strong> @ isolate exit
-              <span style="padding-left:20px;">
-                [<a on-click="{{ resume }}">resume</a>]
-              </span>
-            </template>
-
-            <template if="{{ isolate.running }}">
-              <strong>running</strong>
-              @
-              <function-ref ref="{{ isolate.topFrame['function'] }}">
-              </function-ref>
-              (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}">
-              </script-ref>)
-            </template>
-
-            <template if="{{ isolate.idle }}">
-              <strong>idle</strong>
-            </template>
-          </div>
-        </div>
-      </div>
     </div>
 
-    <template if="{{ isolate.error != null }}">
-      <div class="content">
-        <h1>Error</h1>
-        <div class="memberList">
-          <div class="memberItem">
-            <div class="memberName">message</div>
-            <div class="memberValue">
-              <pre>{{ isolate.error.message }}</pre>
-            </div>
-          </div>
-          <div class="memberItem">
-            <template if="{{ isolate.error.exception != null }}">
-              <div class="memberName">exception</div>
-              <div class="memberValue">
-                <instance-ref ref="{{ isolate.error.exception }}"></instance-ref>
-              </div>
-            </template>
-          </div>
-          <div class="memberItem">
-            <template if="{{ isolate.error.stacktrace != null }}">
-            <div class="memberName">stacktrace</div>
-            <div class="memberValue">
-              <instance-ref ref="{{ isolate.error.stacktrace }}"></instance-ref>
-            </div>
-            </template>
-          </div>
-        </div>
+    <br>
+    <div class="flex-row">
+      <div class="flex-item-10-percent">
       </div>
-      <hr>
-    </template>
-
+      <div class="flex-item-20-percent">
+        <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
+      </div>
+      <div class="flex-item-60-percent">
+        <isolate-location isolate="{{ isolate }}"></isolate-location>
+      </div>
+      <div class="flex-item-10-percent">
+      </div>
+    </div>
     <br>
 
     <template if="{{ isolate.topFrame != null }}">
+      <br>
       <script-inset script="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}">
       </script-inset>
     </template>
 
+    <div class="flex-row">
+      <div class="flex-item-20-percent"></div>
+      <div class="flex-item-60-percent"><hr></div>
+      <div class="flex-item-20-percent"></div>
+    </div>
+
     <br>
 
+    <isolate-shared-summary isolate="{{ isolate }}"></isolate-shared-summary>
+
+    <div class="flex-row">
+      <div class="flex-item-20-percent"></div>
+      <div class="flex-item-60-percent"><hr></div>
+      <div class="flex-item-20-percent"></div>
+    </div>
+
     <div class="content-centered">
       <div class="flex-row">
-
-        <div class="flex-item-fixed-6-12">
+        <div class="flex-item-50-percent">
           <div class="memberList">
             <div class="memberItem">
               <div class="memberName">root library</div>
@@ -1324,65 +1420,20 @@
               </template>
             </div>
             <div class="memberItem">
-              <div class="memberName">id</div>
+              <div class="memberName">isolate id</div>
               <div class="memberValue">{{ isolate.mainPort }}</div>
             </div>
-            <br>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
-
-              </div>
+          </div>
+        </div>
+        <div class="flex-item-50-percent">
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
             </div>
           </div>
         </div>
-
-        <div class="flex-item-fixed-6-12">
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberName">new heap</div>
-              <div class="memberValue">
-                {{ isolate.newHeapUsed | formatSize }}
-                of
-                {{ isolate.newHeapCapacity | formatSize }}
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberName">old heap</div>
-              <div class="memberValue">
-                {{ isolate.oldHeapUsed | formatSize }}
-                of
-                {{ isolate.oldHeapCapacity | formatSize }}
-              </div>
-            </div>
-          </div>
-          <br>
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
-              </div>
-            </div>
-          </div>
-        </div>
-
-      </div> <!-- flex row -->
-    </div> <!-- content -->
+      </div>
+    </div>
 
     <hr>
 
@@ -1404,13 +1455,6 @@
     <hr>
 
     <div class="content">
-      <div class="memberValue">Isolate execution</div>
-      <template repeat="{{ key in isolate.counters.keys }}">
-        <div class="memberValue">{{ key }} ({{ isolate.counters[key] }})</div>
-      </template>
-    </div>
-
-    <div class="content">
       <div id="tagProfileChart" class="miniProfileChart" style="height: 600px"></div>
     </div>
 
@@ -2087,6 +2131,7 @@
 </polymer-element>
 <polymer-element name="script-view" extends="observatory-element">
 <template>
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
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 96cd048..ed9c8d4 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
@@ -53,7 +53,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDD:"classes",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJJ:"imports",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gMz:"__$pad",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPl:"__$busy",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXR:"scripts",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ3:"variables",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gmu:"functions",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goM:"__$expand",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",VnP:"hitStyleNotExecuted",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function(a){"use strict"
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDD:"classes",gDe:"__$function",gDu:"exclusiveTicks",gE1:"__$counters",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJJ:"imports",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gKW:"__$label",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gMz:"__$pad",gNT:"__$refreshTime",gNo:"__$uncheckedText",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXR:"scripts",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ3:"variables",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdB:"__$callback",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",gfi:"__$busy",ghX:"__$endPos",ghi:"_fragmentationCanvas",giF:"chart",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gmu:"functions",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goM:"__$expand",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",VnP:"hitStyleNotExecuted",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function(a){"use strict"
 function map(b){b={x:b}
 delete b.x
 return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
@@ -154,9 +154,9 @@
 HT:{
 "^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
 "^":"",
-x:function(a){return void 0},
-Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-ks:function(a){var z,y,x,w
+x:[function(a){return void 0},"$1","Ue",2,0,null,6,[]],
+Qu:[function(a,b,c,d){return{i:a,p:b,e:c,x:d}},"$4","yC",8,0,null,7,[],8,[],9,[],10,[]],
+ks:[function(a){var z,y,x,w
 z=a[init.dispatchPropertyName]
 if(z==null)if($.Bv==null){H.XD()
 z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
@@ -167,54 +167,57 @@
 if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.w3(a)
 if(w==null){y=Object.getPrototypeOf(a)
 if(y==null||y===Object.prototype)return C.ZQ
-else return C.vB}return w},
-e1:function(a){var z,y,x,w
+else return C.vB}return w},"$1","mz",2,0,null,6,[]],
+e1:[function(a){var z,y,x,w
 z=$.Au
 if(z==null)return
 y=z
 for(z=y.length,x=J.x(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
-if(x.n(a,y[w]))return w}return},
-Xr:function(a){var z,y,x
+if(x.n(a,y[w]))return w}return},"$1","kC",2,0,null,11,[]],
+Xr:[function(a){var z,y,x
 z=J.e1(a)
 if(z==null)return
 y=$.Au
 x=z+1
 if(x>=y.length)return H.e(y,x)
-return y[x]},
-Nq:function(a,b){var z,y,x
+return y[x]},"$1","Tj",2,0,null,11,[]],
+Nq:[function(a,b){var z,y,x
 z=J.e1(a)
 if(z==null)return
 y=$.Au
 x=z+2
 if(x>=y.length)return H.e(y,x)
-return y[x][b]},
+return y[x][b]},"$2","BJ",4,0,null,11,[],12,[]],
 Gv:{
 "^":"a;",
 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,74,[]],
+T:function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},
+gbx:function(a){return new H.cu(H.dJ(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
-yEe:{
-"^":"Gv;",
+kn:{
+"^":"bool/Gv;",
 bu:function(a){return String(a)},
 giO:function(a){return a?519018:218159},
-$isa2:true},
+gbx:function(a){return C.HL},
+$isbool:true},
 Jh:{
-"^":"Gv;",
+"^":"Null/Gv;",
 n:function(a,b){return null==b},
 bu:function(a){return"null"},
 giO:function(a){return 0},
-T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,74,[]]},
+gbx:function(a){return C.Qf}},
 Ue1:{
 "^":"Gv;",
-giO:function(a){return 0}},
+giO:function(a){return 0},
+gbx:function(a){return C.CS}},
 FP:{
 "^":"Ue1;"},
 is:{
 "^":"Ue1;"},
 Q:{
-"^":"Gv;",
+"^":"List/Gv;",
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
 a.push(b)},
 KI:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
@@ -230,12 +233,12 @@
 for(z=0;z<a.length;++z)if(J.de(a[z],b)){a.splice(z,1)
 return!0}return!1},
 ev:function(a,b){return H.VM(new H.U5(a,b),[null])},
-Ft:[function(a,b){return H.VM(new H.kV(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")}],
+Ft:[function(a,b){return H.VM(new H.kV(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},128,[]],
 FV:function(a,b){var z
 for(z=J.GP(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
 aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")}],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},128,[]],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -308,9 +311,9 @@
 if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
 a[b]=c},
-$isQ:true,
-$iszM:true,
-$aszM:null,
+$isList:true,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -324,11 +327,11 @@
 $isnM:true},
 iY:{
 "^":"nM;"},
-Ib:{
+H6:{
 "^":"nM;",
-$isIb:true},
+$isH6:true},
 P:{
-"^":"Gv;",
+"^":"num/Gv;",
 iM:function(a,b){var z
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a<b)return-1
@@ -403,25 +406,27 @@
 return a<=b},
 F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return a>=b},
-$islf:true,
-static:{"^":"SAz,yc"}},
-imn:{
-"^":"P;",
-$isCP:true,
-$islf:true,
-$isKN:true},
+$isnum:true,
+static:{"^":"SAz,N6l"}},
+bU:{
+"^":"int/P;",
+gbx:function(a){return C.yw},
+$isdouble:true,
+$isnum:true,
+$isint:true},
 Pp:{
-"^":"P;",
-$isCP:true,
-$islf:true},
+"^":"double/P;",
+gbx:function(a){return C.O4},
+$isdouble:true,
+$isnum:true},
 x1:{
-"^":"imn;"},
+"^":"bU;"},
 VP:{
 "^":"x1;"},
 qa:{
 "^":"VP;"},
 O:{
-"^":"Gv;",
+"^":"String/Gv;",
 j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
@@ -518,27 +523,28 @@
 y^=y>>6}y=536870911&y+((67108863&y)<<3>>>0)
 y^=y>>11
 return 536870911&y+((16383&y)<<15>>>0)},
+gbx:function(a){return C.Db},
 gB:function(a){return a.length},
 t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
 return a[b]},
-$isqU:true,
-static:{Ga:function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
+$isString:true,
+static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},mm:function(a,b){var z,y
+default:return!1}},"$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
 for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
 y=a.charCodeAt(b)
-if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},r9:function(a,b){var z,y,x
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
 for(z=a.length;b>0;b=y){y=b-1
 if(y>=z)H.vh(P.N(y))
 x=a.charCodeAt(y)
-if(x!==32&&x!==13&&!J.Ga(x))break}return b}}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+if(x!==32&&x!==13&&!J.Ga(x))break}return b},"$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
 "^":"",
-zd:function(a,b){var z=a.vV(0,b)
+zd:[function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
-return z},
-ox:function(){--init.globalState.Xz.GL},
-oT:function(a,b){var z,y,x,w,v,u
+return z},"$2","RTQ",4,0,null,16,[],17,[]],
+ox:[function(){--init.globalState.Xz.GL},"$0","q4",0,0,null],
+oT:[function(a,b){var z,y,x,w,v,u
 z={}
 z.a=b
 b=b
@@ -546,14 +552,14 @@
 if(b==null){b=[]
 z.a=b
 y=b}else y=b
-if(!J.x(y).$iszM)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
+if(!J.x(y).$isList)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
 y=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
 y.i6(a)
 init.globalState=y
 if(init.globalState.EF===!0)return
 y=init.globalState.Hg++
-x=P.L5(null,null,null,P.KN,H.yo)
-w=P.Ls(null,null,null,P.KN)
+x=P.L5(null,null,null,J.bU,H.yo)
+w=P.Ls(null,null,null,J.bU)
 v=new H.yo(0,null,!1)
 u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
 w.h(0,0)
@@ -565,21 +571,21 @@
 if(x)u.vV(0,new H.PK(z,a))
 else{y=H.KT(y,[y,y]).BD(a)
 if(y)u.vV(0,new H.JO(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},
-yl:function(){var z=init.currentScript
+else u.vV(0,a)}init.globalState.Xz.bL()},"$2","wr",4,0,null,18,[],19,[]],
+yl:[function(){var z=init.currentScript
 if(z!=null)return String(z.src)
 if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.fU()
 if(typeof version=="function"&&typeof system=="function")return thisFilename()
 if(init.globalState.EF===!0)return H.fU()
-return},
-fU:function(){var z,y
+return},"$0","dY",0,0,null],
+fU:[function(){var z,y
 z=new Error().stack
 if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
 if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
 if(y!=null)return y[1]
 y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
 if(y!=null)return y[1]
-throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
+throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},"$0","mZ",0,0,null],
 Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=H.Hh(b.data)
 y=J.U6(z)
@@ -592,8 +598,8 @@
 s=y.t(z,"startPaused")
 r=H.Hh(y.t(z,"replyTo"))
 y=init.globalState.Hg++
-q=P.L5(null,null,null,P.KN,H.yo)
-p=P.Ls(null,null,null,P.KN)
+q=P.L5(null,null,null,J.bU,H.yo)
+p=P.Ls(null,null,null,J.bU)
 o=new H.yo(0,null,!1)
 n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
 p.h(0,0)
@@ -631,15 +637,15 @@
 y.toString
 self.postMessage(q)}else P.JS(y.t(z,"msg"))
 break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,6,[],7,[]],
-ZF:function(a){var z,y,x,w
+case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,20,[],21,[]],
+ZF:[function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.vd
 x=H.Gy(P.EF(["command","log","msg",a],null,null))
 y.toString
 self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
 z=new H.XO(w,null)
-throw H.b(P.FM(z))}},
-Ws:function(a,b,c,d,e,f){var z,y,x,w
+throw H.b(P.FM(z))}},"$1","eR",2,0,null,22,[]],
+Ws:[function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
 $.te=$.te+("_"+y)
@@ -650,24 +656,24 @@
 J.Sq(f,["spawned",new H.Z6(y,x),w,z.PX])
 x=new H.Vg(a,b,c,d)
 if(e===!0){z.v8(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},
-Gy:function(a){var z
+init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},"$6","op",12,0,null,23,[],19,[],24,[],25,[],26,[],27,[]],
+Gy:[function(a){var z
 if(init.globalState.ji===!0){z=new H.NA(0,new H.X1())
 z.il=new H.fP(null)
 return z.h7(a)}else{z=new H.NO(new H.X1())
 z.il=new H.fP(null)
-return z.h7(a)}},
-Hh:function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},
-VO: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"},
+return z.h7(a)}},"$1","YH",2,0,null,24,[]],
+Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
+else return a},"$1","m6",2,0,null,24,[]],
+VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","lF",2,0,null,28,[]],
+ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","dD",2,0,null,28,[]],
 PK:{
-"^":"Tp:22;a,b",
-$0:function(){this.b.$1(this.a.a)},
+"^":"Tp:115;a,b",
+$0:[function(){this.b.$1(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 JO:{
-"^":"Tp:22;a,c",
-$0:function(){this.c.$2(this.a.a,null)},
+"^":"Tp:115;a,c",
+$0:[function(){this.c.$2(this.a.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 f0:{
 "^":"a;Hg,oL,hJ,N0,Nr,Xz,vu,EF,ji,i2<,vd,XC,w2<",
@@ -681,8 +687,8 @@
 this.ji=y
 this.vu=z&&!x
 this.Xz=new H.cC(P.NZ(null,H.IY),0)
-this.i2=P.L5(null,null,null,P.KN,H.aX)
-this.XC=P.L5(null,null,null,P.KN,null)
+this.i2=P.L5(null,null,null,J.bU,H.aX)
+this.XC=P.L5(null,null,null,J.bU,null)
 if(this.EF===!0){z=new H.JH()
 this.vd=z
 w=function(b,c){return function(d){b(c,d)}}(H.Mg,z)
@@ -779,10 +785,10 @@
 init.globalState.i2.Rz(0,this.jO)
 z=this.Jp
 if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)
-this.Jp=null}},"$0","gQb",0,0,21],
+this.Jp=null}},"$0","gQb",0,0,126],
 $isaX:true},
 NY:{
-"^":"Tp:21;a",
+"^":"Tp:126;a",
 $0:[function(){J.Sq(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
@@ -811,23 +817,23 @@
 w.toString
 self.postMessage(v)}}},
 RA:{
-"^":"Tp:21;a",
+"^":"Tp:126;a",
 $0:[function(){if(!this.a.xB())return
 P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;F1*,i3,G1*",
 VU:function(){if(this.F1.gRW()){this.F1.gC9().push(this)
-return}J.nG(this.F1,this.i3)},
+return}J.yn(this.F1,this.i3)},
 $isIY:true},
 JH:{
 "^":"a;"},
 jl:{
-"^":"Tp:22;a,b,c,d,e,f",
+"^":"Tp:115;a,b,c,d,e,f",
 $0:[function(){H.Ws(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Vg:{
-"^":"Tp:21;a,b,c,d",
+"^":"Tp:126;a,b,c,d",
 $0:[function(){var z,y,x
 if(this.d!==!0)this.a.$1(this.c)
 else{z=this.a
@@ -865,7 +871,7 @@
 $isbC:true,
 $ishq:true},
 Ua:{
-"^":"Tp:22;a,b,c",
+"^":"Tp:115;a,b,c",
 $0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
@@ -881,8 +887,8 @@
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},
 giO:function(a){var z,y,x
-z=J.c1(this.hQ,16)
-y=J.c1(this.Jz,8)
+z=J.Eh(this.hQ,16)
+y=J.Eh(this.Jz,8)
 x=this.bv
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
@@ -922,7 +928,7 @@
 yf:function(a){if(!!a.$isku)return new H.ku(a.ng)
 throw H.b("Capability not serializable: "+a.bu(0))}},
 II:{
-"^":"lY;RZ",
+"^":"Xb;RZ",
 Vf:function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.t(a,1)
@@ -960,7 +966,7 @@
 I8:function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
-if(!!z.$iszM)return this.wb(a)
+if(!!z.$isList)return this.wb(a)
 if(!!z.$isZ0)return this.TI(a)
 if(!!z.$isbC)return this.DE(a)
 if(!!z.$ishq)return this.yf(a)
@@ -994,9 +1000,9 @@
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
 OW:{
-"^":"Tp:75;a,b",
-$2:function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},
+"^":"Tp:300;a,b",
+$2:[function(a,b){var z=this.b
+J.kW(this.a.a,z.I8(a),z.I8(b))},"$2",null,4,0,null,49,[],299,[],"call"],
 $isEH:true},
 Tf:{
 "^":"BB;",
@@ -1025,7 +1031,7 @@
 x[w]=v}return x},
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
-lY:{
+Xb:{
 "^":"a;",
 QS:function(a){if(H.ZR(a))return a
 this.RZ=P.Py(null,null,null,null,null)
@@ -1088,12 +1094,12 @@
 z.Qa(a,b)
 return z}}},
 FA:{
-"^":"Tp:21;a,b",
+"^":"Tp:126;a,b",
 $0:[function(){this.a.p9=null
 this.b.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 Av:{
-"^":"Tp:21;c,d",
+"^":"Tp:126;c,d",
 $0:[function(){this.c.p9=null
 H.ox()
 this.d.$0()},"$0",null,0,0,null,"call"],
@@ -1120,23 +1126,23 @@
 $isku:true,
 $ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
-wV:function(a,b){var z
+wV:[function(a,b){var z
 if(b!=null){z=b.x
-if(z!=null)return z}return!!J.x(a).$isXj},
-d:function(a){var z
+if(z!=null)return z}return!!J.x(a).$isXj},"$2","b3",4,0,null,6,[],29,[]],
+d:[function(a){var z
 if(typeof a==="string")return a
 if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
 else if(!1===a)return"false"
 else if(a==null)return"null"
 z=J.AG(a)
 if(typeof z!=="string")throw H.b(P.u(a))
-return z},
-Hz:function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},
-eQ:function(a){var z=a.$identityHash
+return z},"$1","Sa",2,0,null,30,[]],
+Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"$1","c7",2,0,null,31,[]],
+eQ:[function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
-a.$identityHash=z}return z},
-vx:[function(a){throw H.b(P.cD(a))},"$1","Rm",2,0,8],
-BU:function(a,b,c){var z,y,x,w,v,u
+a.$identityHash=z}return z},"$1","Y0",2,0,null,6,[]],
+vx:[function(a){throw H.b(P.cD(a))},"$1","Rm",2,0,32,14,[]],
+BU:[function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.Rm()
 if(typeof a!=="string")H.vh(P.u(a))
 z=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a)
@@ -1162,48 +1168,48 @@
 if(!(v<u))break
 y.j(w,0)
 if(y.j(w,v)>x)return c.$1(a);++v}}}}if(z==null)return c.$1(a)
-return parseInt(a,b)},
-IH:function(a,b){var z,y
+return parseInt(a,b)},"$3","Yv",6,0,null,33,[],34,[],35,[]],
+IH:[function(a,b){var z,y
 if(typeof a!=="string")H.vh(P.u(a))
 if(b==null)b=H.Rm()
 if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.$1(a)
 z=parseFloat(a)
 if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.$1(a)}return z},
-lh:function(a){var z,y
+return b.$1(a)}return z},"$2","inc",4,0,null,33,[],35,[]],
+lh:[function(a){var z,y
 z=C.AS(J.x(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
 if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.xB.j(z,0)===36)z=C.xB.yn(z,1)
-return(z+H.ia(H.oX(a),0,null)).replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})},
-a5:function(a){return"Instance of '"+H.lh(a)+"'"},
-RF:function(a){var z,y,x,w,v,u
+return z+H.ia(H.oX(a),0,null)},"$1","Ig",2,0,null,6,[]],
+a5:[function(a){return"Instance of '"+H.lh(a)+"'"},"$1","jb",2,0,null,6,[]],
+RF:[function(a){var z,y,x,w,v,u
 z=a.length
 for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
 else{u=w+500
 u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},
-YF:function(a){var z,y,x
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"$1","JG",2,0,null,36,[]],
+YF:[function(a){var z,y,x
 z=[]
-z.$builtinTypeInfo=[P.KN]
+z.$builtinTypeInfo=[J.bU]
 y=new H.a7(a,a.length,0,null)
 y.$builtinTypeInfo=[H.Kp(a,0)]
 for(;y.G();){x=y.lo
 if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
 if(x<=65535)z.push(x)
 else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},
-eT:function(a){var z,y
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},"$1","nE",2,0,null,37,[]],
+eT:[function(a){var z,y
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.YF(a)}return H.RF(a)},
-Lw:function(a){var z
+if(y>65535)return H.YF(a)}return H.RF(a)},"$1","Wb",2,0,null,38,[]],
+Lw:[function(a){var z
 if(typeof a!=="number")return H.s(a)
 if(0<=a){if(a<=65535)return String.fromCharCode(a)
 if(a<=1114111){z=a-65536
-return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
-zW:function(a,b,c,d,e,f,g,h){var z,y,x,w
+return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},"$1","cK",2,0,null,39,[]],
+zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
 if(typeof a!=="number"||Math.floor(a)!==a)H.vh(P.u(a))
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
@@ -1217,14 +1223,14 @@
 if(x.E(a,0)||x.C(a,100)){w=new Date(y)
 if(h)w.setUTCFullYear(a)
 else w.setFullYear(a)
-return w.valueOf()}return y},
-o2:function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},
-VK:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-return a[b]},
-aw:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-a[b]=c},
-zo:function(a,b,c){var z,y,x
+return w.valueOf()}return y},"$8","mV",16,0,null,40,[],41,[],42,[],43,[],44,[],45,[],46,[],47,[]],
+o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
+return a.date},"$1","j1",2,0,null,48,[]],
+VK:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+return a[b]},"$2","Zl",4,0,null,6,[],49,[]],
+aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+a[b]=c},"$3","WJ",6,0,null,6,[],49,[],30,[]],
+zo:[function(a,b,c){var z,y,x
 z={}
 z.a=0
 y=[]
@@ -1232,8 +1238,8 @@
 if(b!=null){z.a=b.length
 C.Nm.FV(y,b)}z.b=""
 if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},
-im:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},"$3","pT",6,0,null,17,[],50,[],51,[]],
+im:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z={}
 if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
 if(y==null)return H.zo(a,b,c)
@@ -1253,24 +1259,33 @@
 C.Nm.FV(r,b)
 y=a["$"+q]
 if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},
-Pq:function(){var z={x:0}
+return y.apply(a,r)},"$3","fl",6,0,null,17,[],50,[],51,[]],
+mN:[function(a){if(a=="String")return C.Kn
+if(a=="int")return C.c1
+if(a=="double")return C.yX
+if(a=="num")return C.oD
+if(a=="bool")return C.Fm
+if(a=="List")return C.E3
+if(a=="Null")return C.x0
+return init.allClasses[a]},"$1","JL",2,0,null,52,[]],
+SG:[function(a){return a===C.Kn||a===C.c1||a===C.yX||a===C.oD||a===C.Fm||a===C.E3||a===C.x0},"$1","EN",2,0,null,6,[]],
+Pq:[function(){var z={x:0}
 delete z.x
-return z},
-s:function(a){throw H.b(P.u(a))},
-e:function(a,b){if(a==null)J.q8(a)
+return z},"$0","vg",0,0,null],
+s:[function(a){throw H.b(P.u(a))},"$1","Ff",2,0,null,53,[]],
+e:[function(a,b){if(a==null)J.q8(a)
 if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},
-b:function(a){var z
+throw H.b(P.N(b))},"$2","x3",4,0,null,48,[],15,[]],
+b:[function(a){var z
 if(a==null)a=new P.LK()
 z=new Error()
 z.dartException=a
 if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.Ju})
 z.name=""}else z.toString=H.Ju
-return z},
+return z},"$1","Cr",2,0,null,54,[]],
 Ju:[function(){return J.AG(this.dartException)},"$0","Eu",0,0,null],
-vh:function(a){throw H.b(a)},
-Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+vh:[function(a){throw H.b(a)},"$1","xE",2,0,null,54,[]],
+Ru:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=new H.Am(a)
 if(a==null)return
 if(typeof a!=="object")return a
@@ -1308,29 +1323,29 @@
 return z.$1(new H.W0(y,v))}}}v=typeof y==="string"?y:""
 return z.$1(new H.vV(v))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.VS()
 return z.$1(new P.AT(null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.VS()
-return a},
-CU:function(a){if(a==null||typeof a!='object')return J.v1(a)
-else return H.eQ(a)},
-B7:function(a,b){var z,y,x,w
+return a},"$1","v2",2,0,null,54,[]],
+CU:[function(a){if(a==null||typeof a!='object')return J.v1(a)
+else return H.eQ(a)},"$1","Zs",2,0,null,6,[]],
+B7:[function(a,b){var z,y,x,w
 z=a.length
 for(y=0;y<z;y=w){x=y+1
 w=x+1
-b.u(0,a[y],a[x])}return b},
+b.u(0,a[y],a[x])}return b},"$2","nD",4,0,null,56,[],57,[]],
 ft:[function(a,b,c,d,e,f,g){var z=J.x(c)
 if(z.n(c,0))return H.zd(b,new H.dr(a))
 else if(z.n(c,1))return H.zd(b,new H.TL(a,d))
 else if(z.n(c,2))return H.zd(b,new H.KX(a,d,e))
 else if(z.n(c,3))return H.zd(b,new H.uZ(a,d,e,f))
 else if(z.n(c,4))return H.zd(b,new H.OQ(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","kT",14,0,null,9,[],10,[],11,[],12,[],13,[],14,[],15,[]],
-tR:function(a,b){var z
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","mD",14,0,null,58,[],16,[],59,[],60,[],61,[],62,[],63,[]],
+tR:[function(a,b){var z
 if(a==null)return
 z=a.$identity
 if(!!z)return z
 z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.ft)
 a.$identity=z
-return z},
-iA:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return z},"$2","qN",4,0,null,58,[],64,[]],
+iA:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=b[0]
 z.$stubName
 y=z.$callName
@@ -1359,36 +1374,36 @@
 n=o.$callName
 if(n!=null){m=d?o:H.SD(a,o,t)
 w[n]=m}}w["call*"]=s
-return v},
-vq:function(a,b,c,d){var z=H.eZ
+return v},"$6","Xd",12,0,null,48,[],65,[],66,[],67,[],68,[],69,[]],
+vq:[function(a,b,c,d){var z=H.eZ
 switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
 case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
 case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
 case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
 case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
 case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
-default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
-SD:function(a,b,c){var z,y,x,w,v,u
+default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},"$4","X5",8,0,null,64,[],70,[],71,[],17,[]],
+SD:[function(a,b,c){var z,y,x,w,v,u
 if(c)return H.wg(a,b)
 z=b.$stubName
 y=b.length
 x=a[z]
 w=b==null?x==null:b===x
 if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
-if(y===0){w=$.mJ
+if(y===0){w=$.bf
 if(w==null){w=H.B3("self")
-$.mJ=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
+$.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
 v=$.OK
 $.OK=J.WB(v,1)
 return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
 w="return function("+u+"){return this."
-v=$.mJ
+v=$.bf
 if(v==null){v=H.B3("self")
-$.mJ=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
+$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
 w=$.OK
 $.OK=J.WB(w,1)
-return new Function(v+H.d(w)+"}")()},
-Z4:function(a,b,c,d){var z,y
+return new Function(v+H.d(w)+"}")()},"$3","Fw",6,0,null,48,[],17,[],72,[]],
+Z4:[function(a,b,c,d){var z,y
 z=H.eZ
 y=H.yS
 switch(b?-1:a){case 0:throw H.b(H.Ef("Intercepted function with no arguments."))
@@ -1400,8 +1415,8 @@
 case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
 default:return function(e,f,g,h){return function(){h=[g(this)]
 Array.prototype.push.apply(h,arguments)
-return e.apply(f(this),h)}}(d,z,y)}},
-wg:function(a,b){var z,y,x,w,v,u,t,s
+return e.apply(f(this),h)}}(d,z,y)}},"$4","VT",8,0,null,64,[],70,[],12,[],17,[]],
+wg:[function(a,b){var z,y,x,w,v,u,t,s
 z=H.oN()
 y=$.P4
 if(y==null){y=H.B3("receiver")
@@ -1418,40 +1433,40 @@
 y="return function("+s+"){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+", "+s+");"
 t=$.OK
 $.OK=J.WB(t,1)
-return new Function(y+H.d(t)+"}")()},
-qm:function(a,b,c,d,e,f){b.fixed$length=init
+return new Function(y+H.d(t)+"}")()},"$2","FT",4,0,null,48,[],17,[]],
+qm:[function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},
-SE:function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},
-Go:function(a,b){var z
+return H.iA(a,b,c,!!d,e,f)},"$6","Rz",12,0,null,48,[],65,[],66,[],67,[],68,[],12,[]],
+SE:[function(a,b){var z=J.U6(b)
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"$2","H7",4,0,null,30,[],74,[]],
+Go:[function(a,b){var z
 if(a!=null)z=typeof a==="object"&&J.x(a)[b]
 else z=!0
 if(z)return a
-H.SE(a,b)},
-ag:function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},
-KT:function(a,b,c){return new H.tD(a,b,c,null)},
-Og:function(a,b){var z=a.name
+H.SE(a,b)},"$2","CY",4,0,null,30,[],74,[]],
+ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"$1","RK",2,0,null,75,[]],
+KT:[function(a,b,c){return new H.tD(a,b,c,null)},"$3","HN",6,0,null,77,[],78,[],79,[]],
+Og:[function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.tu(z)
-return new H.fw(z,b,null)},
-N7:function(){return C.KZ},
-uV:function(a){return new H.cu(a,null)},
-VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},
-oX:function(a){if(a==null)return
-return a.$builtinTypeInfo},
-IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
-ip:function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},
-Kp:function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},
-Ko:function(a,b){if(a==null)return"dynamic"
+return new H.fw(z,b,null)},"$2","ZPJ",4,0,null,80,[],81,[]],
+N7:[function(){return C.KZ},"$0","cI",0,0,null],
+uV:[function(a){return new H.cu(a,null)},"$1","IZ",2,0,null,12,[]],
+VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
+return a},"$2","Ub",4,0,null,82,[],83,[]],
+oX:[function(a){if(a==null)return
+return a.$builtinTypeInfo},"$1","Cb",2,0,null,82,[]],
+IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"$2","PE",4,0,null,82,[],84,[]],
+ip:[function(a,b,c){var z=H.IM(a,b)
+return z==null?null:z[c]},"$3","Cn",6,0,null,82,[],84,[],15,[]],
+Kp:[function(a,b){var z=H.oX(a)
+return z==null?null:z[b]},"$2","tC",4,0,null,82,[],15,[]],
+Ko:[function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
 else if(typeof a==="number"&&Math.floor(a)===a)if(b==null)return C.jn.bu(a)
 else return b.$1(a)
-else return},
-ia:function(a,b,c){var z,y,x,w,v,u
+else return},"$2$onTypeVariable","bR",2,3,null,85,11,[],86,[]],
+ia:[function(a,b,c){var z,y,x,w,v,u
 if(a==null)return""
 z=P.p9("")
 for(y=b,x=!0,w=!0;y<a.length;++y){if(x)x=!1
@@ -1459,35 +1474,34 @@
 v=a[y]
 if(v!=null)w=!1
 u=H.Ko(v,c)
-z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
-dJ:function(a){var z=J.x(a).constructor.builtin$cls
-if(a==null)return z
-return z+H.ia(a.$builtinTypeInfo,0,null)},
-Y9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
+z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},"$3$onTypeVariable","iM",4,3,null,85,87,[],88,[],86,[]],
+dJ:[function(a){var z=typeof a==="object"&&a!==null&&a.constructor===Array?"List":J.x(a).constructor.builtin$cls
+return z+H.ia(a.$builtinTypeInfo,0,null)},"$1","Yx",2,0,null,6,[]],
+Y9:[function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
 else if(typeof a=="function"){a=H.ml(a,null,b)
 if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function")b=H.ml(a,null,b)}return b},
-RB:function(a,b,c,d){var z,y
+else if(typeof a=="function")b=H.ml(a,null,b)}return b},"$2","zL",4,0,null,89,[],90,[]],
+RB:[function(a,b,c,d){var z,y
 if(a==null)return!1
 z=H.oX(a)
 y=J.x(a)
 if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},
-hv:function(a,b){var z,y
+return H.hv(H.Y9(y[d],z),c)},"$4","Ap",8,0,null,6,[],91,[],92,[],93,[]],
+hv:[function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
 for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},
-IG:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
-XY:function(a,b){var z,y
-if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="L9"
+return!0},"$2","QY",4,0,null,94,[],95,[]],
+IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"$3","k2",6,0,null,96,[],97,[],98,[]],
+XY:[function(a,b){var z,y
+if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="Null"
 if(b==null)return!0
 z=H.oX(a)
 a=J.x(a)
 if(z!=null){y=z.slice()
 y.splice(0,0,a)}else y=a
-return H.t1(y,b)},
-t1:function(a,b){var z,y,x,w,v,u,t
+return H.t1(y,b)},"$2","Dk",4,0,null,99,[],95,[]],
+t1:[function(a,b){var z,y,x,w,v,u,t
 if(a===b)return!0
 if(a==null||b==null)return!0
 if("func" in b){if(!("func" in a)){if("$is_"+H.d(b.func) in a)return!0
@@ -1504,8 +1518,8 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},
-Hc:function(a,b,c){var z,y,x,w,v
+return H.hv(H.Y9(t,y),w)},"$2","Mb",4,0,null,94,[],95,[]],
+Hc:[function(a,b,c){var z,y,x,w,v
 if(b==null&&a==null)return!0
 if(b==null)return c
 if(a==null)return!1
@@ -1514,8 +1528,8 @@
 if(c){if(z<y)return!1}else if(z!==y)return!1
 for(x=0;x<y;++x){w=a[x]
 v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},
-Vt:function(a,b){var z,y,x,w,v,u
+if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"$3","d1",6,0,null,94,[],95,[],100,[]],
+Vt:[function(a,b){var z,y,x,w,v,u
 if(b==null)return!0
 if(a==null)return!1
 z=Object.getOwnPropertyNames(b)
@@ -1525,8 +1539,8 @@
 if(!Object.hasOwnProperty.call(a,w))return!1
 v=b[w]
 u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},
-Ly:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"$2","y3",4,0,null,94,[],95,[]],
+Ly:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(!("func" in a))return!1
 if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
 y=b.ret
@@ -1547,13 +1561,13 @@
 n=w[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
 n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
-ml:function(a,b,c){return a.apply(b,c)},
-kj:function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
-wzi:function(a){return H.eQ(a)},
-iw:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
-w3:function(a){var z,y,x,w,v,u
+if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"$2","Sj",4,0,null,94,[],95,[]],
+ml:[function(a,b,c){return a.apply(b,c)},"$3","fW",6,0,null,17,[],48,[],90,[]],
+kj:[function(a){var z=$.NF
+return"Instance of "+(z==null?"<Unknown>":z.$1(a))},"$1","aZ",2,0,null,101,[]],
+wzi:[function(a){return H.eQ(a)},"$1","nR",2,0,null,6,[]],
+iw:[function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},"$3","OU",6,0,null,101,[],74,[],30,[]],
+w3:[function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.nw[z]
 if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
@@ -1578,20 +1592,20 @@
 if(v==="*")throw H.b(P.SY(z))
 if(init.leafTags[z]===true){u=H.Va(x)
 Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}else return H.Lc(a,x)},
-Lc:function(a,b){var z,y
+return u.i}else return H.Lc(a,x)},"$1","eU",2,0,null,101,[]],
+Lc:[function(a,b){var z,y
 z=Object.getPrototypeOf(a)
 y=J.Qu(b,z,null,null)
 Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return b},
-Va:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
-VF:function(a,b,c){var z=b.prototype
+return b},"$2","qF",4,0,null,101,[],7,[]],
+Va:[function(a){return J.Qu(a,!1,null,!!a.$isXj)},"$1","MlJ",2,0,null,7,[]],
+VF:[function(a,b,c){var z=b.prototype
 if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},
-XD:function(){if(!0===$.Bv)return
+else return J.Qu(z,c,null,null)},"$3","vi",6,0,null,102,[],103,[],8,[]],
+XD:[function(){if(!0===$.Bv)return
 $.Bv=!0
-H.Z1()},
-Z1:function(){var z,y,x,w,v,u,t
+H.Z1()},"$0","Ki",0,0,null],
+Z1:[function(){var z,y,x,w,v,u,t
 $.nw=Object.create(null)
 $.vv=Object.create(null)
 H.kO()
@@ -1607,8 +1621,8 @@
 z["~"+w]=t
 z["-"+w]=t
 z["+"+w]=t
-z["*"+w]=t}}},
-kO:function(){var z,y,x,w,v,u,t
+z["*"+w]=t}}},"$0","vU",0,0,null],
+kO:[function(){var z,y,x,w,v,u,t
 z=C.MA()
 z=H.ud(C.Mc,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ur(C.AS),z)))))))
 if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
@@ -1619,9 +1633,9 @@
 t=z.prototypeForTag
 $.NF=new H.dC(v)
 $.TX=new H.wN(u)
-$.x7=new H.VX(t)},
-ud:function(a,b){return a(b)||b},
-ZT:function(a,b){var z,y,x,w,v,u
+$.x7=new H.VX(t)},"$0","Hb",0,0,null],
+ud:[function(a,b){return a(b)||b},"$2","rM",4,0,null,104,[],105,[]],
+ZT:[function(a,b){var z,y,x,w,v,u
 z=H.VM([],[P.Od])
 y=b.length
 x=a.length
@@ -1630,25 +1644,25 @@
 z.push(new H.tQ(v,b,a))
 u=v+x
 if(u===y)break
-else w=v===u?w+1:u}return z},
-m2:function(a,b,c){var z,y
+else w=v===u?w+1:u}return z},"$2","tl",4,0,null,110,[],111,[]],
+m2:[function(a,b,c){var z,y
 if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
 else{z=J.x(b)
 if(!!z.$isVR){z=C.xB.yn(a,c)
 y=b.Ej
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},
-ys:function(a,b,c){var z,y,x,w,v
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"$3","WL",6,0,null,48,[],112,[],88,[]],
+ys:[function(a,b,c){var z,y,x,w,v
 if(typeof b==="string")if(b==="")if(a==="")return c
 else{z=P.p9("")
 y=a.length
 z.KF(c)
 for(x=0;x<y;++x){w=a[x]
 w=z.vM+=w
-z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))
+z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace("$","$$$$"))
 else if(!!J.x(b).$isVR){v=b.gl9()
 v.lastIndex=0
-return a.replace(v,c.replace(/\$/g,"$$$$"))}else{if(b==null)H.vh(P.u(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},
+return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(P.u(null))
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"$3","uF",6,0,null,48,[],113,[],114,[]],
 Zd:{
 "^":"a;"},
 xQ:{
@@ -1684,12 +1698,12 @@
 $isyN:true},
 LD:{
 "^":"Tp;a,b",
-$1:function(a){return J.de(a,this.b)},
+$1:[function(a){return J.de(a,this.b)},"$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
 jJ:{
-"^":"Tp:16;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,76,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,49,[],"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -1807,7 +1821,7 @@
 z={}
 if(this.NE==null){y=this.hG
 this.NE=Array(y)
-x=P.Fl(P.qU,P.KN)
+x=P.Fl(J.O,J.bU)
 for(w=this.Rv,v=0;v<y;++v){u=w+v
 x.u(0,this.XL(u),u)}z.a=0
 y=x.gvc()
@@ -1823,35 +1837,36 @@
 H.VM(y,y["<>"])
 return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},
 gx5:function(){return this.mr.$reflectionName},
-static:{"^":"qg,FV,C1,bt",zh:function(a){var z,y,x
+static:{"^":"vS,FV,C1,bt",zh:function(a){var z,y,x,w
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
 z=z
 y=z[0]
-x=z[1]
-return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
+x=y>>1
+w=z[1]
+return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
 Nv:{
-"^":"Tp:8;a,b,c",
-$1:function(a){var z,y,x
+"^":"Tp:32;a,b,c",
+$1:[function(a){var z,y,x
 z=this.b.NE
 y=this.a.a++
 x=this.c.t(0,a)
 if(y>=z.length)return H.e(z,y)
-z[y]=x},
+z[y]=x},"$1",null,2,0,null,12,[],"call"],
 $isEH:true},
 Cj:{
-"^":"Tp:77;a,b,c",
-$2:function(a,b){var z=this.a
+"^":"Tp:301;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},
+this.b.push(b);++z.a},"$2",null,4,0,null,12,[],53,[],"call"],
 $isEH:true},
 u8:{
-"^":"Tp:77;a,b",
-$2:function(a,b){var z=this.b
+"^":"Tp:301;a,b",
+$2:[function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},
+else this.a.a=!0},"$2",null,4,0,null,302,[],30,[],"call"],
 $isEH:true},
 Zr:{
 "^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -1870,7 +1885,7 @@
 x=this.EP
 if(x!==-1)y.receiver=z[x+1]
 return y},
-static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:function(a){var z,y,x,w,v,u
+static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
 a=a.replace(String({}),'$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
 if(z==null)z=[]
@@ -1879,8 +1894,8 @@
 w=z.indexOf("\\$expr\\$")
 v=z.indexOf("\\$method\\$")
 u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},S7:function(a){return function($expr$){var $argumentsExpr$='$arguments$'
-try{$expr$.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},Mj:function(a){return function($expr$){try{$expr$.$method$}catch(z){return z.message}}(a)}}},
+return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"$1","dx",2,0,null,24,[]],S7:[function(a){return function(b){var $argumentsExpr$='$arguments$'
+try{b.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},"$1","LS",2,0,null,55,[]],Mj:[function(a){return function(b){try{b.$method$}catch(z){return z.message}}(a)},"$1","cl",2,0,null,55,[]]}},
 W0:{
 "^":"Ge;K9,Ga",
 bu:function(a){var z=this.Ga
@@ -1908,9 +1923,9 @@
 bu:function(a){var z=this.K9
 return C.xB.gl0(z)?"Error":"Error: "+z}},
 Am:{
-"^":"Tp:16;a",
-$1:function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},
+"^":"Tp:116;a",
+$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
+return a},"$1",null,2,0,null,171,[],"call"],
 $isEH:true},
 XO:{
 "^":"a;lA,ui",
@@ -1923,31 +1938,30 @@
 this.ui=z
 return z}},
 dr:{
-"^":"Tp:22;a",
-$0:function(){return this.a.$0()},
+"^":"Tp:115;a",
+$0:[function(){return this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 TL:{
-"^":"Tp:22;b,c",
-$0:function(){return this.b.$1(this.c)},
+"^":"Tp:115;b,c",
+$0:[function(){return this.b.$1(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 KX:{
-"^":"Tp:22;d,e,f",
-$0:function(){return this.d.$2(this.e,this.f)},
+"^":"Tp:115;d,e,f",
+$0:[function(){return this.d.$2(this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uZ:{
-"^":"Tp:22;UI,bK,Gq,Rm",
-$0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
+"^":"Tp:115;UI,bK,Gq,Rm",
+$0:[function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},"$0",null,0,0,null,"call"],
 $isEH:true},
 OQ:{
-"^":"Tp:22;w3,HZ,mG,xC,cj",
-$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
+"^":"Tp:115;w3,HZ,mG,xC,cj",
+$0:[function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Tp:{
 "^":"a;",
 bu:function(a){return"Closure"},
 $isTp:true,
-$isEH:true,
-gKu:function(){return this}},
+$isEH:true},
 Bp:{
 "^":"Tp;",
 $isBp:true},
@@ -1963,15 +1977,15 @@
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.jm))},
 $isv:true,
-static:{"^":"mJ,P4",eZ:function(a){return a.gnw()},yS:function(a){return a.EP},oN:function(){var z=$.mJ
+static:{"^":"bf,P4",eZ:[function(a){return a.gnw()},"$1","PR",2,0,null,58,[]],yS:[function(a){return a.EP},"$1","xm",2,0,null,58,[]],oN:[function(){var z=$.bf
 if(z==null){z=H.B3("self")
-$.mJ=z}return z},B3:function(a){var z,y,x,w,v
+$.bf=z}return z},"$0","uT",0,0,null],B3:[function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
 y=Object.getOwnPropertyNames(z)
 y.fixed$length=init
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
-if(z[v]===a)return v}}}},
+if(z[v]===a)return v}},"$1","ec",2,0,null,73,[]]}},
 qq:{
 "^":"a;Jy"},
 va:{
@@ -2025,11 +2039,11 @@
 for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
 if(w)x+=", "
 x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},
-static:{"^":"Jl",Dz:function(a){var z,y,x
+static:{"^":"Jl",Dz:[function(a){var z,y,x
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z}}},
+return z},"$1","At",2,0,null,76,[]]}},
 hJ:{
 "^":"q1;",
 bu:function(a){return"dynamic"},
@@ -2064,10 +2078,12 @@
 static:{WE:function(a){return new H.oQ(a)}}},
 cu:{
 "^":"a;LU<,ke",
-bu:function(a){var z,y
+bu:function(a){var z,y,x
 z=this.ke
 if(z!=null)return z
-y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
+y=this.LU
+x=init.mangledGlobalNames[y]
+y=x==null?y:x
 this.ke=y
 return y},
 giO:function(a){return J.v1(this.LU)},
@@ -2075,32 +2091,32 @@
 return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},
 $iscu:true,
 $isuq:true},
-bB:{
+QT:{
 "^":"a;XP<,oc>,kU>"},
 dC:{
-"^":"Tp:16;a",
-$1:function(a){return this.a(a)},
+"^":"Tp:116;a",
+$1:[function(a){return this.a(a)},"$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 wN:{
-"^":"Tp:78;b",
-$2:function(a,b){return this.b(a,b)},
+"^":"Tp:303;b",
+$2:[function(a,b){return this.b(a,b)},"$2",null,4,0,null,99,[],102,[],"call"],
 $isEH:true},
 VX:{
-"^":"Tp:8;c",
-$1:function(a){return this.c(a)},
+"^":"Tp:32;c",
+$1:[function(a){return this.c(a)},"$1",null,2,0,null,102,[],"call"],
 $isEH:true},
 VR:{
-"^":"a;zO,Ej,Ii,Ua",
+"^":"a;Ej,Ii,Ua",
 gl9:function(){var z=this.Ii
 if(z!=null)return z
 z=this.Ej
-z=H.v4(this.zO,z.multiline,!z.ignoreCase,!0)
+z=H.v4(z.source,z.multiline,!z.ignoreCase,!0)
 this.Ii=z
 return z},
 gAT:function(){var z=this.Ua
 if(z!=null)return z
 z=this.Ej
-z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
+z=H.v4(z.source+"|()",z.multiline,!z.ignoreCase,!0)
 this.Ua=z
 return z},
 ej:function(a){var z
@@ -2137,14 +2153,14 @@
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
 $isSP:true,
-static:{v4:function(a,b,c,d){var z,y,x,w,v
+static:{v4:[function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
 x=d?"g":""
 w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"$4","HU",8,0,null,106,[],107,[],108,[],109,[]]}},
 AX:{
 "^":"a;zO,QK",
 t:function(a,b){var z=this.QK
@@ -2181,17 +2197,60 @@
 "^":"a;M,J9,zO",
 t:function(a,b){if(!J.de(b,0))H.vh(P.N(b))
 return this.zO},
-$isOd:true}}],["app","package:observatory/app.dart",,G,{
+$isOd:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
+"^":"",
+hV:{
+"^":["LP;fi%-304,dB%-85,KW%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gO9:[function(a){return a.fi},null,null,1,0,307,"busy",308,309],
+sO9:[function(a,b){a.fi=this.ct(a,C.S4,a.fi,b)},null,null,3,0,310,30,[],"busy",308],
+gFR:[function(a){return a.dB},null,null,1,0,115,"callback",308,311],
+Ki:function(a){return this.gFR(a).$0()},
+LY:function(a,b){return this.gFR(a).$1(b)},
+sFR:[function(a,b){a.dB=this.ct(a,C.AV,a.dB,b)},null,null,3,0,116,30,[],"callback",308],
+gph:[function(a){return a.KW},null,null,1,0,312,"label",308,311],
+sph:[function(a,b){a.KW=this.ct(a,C.y2,a.KW,b)},null,null,3,0,32,30,[],"label",308],
+pp:[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,313,118,[],199,[],289,[],"doAction"],
+"@":function(){return[C.F9]},
+static:{zy:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.fi=!1
+a.dB=null
+a.KW="action"
+a.SO=z
+a.B7=y
+a.X0=w
+C.Uy.ZL(a)
+C.Uy.oX(a)
+return a},null,null,0,0,115,"new ActionLinkElement$created"]}},
+"+ActionLinkElement":[314],
+LP:{
+"^":"xc+Pi;",
+$isd3:true},
+jE:{
+"^":"Tp:115;a-85",
+$0:[function(){var z,y
+z=this.a
+y=J.RE(z)
+y.sfi(z,y.ct(z,C.S4,y.gfi(z),!1))},"$0",null,0,0,115,"call"],
+$isEH:true},
+"+ jE":[315]}],["app","package:observatory/app.dart",,G,{
 "^":"",
 m7:[function(a){var z
 N.Jx("").To("Google Charts API loaded")
 z=J.UQ(J.UQ($.cM(),"google"),"visualization")
 $.NR=z
-return z},"$1","vN",2,0,16,17,[]],
-G0:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},
-ap:function(a,b){var z
+return z},"$1","vN",2,0,116,117,[]],
+G0:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","ez",4,0,null,118,[],119,[]],
+ap:[function(a,b){var z
 for(z="";b>1;){--b
-if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
+if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},"$2","Bn",4,0,null,30,[],120,[]],
 av:[function(a){var z,y,x
 z=J.Wx(a)
 if(z.C(a,1000))return z.bu(a)
@@ -2199,8 +2258,8 @@
 a=z.Z(a,1000)
 x=G.ap(y,3)
 for(;z=J.Wx(a),z.D(a,1000);){x=G.ap(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","Vj",2,0,18],
-P0:function(a){var z,y,x,w
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","Vj",2,0,121,122,[]],
+P0:[function(a){var z,y,x,w
 if(a==null)return"-"
 z=J.LL(J.vX(a,1000))
 y=C.jn.cU(z,3600000)
@@ -2210,14 +2269,14 @@
 w=C.jn.cU(z,1000)
 z=C.jn.Y(z,1000)
 if(y>0)return G.ap(y,2)+":"+G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)
-else return G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)},
+else return G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)},"$1","DQ",2,0,null,123,[]],
 Xz:[function(a){var z=J.Wx(a)
 if(z.C(a,1024))return H.d(a)+"B"
 else if(z.C(a,1048576))return""+C.CD.yu(C.CD.UD(z.V(a,1024)))+"KB"
 else if(z.C(a,1073741824))return""+C.CD.yu(C.CD.UD(z.V(a,1048576)))+"MB"
 else if(z.C(a,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(a,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","AF",2,0,18,19,[]],
-mG:function(a){var z,y,x,w
+else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","AF",2,0,121,124,[]],
+mG:[function(a){var z,y,x,w
 if(a==null)return"-"
 z=J.LL(J.vX(a,1000))
 y=C.jn.cU(z,3600000)
@@ -2227,15 +2286,15 @@
 P.p9("")
 if(y!==0)return""+y+"h "+x+"m "+w+"s"
 if(x!==0)return""+x+"m "+w+"s"
-return""+w+"s"},
+return""+w+"s"},"$1","N2",2,0,null,123,[]],
 mL:{
-"^":["Pi;Z6<-79,zf>-80,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,81,"isolate",82,83],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,84,27,[],"isolate",82],
-gvJ:[function(a){return this.AJ},null,null,1,0,85,"response",82,83],
-svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,86,27,[],"response",82],
-gKw:[function(){return this.fz},null,null,1,0,87,"args",82,83],
-sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,8,27,[],"args",82],
+"^":["Pi;Z6<-316,zf>-317,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,318,"isolate",308,309],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,319,30,[],"isolate",308],
+gvJ:[function(a){return this.AJ},null,null,1,0,320,"response",308,309],
+svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,321,30,[],"response",308],
+gKw:[function(){return this.fz},null,null,1,0,312,"args",308,309],
+sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,32,30,[],"args",308],
 Da:function(){var z,y
 z=this.Z6
 z.sec(this)
@@ -2246,9 +2305,9 @@
 z=z.gLi()
 H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
 kj:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gbf",2,0,88,30,[]],
+this.Z6.Mp()},"$1","gbf",2,0,322,171,[]],
 t1:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gXa",2,0,89,90,[]],
+this.Z6.Mp()},"$1","gXa",2,0,323,324,[]],
 US:function(){this.Da()},
 hq:function(){this.Da()}},
 ig:{
@@ -2267,8 +2326,8 @@
 this.vR.V7("draw",[a.gYb(),z])}},
 dZ:{
 "^":"Pi;ec?,JL,AP,fn",
-gjW:[function(){return this.JL},null,null,1,0,87,"currentHash",82,83],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,8,27,[],"currentHash",82],
+gjW:[function(){return this.JL},null,null,1,0,312,"currentHash",308,309],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",308],
 kI:function(){var z=C.PP.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
 if(window.location.hash==="")window.location.hash="#/vm"
@@ -2287,38 +2346,38 @@
 this.ec.zf.cv(J.ZZ(this.JL,2)).ml(new G.GH(this,x))},
 static:{"^":"K3D"}},
 Qe:{
-"^":"Tp:16;a",
-$1:[function(a){this.a.df()},"$1",null,2,0,null,91,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){this.a.df()},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 GH:{
-"^":"Tp:16;a,b",
+"^":"Tp:116;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=z.ec
 y.AJ=F.Wi(y,C.mE,y.AJ,a)
 z=z.ec
-z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,92,[],"call"],
+z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,101,[],"call"],
 $isEH:true},
 Y2:{
-"^":["Pi;eT>,yt<-93,wd>-94,oH<-95",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
-gyX:[function(a){return this.R7},null,null,1,0,87,"expander",82,83],
+"^":["Pi;eT>,yt<-326,wd>-327,oH<-328",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
+gyX:[function(a){return this.R7},null,null,1,0,312,"expander",308,309],
 Qx:function(a){return this.gyX(this).$0()},
-syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,8,27,[],"expander",82],
-grm:[function(){return this.aZ},null,null,1,0,87,"expanderStyle",82,83],
-srm:[function(a){this.aZ=F.Wi(this,C.Jt,this.aZ,a)},null,null,3,0,8,27,[],"expanderStyle",82],
-goE:function(a){return this.z3},
-soE:function(a,b){var z=this.z3
-this.z3=b
+syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,32,30,[],"expander",308],
+grm:[function(){return this.aZ},null,null,1,0,312,"expanderStyle",308,309],
+srm:[function(a){this.aZ=F.Wi(this,C.Jt,this.aZ,a)},null,null,3,0,32,30,[],"expanderStyle",308],
+goE:function(a){return this.cp},
+soE:function(a,b){var z=this.cp
+this.cp=b
 if(z!==b){z=this.R7
 if(b){this.R7=F.Wi(this,C.Of,z,"\u21b3")
 this.C4(0)}else{this.R7=F.Wi(this,C.Of,z,"\u2192")
 this.o8()}}},
-r8:function(){this.soE(0,!this.z3)
-return this.z3},
+r8:function(){this.soE(0,!this.cp)
+return this.cp},
 k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Jt,this.aZ,"visibility:hidden;")},
 $isY2:true},
 XN:{
-"^":["Pi;zU>-94,AP,fn",function(){return[C.J19]},null,null],
+"^":["Pi;zU>-327,AP,fn",function(){return[C.J19]},null,null],
 rT:function(a){var z,y
 z=this.zU
 y=J.w1(z)
@@ -2345,7 +2404,7 @@
 w.UZ(z,v,v+y)}},
 Kt:{
 "^":"a;ph>,xy",
-static:{r1:[function(a){return a!=null?J.AG(a):"<null>"},"$1","My",2,0,20]}},
+static:{r1:[function(a){return a!=null?J.AG(a):"<null>"},"$1","My",2,0,125,122,[]]}},
 Ni:{
 "^":"a;UQ>",
 $isNi:true},
@@ -2356,7 +2415,7 @@
 gxp:function(){return this.pT},
 np:function(a){H.rd(this.tW,new G.Nu(this))
 F.Wi(this,C.AH,0,1)},
-gIN:[function(){return this.tW},null,null,1,0,96,"sortedRows",83],
+gIN:[function(){return this.tW},null,null,1,0,329,"sortedRows",309],
 lb:function(){C.Nm.sB(this.zU,0)
 C.Nm.sB(this.tW,0)},
 aJ:function(a,b){var z=this.zU
@@ -2369,7 +2428,7 @@
 z=J.U8(z[a])
 if(b>>>0!==b||b>=9)return H.e(z,b)
 y=z[b]
-return this.oH[b].xy.$1(y)},"$2","gls",4,0,97,98,[],99,[],"getFormattedValue",82],
+return this.oH[b].xy.$1(y)},"$2","gls",4,0,330,331,[],332,[],"getFormattedValue",308],
 Qs:[function(a){var z,y
 if(!J.de(a,this.pT)){z=this.oH
 if(a>>>0!==a||a>=9)return H.e(z,a)
@@ -2377,15 +2436,15 @@
 if(a>>>0!==a||a>=9)return H.e(z,a)
 z=z[a]
 y=this.jV?"\u25bc":"\u25b2"
-return z.ph+y},"$1","gpo",2,0,18,99,[],"getColumnLabel",82],
+return z.ph+y},"$1","gpo",2,0,121,332,[],"getColumnLabel",308],
 TK:[function(a,b){var z=this.zU
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 z=J.U8(z[a])
 if(b>>>0!==b||b>=9)return H.e(z,b)
-return z[b]},"$2","gyY",4,0,100,98,[],99,[],"getValue",82]},
+return z[b]},"$2","gyY",4,0,333,331,[],332,[],"getValue",308]},
 Nu:{
-"^":"Tp:75;a",
-$2:function(a,b){var z,y,x,w,v,u
+"^":"Tp:300;a",
+$2:[function(a,b){var z,y,x,w,v,u
 z=this.a
 y=z.zU
 if(a>>>0!==a||a>=y.length)return H.e(y,a)
@@ -2399,23 +2458,23 @@
 if(w>>>0!==w||w>=9)return H.e(y,w)
 u=y[w]
 if(z.jV)return J.oE(u,v)
-else return J.oE(v,u)},
-$isEH:true}}],["app_bootstrap","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/index_devtools.html_bootstrap.dart",,E,{
+else return J.oE(v,u)},"$2",null,4,0,null,334,[],335,[],"call"],
+$isEH:true}}],["app_bootstrap","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/index_devtools.html_bootstrap.dart",,E,{
 "^":"",
-De:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
+De:[function(){$.x2=["package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/action_link.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
 $.uP=!1
-F.E2()},"$0","KU",0,0,21]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+F.E2()},"$0","KU",0,0,126]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 pz:{
-"^":["pv;BW%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grs:[function(a){return a.BW},null,null,1,0,103,"msg",82,104],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,105,27,[],"msg",82],
-pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
-"@":function(){return[C.PT]},
+"^":["pv;BW%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grs:[function(a){return a.BW},null,null,1,0,337,"msg",308,311],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,338,30,[],"msg",308],
+pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
+"@":function(){return[C.jy]},
 static:{t4:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -2423,19 +2482,19 @@
 a.X0=w
 C.J0.ZL(a)
 C.J0.oX(a)
-return a},null,null,0,0,22,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[107],
+return a},null,null,0,0,115,"new BreakpointListElement$created"]}},
+"+BreakpointListElement":[340],
 pv:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
 Tg:{
-"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.tSc]},
 static:{rt:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -2444,21 +2503,21 @@
 a.X0=w
 C.oq.ZL(a)
 C.oq.oX(a)
-return a},null,null,0,0,22,"new ClassRefElement$created"]}},
-"+ClassRefElement":[110]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+return a},null,null,0,0,115,"new ClassRefElement$created"]}},
+"+ClassRefElement":[342]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 Jc:{
-"^":["Dsd;Om%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Om},null,null,1,0,103,"cls",82,104],
-sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,105,27,[],"cls",82],
-vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
-Xe:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/retained"))},"$1","ghN",2,0,111,113,[],"retainedSize"],
-pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"^":["Dsd;Om%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Om},null,null,1,0,337,"cls",308,311],
+sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,338,30,[],"cls",308],
+vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
+Xe:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/retained"))},"$1","ghN",2,0,343,344,[],"retainedSize"],
+pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 "@":function(){return[C.aQx]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -2466,22 +2525,22 @@
 a.X0=w
 C.ka.ZL(a)
 C.ka.oX(a)
-return a},null,null,0,0,22,"new ClassViewElement$created"]}},
-"+ClassViewElement":[114],
+return a},null,null,0,0,115,"new ClassViewElement$created"]}},
+"+ClassViewElement":[345],
 Dsd:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 CN:{
-"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.tY},null,null,1,0,115,"code",83],
+"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.tY},null,null,1,0,346,"code",309],
 P9:[function(a,b){Q.xI.prototype.P9.call(this,a,b)
-this.ct(a,C.b1,0,1)},"$1","gLe",2,0,16,65,[],"refChanged"],
+this.ct(a,C.b1,0,1)},"$1","gLe",2,0,116,242,[],"refChanged"],
 "@":function(){return[C.H3]},
 static:{On:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -2490,80 +2549,80 @@
 a.X0=w
 C.IK.ZL(a)
 C.IK.oX(a)
-return a},null,null,0,0,22,"new CodeRefElement$created"]}},
-"+CodeRefElement":[110]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+return a},null,null,0,0,115,"new CodeRefElement$created"]}},
+"+CodeRefElement":[342]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":["tuj;Xx%-116,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.Xx},null,null,1,0,115,"code",82,104],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,117,27,[],"code",82],
+"^":["tuj;Xx%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.Xx},null,null,1,0,346,"code",308,311],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,348,30,[],"code",308],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z).ml(new F.hf())},"$0","gQd",0,0,21,"enteredView"],
-pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+J.SK(z).ml(new F.hf())},"$0","gQd",0,0,126,"enteredView"],
+pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 m2:[function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
 y=H.BU(z,null,null)
 x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
 if(x==null)return
-return x},"$1","gnV",2,0,118,119,[],"_findJumpTarget"],
+return x},"$1","gnV",2,0,349,82,[],"_findJumpTarget"],
 YI:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gff",6,0,120,7,[],121,[],119,[],"mouseOver"],
+J.pP(z).h(0,"highlight")},"$3","gff",6,0,350,21,[],351,[],82,[],"mouseOver"],
 ZC:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,120,7,[],121,[],119,[],"mouseOut"],
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,350,21,[],351,[],82,[],"mouseOut"],
 "@":function(){return[C.xW]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
 a.B7=y
 a.X0=w
-C.YD.ZL(a)
-C.YD.oX(a)
-return a},null,null,0,0,22,"new CodeViewElement$created"]}},
-"+CodeViewElement":[122],
+C.ux.ZL(a)
+C.ux.oX(a)
+return a},null,null,0,0,115,"new CodeViewElement$created"]}},
+"+CodeViewElement":[352],
 tuj:{
 "^":"uL+Pi;",
 $isd3:true},
 hf:{
-"^":"Tp:117;",
-$1:[function(a){a.QW()},"$1",null,2,0,117,123,[],"call"],
+"^":"Tp:348;",
+$1:[function(a){a.QW()},"$1",null,2,0,348,289,[],"call"],
 $isEH:true},
-"+ hf":[124]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
+"+ hf":[315]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 i6:{
-"^":["Vct;zh%-125,HX%-125,Uy%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gAQ:[function(a){return a.zh},null,null,1,0,87,"iconClass",82,83],
-sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,8,27,[],"iconClass",82],
-gai:[function(a){return a.HX},null,null,1,0,87,"displayValue",82,83],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,8,27,[],"displayValue",82],
-gxj:[function(a){return a.Uy},null,null,1,0,126,"collapsed"],
+"^":["Vct;zh%-305,HX%-305,Uy%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gAQ:[function(a){return a.zh},null,null,1,0,312,"iconClass",308,309],
+sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",308],
+gai:[function(a){return a.HX},null,null,1,0,312,"displayValue",308,309],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",308],
+gxj:[function(a){return a.Uy},null,null,1,0,307,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,127,128,[],"collapsed"],
+this.SS(a)},null,null,3,0,310,353,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-this.SS(a)},"$0","gQd",0,0,21,"enteredView"],
+this.SS(a)},"$0","gQd",0,0,126,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
 this.SS(a)
-this.SS(a)},"$3","gl8",6,0,120,7,[],121,[],119,[],"toggleDisplay"],
+this.SS(a)},"$3","gl8",6,0,350,21,[],351,[],82,[],"toggleDisplay"],
 SS:[function(a){var z,y
 z=a.Uy
 y=a.zh
 if(z===!0){a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-down")
 a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
-a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,21,"_refresh"],
+a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,126,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-125,DI<-125",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-305,DI<-305",Hv:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.zh="glyphicon glyphicon-chevron-down"
@@ -2574,43 +2633,43 @@
 a.X0=w
 C.j8.ZL(a)
 C.j8.oX(a)
-return a},null,null,0,0,22,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[129],
+return a},null,null,0,0,115,"new CollapsibleContentElement$created"]}},
+"+CollapsibleContentElement":[354],
 Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
-"^":["LP;GV%-109,Pl%-109,nx%-29,oM%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-goE:[function(a){return a.GV},null,null,1,0,126,"expanded",82,83],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,127,27,[],"expanded",82],
-gO9:[function(a){return a.Pl},null,null,1,0,126,"busy",82,83],
-sO9:[function(a,b){a.Pl=this.ct(a,C.S4,a.Pl,b)},null,null,3,0,127,27,[],"busy",82],
-gFR:[function(a){return a.nx},null,null,1,0,22,"callback",82,104],
+"^":["Nr;GV%-304,Hu%-304,nx%-85,oM%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+goE:[function(a){return a.GV},null,null,1,0,307,"expanded",308,309],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,310,30,[],"expanded",308],
+gO9:[function(a){return a.Hu},null,null,1,0,307,"busy",308,309],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,310,30,[],"busy",308],
+gFR:[function(a){return a.nx},null,null,1,0,115,"callback",308,311],
 Ki:function(a){return this.gFR(a).$0()},
 AV:function(a,b,c){return this.gFR(a).$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,16,27,[],"callback",82],
-git:[function(a){return a.oM},null,null,1,0,126,"expand",82,104],
-sit:[function(a,b){a.oM=this.ct(a,C.dI,a.oM,b)},null,null,3,0,127,27,[],"expand",82],
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,116,30,[],"callback",308],
+git:[function(a){return a.oM},null,null,1,0,307,"expand",308,311],
+sit:[function(a,b){a.oM=this.ct(a,C.dI,a.oM,b)},null,null,3,0,310,30,[],"expand",308],
 rL:[function(a,b){var z=a.oM
-a.GV=this.ct(a,C.mr,a.GV,z)},"$1","gzr",2,0,26,65,[],"expandChanged"],
+a.GV=this.ct(a,C.mr,a.GV,z)},"$1","gzr",2,0,169,242,[],"expandChanged"],
 Ey:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
-a.Pl=this.ct(a,C.S4,a.Pl,!1)},"$0","goJ",0,0,21,"doneCallback"],
-AZ:[function(a,b,c,d){var z=a.Pl
+a.Hu=this.ct(a,C.S4,a.Hu,!1)},"$0","goJ",0,0,126,"doneCallback"],
+AZ:[function(a,b,c,d){var z=a.Hu
 if(z===!0)return
-if(a.nx!=null){a.Pl=this.ct(a,C.S4,z,!0)
+if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,130,53,[],57,[],123,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,313,118,[],199,[],289,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.GV=!1
-a.Pl=!1
+a.Hu=!1
 a.nx=null
 a.oM=!1
 a.SO=z
@@ -2618,9 +2677,9 @@
 a.X0=w
 C.O0.ZL(a)
 C.O0.oX(a)
-return a},null,null,0,0,22,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[131],
-LP:{
+return a},null,null,0,0,115,"new CurlyBlockElement$created"]}},
+"+CurlyBlockElement":[355],
+Nr:{
 "^":"xc+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
 "^":"",
@@ -2631,21 +2690,21 @@
 if(y==null)return"registerElement" in document
 return J.de(J.UQ(y,"ready"),!0)},
 wJ:{
-"^":"Tp:22;",
-$0:function(){if(B.G9())return P.Ab(null,null)
+"^":"Tp:115;",
+$0:[function(){if(B.G9())return P.Ab(null,null)
 var z=H.VM(new W.RO(document,"WebComponentsReady",!1),[null])
-return z.gtH(z)},
+return z.gtH(z)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["dart._internal","dart:_internal",,H,{
 "^":"",
-bQ:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},
-Ck:function(a,b){var z
+bQ:[function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},"$2","Mn",4,0,null,127,[],128,[]],
+Ck:[function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
-return!1},
-n3:function(a,b,c){var z
+return!1},"$2","cs",4,0,null,127,[],128,[]],
+n3:[function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.$2(b,z.lo)
-return b},
-mx:function(a,b,c){var z,y,x
+return b},"$3","cS",6,0,null,127,[],129,[],130,[]],
+mx:[function(a,b,c){var z,y,x
 for(y=0;x=$.RM(),y<x.length;++y)if(x[y]===a)return H.d(b)+"..."+H.d(c)
 z=P.p9("")
 try{$.RM().push(a)
@@ -2653,24 +2712,24 @@
 z.We(a,", ")
 z.KF(c)}finally{x=$.RM()
 if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},
-rd:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},
-K0:function(a,b,c){var z=J.Wx(b)
+x.pop()}return z.gvM()},"$3","l7",6,0,null,127,[],131,[],132,[]],
+rd:[function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},"$2","xX",4,0,null,76,[],133,[]],
+K0:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 z=J.Wx(c)
-if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},
-qG:function(a,b,c,d,e){var z,y,x,w
+if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"$3","Ze",6,0,null,76,[],134,[],135,[]],
+qG:[function(a,b,c,d,e){var z,y,x,w
 H.K0(a,b,c)
 z=J.xH(c,b)
 if(J.de(z,0))return
 if(J.u6(e,0))throw H.b(P.u(e))
 y=J.x(d)
-if(!!y.$iszM){x=e
+if(!!y.$isList){x=e
 w=d}else{w=y.eR(d,e).tt(0,!1)
 x=0}if(J.z8(J.WB(x,z),J.q8(w)))throw H.b(P.w("Not enough elements"))
-H.tb(w,x,a,b,z)},
-IC:function(a,b,c){var z,y,x,w,v,u
+H.tb(w,x,a,b,z)},"$5","it",10,0,null,76,[],134,[],135,[],113,[],136,[]],
+IC:[function(a,b,c){var z,y,x,w,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 y=J.x(c)
@@ -2686,37 +2745,37 @@
 H.qG(a,z,w,a,b)
 for(z=y.gA(c);z.G();b=u){v=z.gl()
 u=J.WB(b,1)
-C.Nm.u(a,b,v)}},
-ed:function(a,b,c){var z,y
+C.Nm.u(a,b,v)}},"$3","QB",6,0,null,76,[],15,[],127,[]],
+ed:[function(a,b,c){var z,y
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 for(z=J.GP(c);z.G();b=y){y=b+1
-C.Nm.u(a,b,z.gl())}},
-tb:function(a,b,c,d,e){var z,y,x,w,v
+C.Nm.u(a,b,z.gl())}},"$3","Y1",6,0,null,76,[],15,[],127,[]],
+tb:[function(a,b,c,d,e){var z,y,x,w,v
 z=J.Wx(b)
 if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},
-TK:function(a,b,c,d){var z
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"$5","e8",10,0,null,137,[],138,[],139,[],140,[],141,[]],
+TK:[function(a,b,c,d){var z
 if(c>=a.length)return-1
 if(c<0)c=0
 for(z=c;z<d;++z){if(z<0||z>=a.length)return H.e(a,z)
-if(J.de(a[z],b))return z}return-1},
-lO:function(a,b,c){var z,y
+if(J.de(a[z],b))return z}return-1},"$4","vu",8,0,null,118,[],142,[],88,[],143,[]],
+lO:[function(a,b,c){var z,y
 if(typeof c!=="number")return c.C()
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
 for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.de(a[y],b))return y}return-1},
-ZE:function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
-else H.d4(a,b,c,d)},
-w9:function(a,b,c,d){var z,y,x,w,v,u
+if(J.de(a[y],b))return y}return-1},"$3","MW",6,0,null,118,[],142,[],88,[]],
+ZE:[function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
+else H.d4(a,b,c,d)},"$4","UR",8,0,null,118,[],144,[],145,[],133,[]],
+w9:[function(a,b,c,d){var z,y,x,w,v,u
 for(z=J.WB(b,1),y=J.U6(a);x=J.Wx(z),x.E(z,c);z=x.g(z,1)){w=y.t(a,z)
 v=z
 while(!0){u=J.Wx(v)
 if(!(u.D(v,b)&&J.z8(d.$2(y.t(a,u.W(v,1)),w),0)))break
 y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},
-d4:function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
+v=u.W(v,1)}y.u(a,v,w)}},"$4","f7",8,0,null,118,[],144,[],145,[],133,[]],
+d4:[function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
 z=J.Wx(a0)
 y=J.Ts(J.WB(z.W(a0,b),1),6)
 x=J.Qc(b)
@@ -2816,7 +2875,7 @@
 k=e}else{t.u(a,i,t.t(a,j))
 d=x.W(j,1)
 t.u(a,j,h)
-j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},
+j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"$4","Hm",8,0,null,118,[],144,[],145,[],133,[]],
 aL:{
 "^":"mW;",
 gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
@@ -2860,7 +2919,7 @@
 w.vM+=typeof u==="string"?u:H.d(u)
 if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
 ev:function(a,b){return P.mW.prototype.ev.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")}],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},128,[]],
 es:function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
@@ -3096,15 +3155,15 @@
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
-$iszM:true,
-$aszM:null,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 w2Y:{
 "^":"ar+Tv;",
-$iszM:true,
-$aszM:null,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -3125,95 +3184,99 @@
 bu:function(a){return"Symbol(\""+H.d(this.fN)+"\")"},
 $isGD:true,
 $iswv:true,
-static:{"^":"RWj,ES1,quP,L3,Np,p1",u1:function(a){var z,y
+static:{"^":"RWj,ES1,quP,L3,Np,p1",u1:[function(a){var z,y
 z=J.U6(a)
 if(z.gl0(a)!==!0){y=$.bw().Ej
 if(typeof a!=="string")H.vh(P.u(a))
 y=y.test(a)}else y=!0
 if(y)return a
 if(z.nC(a,"_"))throw H.b(P.u("\""+H.d(a)+"\" is a private identifier"))
-throw H.b(P.u("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))}}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
+throw H.b(P.u("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))},"$1","kf",2,0,null,12,[]]}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
 "^":"",
-TS:function(a){return J.GL(a)},
-YC:function(a){if(a==null)return
-return new H.GD(a)},
+TS:[function(a){return J.GL(a)},"$1","DP",2,0,null,146,[]],
+YC:[function(a){if(a==null)return
+return new H.GD(a)},"$1","Rc",2,0,null,12,[]],
 vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
-else return new H.iu(a,4)},"$1","Yf",2,0,23,24,[]],
-jO:function(a){var z,y
+else return new H.iu(a,4)},"$1","Yf",2,0,147,148,[]],
+jO:[function(a){var z,y
 z=$.Sl().t(0,a)
 y=J.x(a)
 if(y.n(a,"dynamic"))return $.P8()
 if(y.n(a,"void"))return $.oj()
-return H.tT(H.YC(z==null?a:z),a)},
-tT:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return H.tT(H.YC(z==null?a:z),a)},"$1","vC",2,0,null,149,[]],
+tT:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+z=J.U6(b)
+y=z.u8(b,"/")
+if(y>-1)b=z.yn(b,y+1)
 z=$.tY
 if(z==null){z=H.Pq()
-$.tY=z}y=z[b]
-if(y!=null)return y
+$.tY=z}x=z[b]
+if(x!=null)return x
 z=J.U6(b)
-x=z.u8(b,"<")
-if(x!==-1){w=H.jO(z.Nj(b,0,x)).gJi()
-y=new H.bl(w,z.Nj(b,x+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,w.gIf())
-$.tY[b]=y
-return y}v=init.allClasses[b]
-if(v==null){u=init.functionAliases[b]
-if(u!=null){y=new H.ng(b,null,a)
-y.CM=new H.Ar(init.metadata[u],null,null,null,y)
-$.tY[b]=y
-return y}throw H.b(P.f("Cannot find class for: "+H.d(H.TS(a))))}t=v["@"]
-if(t==null){s=null
-r=null}else{s=t["^"]
-z=J.x(s)
-if(!!z.$iszM){r=z.Mu(s,1,z.gB(s)).br(0)
-s=z.t(s,0)}else r=null
-if(typeof s!=="string")s=""}z=J.uH(s,";")
+w=z.u8(b,"<")
+if(w!==-1){v=H.jO(z.Nj(b,0,w)).gJi()
+x=new H.bl(v,z.Nj(b,w+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,v.gIf())
+$.tY[b]=x
+return x}u=H.mN(b)
+if(u==null){t=init.functionAliases[b]
+if(t!=null){x=new H.ng(b,null,a)
+x.CM=new H.Ar(init.metadata[t],null,null,null,x)
+$.tY[b]=x
+return x}throw H.b(P.f("Cannot find class for: "+H.d(H.TS(a))))}s=H.SG(u)?u.constructor:u
+r=s["@"]
+if(r==null){q=null
+p=null}else{q=r["^"]
+z=J.x(q)
+if(!!z.$isList){p=z.Mu(q,1,z.gB(q)).br(0)
+q=z.t(q,0)}else p=null
+if(typeof q!=="string")q=""}z=J.uH(q,";")
 if(0>=z.length)return H.e(z,0)
-q=J.uH(z[0],"+")
-if(q.length>1&&$.Sl().t(0,b)==null)y=H.MJ(q,b)
-else{p=new H.Wf(b,v,s,r,H.Pq(),null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a)
-o=v.prototype["<>"]
-if(o==null||o.length===0)y=p
-else{for(z=o.length,n="dynamic",m=1;m<z;++m)n+=",dynamic"
-y=new H.bl(p,n,null,null,null,null,null,null,null,null,null,null,null,null,null,p.If)}}$.tY[b]=y
-return y},
-Vv:function(a){var z,y,x
+o=J.uH(z[0],"+")
+if(o.length>1&&$.Sl().t(0,b)==null)x=H.MJ(o,b)
+else{n=new H.Wf(b,u,q,p,H.Pq(),null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a)
+m=s.prototype["<>"]
+if(m==null||m.length===0)x=n
+else{for(z=m.length,l="dynamic",k=1;k<z;++k)l+=",dynamic"
+x=new H.bl(n,l,null,null,null,null,null,null,null,null,null,null,null,null,null,n.If)}}$.tY[b]=x
+return x},"$2","ER",4,0,null,146,[],149,[]],
+Vv:[function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},
-Fk:function(a){var z,y,x
+if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"$1","yM",2,0,null,150,[]],
+Fk:[function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.gxV())z.u(0,x.gIf(),x)}return z},
-EK:function(a,b){var z,y,x,w
+if(x.gxV())z.u(0,x.gIf(),x)}return z},"$1","Pj",2,0,null,150,[]],
+EK:[function(a,b){var z,y,x,w
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.glT()){w=x.gIf()
-if(b.Fb.t(0,w)!=null)continue
-z.u(0,x.gIf(),x)}}return z},
-vE:function(a,b){var z,y,x,w,v
+if(b.nb.t(0,w)!=null)continue
+z.u(0,x.gIf(),x)}}return z},"$2","rX",4,0,null,150,[],151,[]],
+vE:[function(a,b){var z,y,x,w,v
 z=P.L5(null,null,null,null,null)
 z.FV(0,b)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.ghB()){w=x.gIf().fN
 v=J.U6(w)
 if(!!J.x(z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))).$isRY)continue}if(x.gxV())continue
-z.to(x.gIf(),new H.YX(x))}return z},
-MJ:function(a,b){var z,y,x,w
+z.to(x.gIf(),new H.YX(x))}return z},"$2","un",4,0,null,150,[],152,[]],
+MJ:[function(a,b){var z,y,x,w
 z=[]
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();)z.push(H.jO(y.lo))
 x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
 x.G()
 w=x.lo
 for(;x.G();)w=new H.BI(w,x.lo,null,null,H.YC(b))
-return w},
-w2:function(a,b){var z,y,x
+return w},"$2","R9",4,0,null,153,[],149,[]],
+w2:[function(a,b){var z,y,x
 z=J.U6(a)
 y=0
 while(!0){x=z.gB(a)
 if(typeof x!=="number")return H.s(x)
 if(!(y<x))break
-if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(P.u("Type variable not present in list."))},
-Jf:function(a,b){var z,y,x,w,v,u,t
+if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(P.u("Type variable not present in list."))},"$2","CE",4,0,null,155,[],12,[]],
+Jf:[function(a,b){var z,y,x,w,v,u,t
 z={}
 z.a=null
 for(y=a;y!=null;){x=J.x(y)
@@ -3223,27 +3286,27 @@
 else{x=z.a
 if(x==null)w=H.Ko(b,null)
 else if(x.gHA())if(typeof b==="number"){v=init.metadata[b]
-u=z.a.gNy()
+u=x.gNy()
 return J.UQ(u,H.w2(u,J.O6(v)))}else w=H.Ko(b,null)
 else{z=new H.rh(z)
 if(typeof b==="number"){t=z.$1(b)
 if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.iW(z))}}if(w!=null)return H.jO(w)
-return P.re(C.yQ)},
-fb:function(a,b){if(a==null)return b
-return H.YC(H.d(a.gUx(a).fN)+"."+H.d(b.fN))},
-pj:function(a){var z,y,x,w
+return P.re(C.yQ)},"$2","xN",4,0,null,156,[],11,[]],
+fb:[function(a,b){if(a==null)return b
+return H.YC(H.d(J.GL(J.Ba(a)))+"."+H.d(b.fN))},"$2","WS",4,0,null,156,[],157,[]],
+pj:[function(a){var z,y,x,w
 z=a["@"]
 if(z!=null)return z()
 if(typeof a!="function")return C.xD
 if("$metadataIndex" in a){y=a.$reflectionInfo.splice(a.$metadataIndex)
 y.fixed$length=init
 return H.VM(new H.A8(y,new H.ye()),[null,null]).br(0)}x=Function.prototype.toString.call(a)
-w=C.xB.cn(x,new H.VR("\"[0-9,]*\";?[ \n\r]*}",H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
+w=C.xB.cn(x,new H.VR(H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
 if(w===-1)return C.xD;++w
-return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},
-jw:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
+return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"$1","C7",2,0,null,158,[]],
+jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=J.x(b)
-if(!!z.$iszM){y=H.Mk(z.t(b,0),",")
+if(!!z.$isList){y=H.Mk(z.t(b,0),",")
 x=z.Jk(b,1)}else{y=typeof b==="string"?H.Mk(b,","):[]
 x=null}for(z=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=x!=null,v=0;z.G();){u=z.lo
 if(w){t=v+1
@@ -3251,18 +3314,18 @@
 s=x[v]
 v=t}else s=null
 r=H.pS(u,s,a,c)
-if(r!=null)d.push(r)}},
-Mk:function(a,b){var z=J.U6(a)
-if(z.gl0(a)===!0)return H.VM([],[P.qU])
-return z.Fr(a,b)},
-BF:function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
-default:return!1}},
-Y6:function(a){var z,y
+if(r!=null)d.push(r)}},"$4","Sv",8,0,null,156,[],159,[],67,[],57,[]],
+Mk:[function(a,b){var z=J.U6(a)
+if(z.gl0(a)===!0)return H.VM([],[J.O])
+return z.Fr(a,b)},"$2","EO",4,0,null,14,[],106,[]],
+BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
+default:return!1}},"$1","IX",2,0,null,12,[]],
+Y6:[function(a){var z,y
 z=J.x(a)
 if(z.n(a,"^")||z.n(a,"$methodsWithOptionalArguments"))return!0
 y=z.t(a,0)
 z=J.x(y)
-return z.n(y,"*")||z.n(y,"+")},
+return z.n(y,"*")||z.n(y,"+")},"$1","uG",2,0,null,49,[]],
 Sn:{
 "^":"a;L5,F1>",
 gvU:function(){var z,y,x,w
@@ -3270,11 +3333,11 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=$.vK(),z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)for(x=J.GP(z.lo);x.G();){w=x.gl()
-y.u(0,w.gFP(),w)}z=H.VM(new P.Oh(y),[P.iD,P.D4])
+y.u(0,w.gFP(),w)}z=H.VM(new H.Oh(y),[P.iD,P.D4])
 this.L5=z
 return z},
-static:{"^":"QG,Q3,Ct",dF:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=P.L5(null,null,null,P.qU,[P.zM,P.D4])
+static:{"^":"QG,Q3,Ct",dF:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+z=P.L5(null,null,null,J.O,[J.Q,P.D4])
 y=init.libraries
 if(y==null)return z
 for(x=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);x.G();){w=x.lo
@@ -3288,10 +3351,10 @@
 o=v.t(w,6)
 n=v.t(w,7)
 m=q==null?C.xD:q()
-J.wT(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z}}},
+J.wT(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"$0","jc",0,0,null]}},
 nI:{
-"^":"Tp:22;",
-$0:function(){return H.VM([],[P.D4])},
+"^":"Tp:115;",
+$0:[function(){return H.VM([],[P.D4])},"$0",null,0,0,null,"call"],
 $isEH:true},
 jU:{
 "^":"a;",
@@ -3301,12 +3364,12 @@
 Lj:{
 "^":"jU;MA",
 gOO:function(){return"Isolate"},
-gcZ:function(){var z=$.Cm().gvU().Fb
+gcZ:function(){var z=$.Cm().gvU().nb
 return z.gUQ(z).XG(0,new H.mb())},
 $isQF:true},
 mb:{
-"^":"Tp:132;",
-$1:function(a){return a.gGD()},
+"^":"Tp:357;",
+$1:[function(a){return a.gGD()},"$1",null,2,0,null,356,[],"call"],
 $isEH:true},
 amu:{
 "^":"jU;If<",
@@ -3346,7 +3409,7 @@
 $isNL:true,
 $isQF:true},
 Uz:{
-"^":"uh;FP<,aP,wP,le,LB,GD<,ae,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
+"^":"uh;FP<,aP,wP,le,LB,GD<,ae<,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
 gOO:function(){return"LibraryMirror"},
 gUx:function(a){return this.If},
 gEO:function(){return this.gm8()},
@@ -3357,11 +3420,11 @@
 for(z=J.GP(this.aP);z.G();){x=H.jO(z.gl())
 if(!!J.x(x).$isMs){x=x.gJi()
 if(!!x.$isWf){y.u(0,x.If,x)
-x.jE=this}}}z=H.VM(new P.Oh(y),[P.wv,P.Ms])
+x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
 this.P8=z
 return z},
 rN:function(a){var z,y
-z=this.gQH().Fb.t(0,a)
+z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,[],null,null))
 if(!J.x(z).$isRS)return H.vn(z.IB(this))
 if(z.glT())return H.vn(z.IB(this))
@@ -3369,7 +3432,7 @@
 if(y==null)throw H.b(P.SY(null))
 return H.vn(y())},
 F2:function(a,b,c){var z,y,x
-z=this.gQH().Fb.t(0,a)
+z=this.gQH().nb.t(0,a)
 y=!!J.x(z).$isZk
 if(y&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
 if(z!=null)x=y&&z.hB
@@ -3411,17 +3474,17 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.gm8(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-if(!x.gxV())y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RS])
+if(!x.gxV())y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RS])
 this.mX=z
 return z},
 gF4:function(){var z=this.T1
 if(z!=null)return z
-z=H.VM(new P.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
+z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
 this.T1=z
 return z},
 gM1:function(){var z=this.fX
 if(z!=null)return z
-z=H.VM(new P.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
+z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
 this.fX=z
 return z},
 gcc:function(){var z,y,x
@@ -3429,7 +3492,7 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
 this.M2=z
 return z},
 gQH:function(){var z,y
@@ -3439,19 +3502,19 @@
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
 z=new H.IB(y)
-this.gQn().Fb.aN(0,z)
-this.gF4().Fb.aN(0,z)
-this.gM1().Fb.aN(0,z)
-this.gcc().Fb.aN(0,z)
-z=H.VM(new P.Oh(y),[P.wv,P.QF])
+this.gQn().nb.aN(0,z)
+this.gF4().nb.aN(0,z)
+this.gM1().nb.aN(0,z)
+this.gcc().nb.aN(0,z)
+z=H.VM(new H.Oh(y),[P.wv,P.QF])
 this.uA=z
 return z},
 gYK:function(){var z,y
 z=this.Db
 if(z!=null)return z
 y=P.L5(null,null,null,P.wv,P.NL)
-this.gQH().Fb.aN(0,new H.oP(y))
-z=H.VM(new P.Oh(y),[P.wv,P.NL])
+this.gQH().nb.aN(0,new H.oP(y))
+z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
 gc9:function(){var z=this.xO
@@ -3467,16 +3530,16 @@
 "^":"amu+M2;",
 $isQF:true},
 IB:{
-"^":"Tp:133;a",
-$2:function(a,b){this.a.u(0,a,b)},
+"^":"Tp:358;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 oP:{
-"^":"Tp:133;a",
-$2:function(a,b){this.a.u(0,a,b)},
+"^":"Tp:358;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 YX:{
-"^":"Tp:22;a",
-$0:function(){return this.a},
+"^":"Tp:115;a",
+$0:[function(){return this.a},"$0",null,0,0,null,"call"],
 $isEH:true},
 BI:{
 "^":"Un;AY<,XW,BB,i1,If",
@@ -3511,9 +3574,7 @@
 $isQF:true},
 iu:{
 "^":"M2;Ax<,xq",
-gt5:function(a){var z=this.Ax
-if(z==null)return P.re(C.Qf)
-return H.jO(H.dJ(z))},
+gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
 F2:function(a,b,c){return this.tu(a,0,b,c==null?C.CM:c)},
 CI:function(a,b){return this.F2(a,b,null)},
 Z7:function(a,b,c){var z,y,x,w,v,u,t,s
@@ -3607,12 +3668,12 @@
 $isvr:true,
 $isQF:true},
 vo:{
-"^":"Tp:134;a",
-$2:function(a,b){var z,y
+"^":"Tp:359;a",
+$2:[function(a,b){var z,y
 z=J.GL(a)
 y=this.a
 if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"$2",null,4,0,null,146,[],30,[],"call"],
 $isEH:true},
 bl:{
 "^":"amu;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,yF,If",
@@ -3646,7 +3707,7 @@
 return z},
 gEz:function(){var z=this.b0
 if(z!=null)return z
-z=H.VM(new P.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
+z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
 this.b0=z
 return z},
 gcc:function(){var z,y,x
@@ -3654,12 +3715,12 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.NK.ws(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
 this.M2=z
 return z},
 gQH:function(){var z=this.uA
 if(z!=null)return z
-z=H.VM(new P.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.NL])
+z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.NL])
 this.uA=z
 return z},
 gYK:function(){var z,y
@@ -3669,7 +3730,7 @@
 y.FV(0,this.gQH())
 y.FV(0,this.gEz())
 J.kH(this.NK.gNy(),new H.Ax(y))
-z=H.VM(new P.Oh(y),[P.wv,P.NL])
+z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
 rN:function(a){return this.NK.rN(a)},
@@ -3700,37 +3761,40 @@
 $isX9:true,
 $isNL:true},
 tB:{
-"^":"Tp:8;a",
-$1:function(a){var z,y,x
+"^":"Tp:32;a",
+$1:[function(a){var z,y,x
 z=H.BU(a,null,new H.Oo())
 y=this.a
 if(J.de(z,-1))y.push(H.jO(J.rr(a)))
 else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"$1",null,2,0,null,360,[],"call"],
 $isEH:true},
 Oo:{
-"^":"Tp:16;",
-$1:function(a){return-1},
+"^":"Tp:116;",
+$1:[function(a){return-1},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 Tc:{
-"^":"Tp:16;b",
-$1:function(a){return this.b.$1(a)},
+"^":"Tp:116;b",
+$1:[function(a){return this.b.$1(a)},"$1",null,2,0,null,95,[],"call"],
 $isEH:true},
 Ax:{
-"^":"Tp:16;a",
-$1:function(a){this.a.u(0,a.gIf(),a)
-return a},
+"^":"Tp:116;a",
+$1:[function(a){this.a.u(0,a.gIf(),a)
+return a},"$1",null,2,0,null,361,[],"call"],
 $isEH:true},
 Wf:{
-"^":"vk;Cr<,aB<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
+"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
 gOO:function(){return"ClassMirror"},
+gaB:function(){var z=this.Tx
+if(H.SG(z))return z.constructor
+else return z},
 gEz:function(){var z=this.b0
 if(z!=null)return z
-z=H.VM(new P.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
+z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
 this.b0=z
 return z},
 ly:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=this.aB.prototype
+z=this.gaB().prototype
 y=H.kU(z)
 x=H.VM([],[H.Zk])
 for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){v=w.lo
@@ -3744,7 +3808,7 @@
 s.jE=a}y=H.kU(init.statics[this.Cr])
 for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){r=w.lo
 if(H.Y6(r))continue
-q=this.gXP().ae[r]
+q=this.gXP().gae()[r]
 if("$reflectable" in q){p=q.$reflectionName
 if(p==null)continue
 o=C.xB.nC(p,"new ")
@@ -3776,12 +3840,12 @@
 return z},
 ghp:function(){var z=this.FU
 if(z!=null)return z
-z=H.VM(new P.Oh(H.Vv(this.gEO())),[P.wv,P.RS])
+z=H.VM(new H.Oh(H.Vv(this.gEO())),[P.wv,P.RS])
 this.FU=z
 return z},
 gF4:function(){var z=this.T1
 if(z!=null)return z
-z=H.VM(new P.Oh(H.EK(this.gEO(),this.gcc())),[P.wv,P.RS])
+z=H.VM(new H.Oh(H.EK(this.gEO(),this.gcc())),[P.wv,P.RS])
 this.T1=z
 return z},
 gcc:function(){var z,y,x
@@ -3789,12 +3853,12 @@
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new P.Oh(y),[P.wv,P.RY])
+y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
 this.M2=z
 return z},
 gQH:function(){var z=this.uA
 if(z!=null)return z
-z=H.VM(new P.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
+z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
 this.uA=z
 return z},
 gYK:function(){var z,y
@@ -3802,41 +3866,41 @@
 if(z!=null)return z
 y=P.L5(null,null,null,P.wv,P.NL)
 z=new H.Ei(y)
-this.gQH().Fb.aN(0,z)
-this.gEz().Fb.aN(0,z)
+this.gQH().nb.aN(0,z)
+this.gEz().nb.aN(0,z)
 J.kH(this.gNy(),new H.Ci(y))
-z=H.VM(new P.Oh(y),[P.wv,P.NL])
+z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
 Ve:function(a){var z,y
-z=this.gcc().Fb.t(0,a)
+z=this.gcc().nb.t(0,a)
 if(z!=null)return z.gFo()
-y=this.gF4().Fb.t(0,a)
+y=this.gF4().nb.t(0,a)
 return y!=null&&y.gFo()},
 rN:function(a){var z,y,x,w
-z=this.gcc().Fb.t(0,a)
+z=this.gcc().nb.t(0,a)
 if(z!=null&&z.gFo()){y=z.gcK()
 if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
 if(y in init.lazies)return H.vn($[init.lazies[y]]())
-else return H.vn($[y])}x=this.gF4().Fb.t(0,a)
+else return H.vn($[y])}x=this.gF4().nb.t(0,a)
 if(x!=null&&x.gFo())return H.vn(x.jd(C.xD,C.CM))
-w=this.ghp().Fb.t(0,a)
+w=this.ghp().nb.t(0,a)
 if(w!=null&&w.gFo()){x=w.gdl().$getter
 if(x==null)throw H.b(P.SY(null))
 return H.vn(x())}throw H.b(P.lr(this,a,null,null,null))},
 gXP:function(){var z,y
 z=this.jE
-if(z==null){z=$.vK()
+if(z==null){if(H.SG(this.Tx))this.jE=H.jO(C.nY.LU).gXP()
+else{z=$.vK()
 z=z.gUQ(z)
 y=new H.MH(null,J.GP(z.l6),z.T6)
 y.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()
-z=this.jE
+for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()}z=this.jE
 if(z==null)throw H.b(P.w("Class \""+H.d(H.TS(this.If))+"\" has no owner"))}return z},
 gc9:function(){var z=this.xO
 if(z!=null)return z
 z=this.le
-if(z==null){z=H.pj(this.aB.prototype)
+if(z==null){z=H.pj(this.gaB().prototype)
 this.le=z}z=H.VM(new P.Yp(J.kl(z,H.Yf())),[P.vr])
 this.xO=z
 return z},
@@ -3856,7 +3920,7 @@
 this.qN=z}else{z=x.n(w,"")?this:H.jO(w)
 this.qN=z}}}return J.de(z,this)?null:this.qN},
 F2:function(a,b,c){var z,y
-z=this.ghp().Fb.t(0,a)
+z=this.ghp().nb.t(0,a)
 y=z==null
 if(y&&this.Ve(a))return this.rN(a).F2(C.Ka,b,c)
 if(y||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
@@ -3878,7 +3942,7 @@
 z=this.UF
 if(z!=null)return z
 y=[]
-x=this.aB.prototype["<>"]
+x=this.gaB().prototype["<>"]
 if(x==null)return y
 for(w=0;w<x.length;++w){z=x[w]
 v=init.metadata[z]
@@ -3897,17 +3961,17 @@
 "^":"EE+M2;",
 $isQF:true},
 Ei:{
-"^":"Tp:133;a",
-$2:function(a,b){this.a.u(0,a,b)},
+"^":"Tp:358;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 Ci:{
-"^":"Tp:16;b",
-$1:function(a){this.b.u(0,a.gIf(),a)
-return a},
+"^":"Tp:116;b",
+$1:[function(a){this.b.u(0,a.gIf(),a)
+return a},"$1",null,2,0,null,361,[],"call"],
 $isEH:true},
 t0:{
-"^":"Tp:136;a",
-$1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,135,[],"call"],
+"^":"Tp:362;a",
+$1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,334,[],"call"],
 $isEH:true},
 XJ:{
 "^":"amu;cK<,V5>,Fo<,n6,jE,Ay>,le,If",
@@ -3946,10 +4010,10 @@
 v.$builtinTypeInfo=[H.Kp(y,0)]
 for(;t=!0,v.G();)if(J.de(v.lo.gIf(),o)){t=!1
 break}}if(1>=z.length)return H.e(z,1)
-return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:function(a){if(a>=60&&a<=64)return a-59
+return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
 if(a>=123&&a<=126)return a-117
 if(a>=37&&a<=43)return a-27
-return 0}}},
+return 0},"$1","Na",2,0,null,154,[]]}},
 Sz:{
 "^":"iu;Ax,xq",
 gMj:function(a){var z,y,x,w,v,u,t,s
@@ -3992,8 +4056,8 @@
 v=H.zh(z)
 if(v!=null){u=v.AM
 if(typeof u==="number"&&Math.floor(u)===u)t=new H.Ar(v.hl(null),null,null,null,this)
-else t=this.gXP()!=null&&!!J.x(this.gXP()).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gaB()),null,null,null,this.jE)
-if(this.xV)this.wM=this.jE
+else{z=this.gXP()
+t=z!=null&&!!J.x(z).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
 else this.wM=t.gdw()
 s=v.Mo
 for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.Rv,q=v.Rn,p=v.hG,o=0;z.G();o=h){n=z.lo
@@ -4045,8 +4109,8 @@
 $isNL:true,
 $isQF:true},
 wt:{
-"^":"Tp:137;",
-$1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,135,[],"call"],
+"^":"Tp:363;",
+$1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,334,[],"call"],
 $isEH:true},
 ng:{
 "^":"amu;Cr<,CM,If",
@@ -4101,22 +4165,19 @@
 y.push(new H.fu(this,z.named[u],!1,!1,null,C.iH,H.YC(u)))}z=H.VM(new P.Yp(y),[P.Ys])
 this.zM=z
 return z},
-Hu:function(a){var z=init.mangledGlobalNames[a]
-if(z!=null)return z
-return a},
 bu:function(a){var z,y,x,w,v,u
 z=this.o3
 if(z!=null)return z
 z=this.d9
 if("args" in z)for(y=z.args,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x="FunctionTypeMirror on '(",w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,this.Hu(H.Ko(v,null)))}else{x="FunctionTypeMirror on '("
+x=C.xB.g(x+w,H.Ko(v,null))}else{x="FunctionTypeMirror on '("
 w=""}if("opt" in z){x+=w+"["
 for(y=z.opt,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,this.Hu(H.Ko(v,null)))}x+="]"}if("named" in z){x+=w+"{"
+x=C.xB.g(x+w,H.Ko(v,null))}x+="]"}if("named" in z){x+=w+"{"
 for(y=H.kU(z.named),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){u=y.lo
-x=C.xB.g(x+w+(H.d(u)+": "),this.Hu(H.Ko(z.named[u],null)))}x+="}"}x+=") -> "
+x=C.xB.g(x+w+(H.d(u)+": "),H.Ko(z.named[u],null))}x+="}"}x+=") -> "
 if(!!z.void)x+="void"
-else x="ret" in z?C.xB.g(x,this.Hu(H.Ko(z.ret,null))):x+"dynamic"
+else x="ret" in z?C.xB.g(x,H.Ko(z.ret,null)):x+"dynamic"
 z=x+"'"
 this.o3=z
 return z},
@@ -4128,151 +4189,170 @@
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:138;a",
-$1:function(a){var z,y,x
+"^":"Tp:364;a",
+$1:[function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
 x=H.w2(y.a.gNy(),J.O6(z))
-return J.UQ(y.a.gw8(),x)},
+return J.UQ(y.a.gw8(),x)},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 iW:{
-"^":"Tp:18;b",
-$1:function(a){var z,y
+"^":"Tp:121;b",
+$1:[function(a){var z,y
 z=this.b.$1(a)
 y=J.x(z)
 if(!!y.$iscw)return H.d(z.Nz)
 if(!y.$isWf&&!y.$isbl)if(y.n(z,$.P8()))return"dynamic"
 else if(y.n(z,$.oj()))return"void"
 else return"dynamic"
-return z.gCr()},
+return z.gCr()},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 ye:{
-"^":"Tp:137;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,135,[],"call"],
+"^":"Tp:363;",
+$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,334,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:137;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,135,[],"call"],
-$isEH:true}}],["dart._js_names","dart:_js_names",,H,{
+"^":"Tp:363;",
+$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,334,[],"call"],
+$isEH:true},
+Oh:{
+"^":"a;nb",
+gB:function(a){return this.nb.X5},
+gl0:function(a){return this.nb.X5===0},
+gor:function(a){return this.nb.X5!==0},
+t:function(a,b){return this.nb.t(0,b)},
+x4:function(a){return this.nb.x4(a)},
+di:function(a){return this.nb.di(a)},
+aN:function(a,b){return this.nb.aN(0,b)},
+gvc:function(){var z=this.nb
+return H.VM(new P.i5(z),[H.Kp(z,0)])},
+gUQ:function(a){var z=this.nb
+return z.gUQ(z)},
+u:function(a,b,c){return H.kT()},
+FV:function(a,b){return H.kT()},
+Rz:function(a,b){H.kT()},
+V1:function(a){return H.kT()},
+$isZ0:true,
+static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","lY",0,0,null]}}}],["dart._js_names","dart:_js_names",,H,{
 "^":"",
-hY:function(a,b){var z,y,x,w,v,u,t
+hY:[function(a,b){var z,y,x,w,v,u,t
 z=H.kU(a)
-y=P.Fl(P.qU,P.qU)
+y=P.Fl(J.O,J.O)
 for(x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),w=!b;x.G();){v=x.lo
 u=a[v]
 y.u(0,v,u)
 if(w){t=J.rY(v)
-if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},
-YK:function(a){var z=P.Fl(P.qU,P.qU)
+if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"$2","Il",4,0,null,160,[],161,[]],
+YK:[function(a){var z=P.Fl(J.O,J.O)
 a.aN(0,new H.Xh(z))
-return z},
-kU:function(a){var z=H.VM(function(b,c){var y=[]
+return z},"$1","OX",2,0,null,162,[]],
+kU:[function(a){var z=H.VM(function(b,c){var y=[]
 for(var x in b){if(c.call(b,x))y.push(x)}return y}(a,Object.prototype.hasOwnProperty),[null])
 z.fixed$length=init
-return z},
+return z},"$1","DF",2,0,null,158,[]],
 Xh:{
-"^":"Tp:139;a",
-$2:function(a,b){this.a.u(0,b,a)},
+"^":"Tp:366;a",
+$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,149,[],365,[],"call"],
 $isEH:true}}],["dart.async","dart:async",,P,{
 "^":"",
-Oj:function(){if($.jk().scheduleImmediate!=null)return P.Sx()
-return P.K7()},
+Oj:[function(){if($.jk().scheduleImmediate!=null)return P.Sx()
+return P.K7()},"$0","n9",0,0,null],
 ZV:[function(a){++init.globalState.Xz.GL
-$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,25],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,25],
-VH:function(a,b){var z=H.N7()
+$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,163,164,[]],
+Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,163,164,[]],
+VH:[function(a,b){var z=H.N7()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
-else return b.cR(a)},
+else return b.cR(a)},"$2","zZ",4,0,null,165,[],166,[]],
 e4:function(a,b){var z=P.Dt(b)
 P.rT(C.ny,new P.ZC(a,z))
 return z},
-Cx:function(){var z=$.S6
+Cx:[function(){var z=$.S6
 for(;z!=null;){J.cG(z)
 z=z.gaw()
-$.S6=z}$.k8=null},
+$.S6=z}$.k8=null},"$0","BN",0,0,null],
 BG:[function(){var z
 try{P.Cx()}catch(z){H.Ru(z)
 $.ej().$1(P.qZ())
 $.S6=$.S6.gaw()
-throw z}},"$0","qZ",0,0,21],
-IA:function(a){var z,y
+throw z}},"$0","qZ",0,0,126],
+IA:[function(a){var z,y
 z=$.k8
 if(z==null){z=new P.OM(a,null)
 $.k8=z
 $.S6=z
 $.ej().$1(P.qZ())}else{y=new P.OM(a,null)
 z.aw=y
-$.k8=y}},
-rb:function(a){var z
+$.k8=y}},"$1","e6",2,0,null,164,[]],
+rb:[function(a){var z
 if(J.de($.X3,C.NU)){$.X3.wr(a)
 return}z=$.X3
-z.wr(z.xi(a,!0))},
+z.wr(z.xi(a,!0))},"$1","Rf",2,0,null,164,[]],
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
 z.SJ=z
 z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
 z.SJ=z
 z.iE=z}return z},
-ot:function(a){var z,y,x,w,v
+ot:[function(a){var z,y,x,w,v
 if(a==null)return
 try{z=a.$0()
 if(!!J.x(z).$isb8)return z
 return}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-$.X3.hk(y,x)}},
-YE:[function(a){},"$1","bZ",2,0,26,27,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,28,29,30,[],31,[]],
-dL:[function(){},"$0","v3",0,0,21],
-FE:function(a,b,c){var z,y,x,w
+$.X3.hk(y,x)}},"$1","DC",2,0,null,168,[]],
+YE:[function(a){},"$1","bZ",2,0,169,30,[]],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,170,85,171,[],172,[]],
+dL:[function(){},"$0","v3",0,0,126],
+FE:[function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
-c.$2(z,y)}},
-NX:function(a,b,c,d){a.ed()
-b.K5(c,d)},
-TB:function(a,b){return new P.uR(a,b)},
-Bb:function(a,b,c){a.ed()
-b.rX(c)},
+c.$2(z,y)}},"$3","mc",6,0,null,173,[],174,[],175,[]],
+NX:[function(a,b,c,d){a.ed()
+b.K5(c,d)},"$4","QD",8,0,null,176,[],177,[],171,[],172,[]],
+TB:[function(a,b){return new P.uR(a,b)},"$2","cH",4,0,null,176,[],177,[]],
+Bb:[function(a,b,c){a.ed()
+b.rX(c)},"$3","E1",6,0,null,176,[],177,[],30,[]],
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
-jL:function(a,b){var z=a.gVs()
-return H.cy(z<0?0:z,b)},
-PJ:function(a){var z=$.X3
+jL:[function(a,b){var z=a.gVs()
+return H.cy(z<0?0:z,b)},"$2","et",4,0,null,178,[],164,[]],
+PJ:[function(a){var z=$.X3
 $.X3=a
-return z},
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","xP",10,0,32,33,[],34,[],35,[],30,[],31,[]],
+return z},"$1","kb",2,0,null,166,[]],
+L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","xP",10,0,179,180,[],181,[],166,[],171,[],172,[]],
 T8:[function(a,b,c,d){var z,y
 if(J.de($.X3,c))return d.$0()
 z=P.PJ(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","AI",8,0,36,33,[],34,[],35,[],37,[]],
+return y}finally{$.X3=z}},"$4","AI",8,0,182,180,[],181,[],166,[],128,[]],
 V7:[function(a,b,c,d,e){var z,y
 if(J.de($.X3,c))return d.$1(e)
 z=P.PJ(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,38,33,[],34,[],35,[],37,[],39,[]],
+return y}finally{$.X3=z}},"$5","MM",10,0,183,180,[],181,[],166,[],128,[],184,[]],
 Qx:[function(a,b,c,d,e,f){var z,y
 if(J.de($.X3,c))return d.$2(e,f)
 z=P.PJ(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","l4",12,0,40,33,[],34,[],35,[],37,[],12,[],13,[]],
-Ee:[function(a,b,c,d){return d},"$4","EU",8,0,41,33,[],34,[],35,[],37,[]],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,42,33,[],34,[],35,[],37,[]],
-VI:[function(a,b,c,d){return d},"$4","uu",8,0,43,33,[],34,[],35,[],37,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,44],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,45,33,[],34,[],35,[],46,[],47,[]],
-XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,48],
-CI:[function(a){J.O2($.X3,a)},"$1","jt",2,0,49],
+return y}finally{$.X3=z}},"$6","l4",12,0,185,180,[],181,[],166,[],128,[],60,[],61,[]],
+Ee:[function(a,b,c,d){return d},"$4","EU",8,0,186,180,[],181,[],166,[],128,[]],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,187,180,[],181,[],166,[],128,[]],
+VI:[function(a,b,c,d){return d},"$4","uu",8,0,188,180,[],181,[],166,[],128,[]],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,189,180,[],181,[],166,[],128,[]],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,190,180,[],181,[],166,[],178,[],164,[]],
+XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,191,180,[],181,[],166,[],192,[]],
+CI:[function(a){J.O2($.X3,a)},"$1","Ib",2,0,193,192,[]],
 UA:[function(a,b,c,d,e){var z
-$.oK=P.jt()
+$.oK=P.Ib()
 z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","hn",10,0,50],
+return new P.uo(c,d,z)},"$5","hn",10,0,194,180,[],181,[],166,[],195,[],196,[]],
 C6:{
-"^":"Tp:22;a",
+"^":"Tp:115;a",
 $0:[function(){H.ox()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -4282,7 +4362,7 @@
 Ik:{
 "^":"O9;Y8"},
 JI:{
-"^":"yU;Ae@,iE@,SJ@,Y8,dB,o7,Bd,Lj,Gv,lz,Ri",
+"^":"yU;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,Ri",
 gY8:function(){return this.Y8},
 uR:function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
@@ -4299,9 +4379,9 @@
 gHj:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,21],
-LP:[function(){},"$0","gZ9",0,0,21],
-static:{"^":"E2b,RG,cP"}},
+uO:[function(){},"$0","gp4",0,0,126],
+LP:[function(){},"$0","gZ9",0,0,126],
+static:{"^":"FJ,RG,cP"}},
 WVu:{
 "^":"a;iE@,SJ@",
 gRW:function(){return!1},
@@ -4325,9 +4405,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.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},140,[]],
+this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},248,[]],
 fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,141,29,30,[],31,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,367,85,171,[],172,[]],
 cO:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
@@ -4379,17 +4459,17 @@
 else this.Ip.OH(null)}},
 tK:{
 "^":"Tp;a,b",
-$1:function(a){a.Rg(0,this.b)},
+$1:[function(a){a.Rg(0,this.b)},"$1",null,2,0,null,176,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 OR:{
 "^":"Tp;a,b,c",
-$1:function(a){a.V8(this.b,this.c)},
+$1:[function(a){a.V8(this.b,this.c)},"$1",null,2,0,null,176,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 Bg:{
 "^":"Tp;a",
-$1:function(a){a.Qj()},
+$1:[function(a){a.Qj()},"$1",null,2,0,null,176,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"WhE",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
@@ -4407,7 +4487,7 @@
 "^":"a;",
 $isb8:true},
 ZC:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
 z=w
@@ -4420,12 +4500,12 @@
 "^":"Pf0;MM",
 oo:[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.oo(a,null)},"tZ","$1","$0","gv6",0,2,142,29,27,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","$1","$0","gv6",0,2,368,85,30,[]],
 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,141,29,30,[],31,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,367,85,171,[],172,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -4482,7 +4562,7 @@
 P.HZ(this,z)},
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,28,29,30,[],31,[]],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,170,85,171,[],172,[]],
 OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
@@ -4503,15 +4583,15 @@
 z.L7(a,b)
 return z},Vu:function(a,b,c){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
-return z},k3:function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},A9:function(a,b){b.swG(!0)
+return z},k3:[function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},"$2","KP",4,0,null,33,[],82,[]],A9:[function(a,b){b.swG(!0)
 if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},yE:function(a,b){var z
+else a.au(b)},"$2","dd",4,0,null,33,[],82,[]],yE:[function(a,b){var z
 do{z=b.gBQ()
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q
+continue}else break}while(!0)},"$2","cN",4,0,null,33,[],167,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -4549,44 +4629,44 @@
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=q}}}},
+b=q}},"$2","XX",4,0,null,33,[],167,[]]}},
 da:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 pV:{
-"^":"Tp:16;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,27,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 U7:{
-"^":"Tp:143;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,29,30,[],31,[],"call"],
+"^":"Tp:369;b",
+$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
 $isEH:true},
 rH:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cX:{
-"^":"Tp:22;c,d",
+"^":"Tp:115;c,d",
 $0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"Tp:22;a,b,c",
+"^":"Tp:115;a,b,c",
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:126;b,d,e,f",
-$0:function(){var z,y,x,w
+"^":"Tp:307;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)
 z=w
 y=new H.XO(x,null)
 this.b.c=new P.Ca(z,y)
-return!1}},
+return!1}},"$0",null,0,0,null,"call"],
 $isEH:true},
 RW:{
-"^":"Tp:21;c,b,UI,bK",
-$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+"^":"Tp:126;c,b,UI,bK",
+$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
 r=this.UI
 y=r.gyK()
@@ -4618,11 +4698,11 @@
 r.b=!1
 return}this.b.b=!0}else{r=this.b
 r.c=z
-r.b=!1}},
+r.b=!1}},"$0",null,0,0,null,"call"],
 $isEH:true},
 RT:{
-"^":"Tp:21;c,b,Gq,Rm,w3",
-$0:function(){var z,y,x,w,v,u
+"^":"Tp:126;c,b,Gq,Rm,w3",
+$0:[function(){var z,y,x,w,v,u
 z={}
 z.a=null
 try{z.a=this.w3.Gr(this.Rm.gIa())}catch(w){v=H.Ru(w)
@@ -4638,30 +4718,30 @@
 u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
 v.swG(!0)
 this.b.d=!0
-z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},
+z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"$0",null,0,0,null,"call"],
 $isEH:true},
 jZ:{
-"^":"Tp:16;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,144,[],"call"],
+"^":"Tp:116;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,370,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:143;a,mG",
+"^":"Tp:369;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isvs){y=P.Dt(null)
 z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,29,30,[],31,[],"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
 qh:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")}],
-Ft:[function(a,b){return H.VM(new P.aW(b,this),[H.ip(this,"qh",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.qh,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"qh")}],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")},371,[]],
+Ft:[function(a,b){return H.VM(new P.aW(b,this),[H.ip(this,"qh",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.qh,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"qh")},371,[]],
 tg:function(a,b){var z,y
 z={}
-y=P.Dt(P.a2)
+y=P.Dt(J.kn)
 z.a=null
 z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.YJ(y),y.gaq())
 return y},
@@ -4673,25 +4753,25 @@
 return y},
 Vr:function(a,b){var z,y
 z={}
-y=P.Dt(P.a2)
+y=P.Dt(J.kn)
 z.a=null
 z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gaq())
 return y},
 gB:function(a){var z,y
 z={}
-y=P.Dt(P.KN)
+y=P.Dt(J.bU)
 z.a=0
 this.KR(new P.B5(z),!0,new P.PI(z,y),y.gaq())
 return y},
 gl0:function(a){var z,y
 z={}
-y=P.Dt(P.a2)
+y=P.Dt(J.kn)
 z.a=null
 z.a=this.KR(new P.j4(z,y),!0,new P.i9(y),y.gaq())
 return y},
 br:function(a){var z,y
 z=H.VM([],[H.ip(this,"qh",0)])
-y=P.Dt([P.zM,H.ip(this,"qh",0)])
+y=P.Dt([J.Q,H.ip(this,"qh",0)])
 this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gaq())
 return y},
 qZ:function(a,b){var z=H.VM(new P.Zz(b,this),[null])
@@ -4727,36 +4807,36 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.jv(this.c,a),new P.bi(z,y),P.TB(z.a,y))},"$1",null,2,0,null,145,[],"call"],
+P.FE(new P.jv(this.c,a),new P.bi(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 jv:{
-"^":"Tp:22;e,f",
-$0:function(){return J.de(this.f,this.e)},
+"^":"Tp:115;e,f",
+$0:[function(){return J.de(this.f,this.e)},"$0",null,0,0,null,"call"],
 $isEH:true},
 bi:{
-"^":"Tp:127;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
+"^":"Tp:310;a,UI",
+$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,372,[],"call"],
 $isEH:true},
 YJ:{
-"^":"Tp:22;bK",
+"^":"Tp:115;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.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,145,[],"call"],
+$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,142,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Rl:{
-"^":"Tp:22;e,f",
-$0:function(){return this.e.$1(this.f)},
+"^":"Tp:115;e,f",
+$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Jb:{
-"^":"Tp:16;",
-$1:function(a){},
+"^":"Tp:116;",
+$1:[function(a){},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 M4:{
-"^":"Tp:22;UI",
+"^":"Tp:115;UI",
 $0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Jp:{
@@ -4764,64 +4844,64 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"$1",null,2,0,null,145,[],"call"],
+P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 h7:{
-"^":"Tp:22;e,f",
-$0:function(){return this.e.$1(this.f)},
+"^":"Tp:115;e,f",
+$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 pr:{
-"^":"Tp:127;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
+"^":"Tp:310;a,UI",
+$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,372,[],"call"],
 $isEH:true},
 eN:{
-"^":"Tp:22;bK",
+"^":"Tp:115;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 B5:{
-"^":"Tp:16;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,17,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){++this.a.a},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 PI:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 j4:{
-"^":"Tp:16;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,17,[],"call"],
+"^":"Tp:116;a,b",
+$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 i9:{
-"^":"Tp:22;c",
+"^":"Tp:115;c",
 $0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
 VV:{
 "^":"Tp;a,b",
-$1:[function(a){this.b.push(a)},"$1",null,2,0,null,140,[],"call"],
+$1:[function(a){this.b.push(a)},"$1",null,2,0,null,248,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.a,"qh")}},
 Dy:{
-"^":"Tp:22;c,d",
+"^":"Tp:115;c,d",
 $0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lU:{
 "^":"Tp;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,27,[],"call"],
+$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 OC:{
-"^":"Tp:22;d",
+"^":"Tp:115;d",
 $0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
 "^":"Tp;a,b",
 $1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"$1",null,2,0,null,27,[],"call"],
+z.a=a},"$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Z5:{
-"^":"Tp:22;a,c",
+"^":"Tp:115;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"],
@@ -4830,11 +4910,11 @@
 "^":"Tp;a,b,c",
 $1:[function(a){var z=this.a
 if(J.de(z.a,0)){P.Bb(z.b,this.c,a)
-return}z.a=J.xH(z.a,1)},"$1",null,2,0,null,27,[],"call"],
+return}z.a=J.xH(z.a,1)},"$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 ii:{
-"^":"Tp:22;a,d",
+"^":"Tp:115;a,d",
 $0:[function(){this.d.Lp(new P.bJ("value "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
 $isEH:true},
 MO:{
@@ -4867,13 +4947,13 @@
 yU:{
 "^":"KA;Y8<",
 tA:function(){return this.gY8().j0(this)},
-uO:[function(){this.gY8()},"$0","gp4",0,0,21],
-LP:[function(){this.gY8()},"$0","gZ9",0,0,21]},
+uO:[function(){this.gY8()},"$0","gp4",0,0,126],
+LP:[function(){this.gY8()},"$0","gZ9",0,0,126]},
 nP:{
 "^":"a;"},
 KA:{
-"^":"a;dB,o7<,Bd,Lj<,Gv,lz,Ri",
-fe:function(a){this.dB=this.Lj.cR(a)},
+"^":"a;pN,o7<,Bd,Lj<,Gv,lz,Ri",
+fe:function(a){this.pN=this.Lj.cR(a)},
 fm:function(a,b){if(b==null)b=P.AY()
 this.o7=P.VH(b,this.Lj)},
 y5:function(a){if(a==null)a=P.v3()
@@ -4920,8 +5000,8 @@
 this.Gv=z
 if(z<32)this.SY()
 else this.w6(C.Wj)},
-uO:[function(){},"$0","gp4",0,0,21],
-LP:[function(){},"$0","gZ9",0,0,21],
+uO:[function(){},"$0","gp4",0,0,126],
+LP:[function(){},"$0","gZ9",0,0,126],
 tA:function(){},
 w6:function(a){var z,y
 z=this.Ri
@@ -4933,7 +5013,7 @@
 if(y<128)this.Ri.t2(this)}},
 Iv:function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
-this.Lj.m1(this.dB,a)
+this.Lj.m1(this.pN,a)
 this.Gv=(this.Gv&4294967263)>>>0
 this.Kl((z&4)!==0)},
 pb:function(a,b){var z,y
@@ -4968,10 +5048,10 @@
 z=(this.Gv&4294967263)>>>0
 this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},
 $isMO:true,
-static:{"^":"ry,bG,Q9,wd,yJ,lk,HX,GC,bsZ"}},
+static:{"^":"ry,bG,Q9,wd,yJ,Dr,HX,GC,bsZ"}},
 Vo:{
-"^":"Tp:21;a,b,c",
-$0:function(){var z,y,x,w,v,u
+"^":"Tp:126;a,b,c",
+$0:[function(){var z,y,x,w,v
 z=this.a
 y=z.Gv
 if((y&8)!==0&&(y&16)===0)return
@@ -4981,20 +5061,19 @@
 else{x=z.o7
 w=H.N7()
 w=H.KT(w,[w,w]).BD(x)
-v=z.o7
-u=this.b
-if(w)y.z8(v,u,this.c)
-else y.m1(v,u)}z.Gv=(z.Gv&4294967263)>>>0},
+v=this.b
+if(w)y.z8(x,v,this.c)
+else y.m1(x,v)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
 qB:{
-"^":"Tp:21;a",
-$0:function(){var z,y
+"^":"Tp:126;a",
+$0:[function(){var z,y
 z=this.a
 y=z.Gv
 if((y&16)===0)return
 z.Gv=(y|42)>>>0
 z.Lj.bH(z.Bd)
-z.Gv=(z.Gv&4294967263)>>>0},
+z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
 aN:{
 "^":"qh;",
@@ -5032,7 +5111,7 @@
 return}P.rb(new P.CR(this,a))
 this.Gv=1}},
 CR:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -5057,16 +5136,16 @@
 this.N6=null
 this.zR=null}},
 v1y:{
-"^":"Tp:22;a,b,c",
-$0:function(){return this.a.K5(this.b,this.c)},
+"^":"Tp:115;a,b,c",
+$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:146;a,b",
-$2:function(a,b){return P.NX(this.a,this.b,a,b)},
+"^":"Tp:373;a,b",
+$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"$2",null,4,0,null,171,[],172,[],"call"],
 $isEH:true},
-vm:{
-"^":"Tp:22;a,b",
-$0:function(){return this.a.rX(this.b)},
+Q0:{
+"^":"Tp:115;a,b",
+$0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 YR:{
 "^":"qh;",
@@ -5087,23 +5166,23 @@
 Ml:function(a,b){b.Rg(0,a)},
 $asqh:function(a,b){return[b]}},
 fB:{
-"^":"KA;UY,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
+"^":"KA;UY,Ee,pN,o7,Bd,Lj,Gv,lz,Ri",
 Rg:function(a,b){if((this.Gv&2)!==0)return
 P.KA.prototype.Rg.call(this,this,b)},
 V8:function(a,b){if((this.Gv&2)!==0)return
 P.KA.prototype.V8.call(this,a,b)},
 uO:[function(){var z=this.Ee
 if(z==null)return
-z.yy(0)},"$0","gp4",0,0,21],
+z.yy(0)},"$0","gp4",0,0,126],
 LP:[function(){var z=this.Ee
 if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,21],
+z.QE(0)},"$0","gZ9",0,0,126],
 tA:function(){var z=this.Ee
 if(z!=null){this.Ee=null
 z.ed()}return},
-vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},140,[]],
-xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,147,30,[],31,[]],
-nn:[function(){this.Qj()},"$0","gH1",0,0,21],
+vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},248,[]],
+xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,374,171,[],172,[]],
+nn:[function(){this.Qj()},"$0","gH1",0,0,126],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
@@ -5183,45 +5262,52 @@
 Id:{
 "^":"a;oh",
 gLj:function(){return this.oh},
-c1:function(a,b,c){var z=this.oh
-for(;z.gWY().gE2()==null;)z=z.geT(z)
-return z.gWY().gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
-Vn:function(a,b){var z=this.oh
-for(;z.gWY().gcP()==null;)z=z.geT(z)
-return z.gWY().gcP().$4(z,new P.Id(z.geT(z)),a,b)},
-qG:function(a,b,c){var z=this.oh
-for(;z.gWY().gJl()==null;)z=z.geT(z)
-return z.gWY().gJl().$5(z,new P.Id(z.geT(z)),a,b,c)},
-nA:function(a,b,c,d){var z=this.oh
-for(;z.gWY().gpU()==null;)z=z.geT(z)
-return z.gWY().gpU().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
-TE:function(a,b){var z=this.oh
-for(;z.gWY().gFh()==null;)z=z.geT(z)
-return z.gWY().gFh().$4(z,new P.Id(z.geT(z)),a,b)},
-V6:function(a,b){var z=this.oh
-for(;z.gWY().gXp()==null;)z=z.geT(z)
-return z.gWY().gXp().$4(z,new P.Id(z.geT(z)),a,b)},
-mz:function(a,b){var z=this.oh
-for(;z.gWY().gfb()==null;)z=z.geT(z)
-return z.gWY().gfb().$4(z,new P.Id(z.geT(z)),a,b)},
-RK:function(a,b){var z,y
+c1:function(a,b,c){var z,y
 z=this.oh
-for(;z.gWY().grb()==null;)z=z.geT(z)
-y=z.geT(z)
-z.gWY().grb().$4(z,new P.Id(y),a,b)},
-dJ:function(a,b,c){var z=this.oh
-for(;z.gWY().gZq()==null;)z=z.geT(z)
-return z.gWY().gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
+for(;y=z.gWY(),y.gE2()==null;)z=z.geT(z)
+return y.gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
+Vn:function(a,b){var z,y
+z=this.oh
+for(;y=z.gWY(),y.gcP()==null;)z=z.geT(z)
+return y.gcP().$4(z,new P.Id(z.geT(z)),a,b)},
+qG:function(a,b,c){var z,y
+z=this.oh
+for(;y=z.gWY(),y.gJl()==null;)z=z.geT(z)
+return y.gJl().$5(z,new P.Id(z.geT(z)),a,b,c)},
+nA:function(a,b,c,d){var z,y
+z=this.oh
+for(;y=z.gWY(),y.gpU()==null;)z=z.geT(z)
+return y.gpU().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
+TE:function(a,b){var z,y
+z=this.oh
+for(;y=z.gWY().gFh(),y==null;)z=z.geT(z)
+return y.$4(z,new P.Id(z.geT(z)),a,b)},
+V6:function(a,b){var z,y
+z=this.oh
+for(;y=z.gWY().gXp(),y==null;)z=z.geT(z)
+return y.$4(z,new P.Id(z.geT(z)),a,b)},
+mz:function(a,b){var z,y
+z=this.oh
+for(;y=z.gWY().gfb(),y==null;)z=z.geT(z)
+return y.$4(z,new P.Id(z.geT(z)),a,b)},
+RK:function(a,b){var z,y,x
+z=this.oh
+for(;y=z.gWY(),y.grb()==null;)z=z.geT(z)
+x=z.geT(z)
+y.grb().$4(z,new P.Id(x),a,b)},
+dJ:function(a,b,c){var z,y
+z=this.oh
+for(;y=z.gWY(),y.gZq()==null;)z=z.geT(z)
+return y.gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
 RB:function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gWY(),y.gJS(y)==null;)z=z.geT(z)
-y=z.gWY()
 y.gJS(y).$4(z,new P.Id(z.geT(z)),b,c)},
-ld:function(a,b,c){var z,y
+ld:function(a,b,c){var z,y,x
 z=this.oh
-for(;z.gWY().giq()==null;)z=z.geT(z)
-y=z.geT(z)
-return z.gWY().giq().$5(z,new P.Id(y),a,b,c)}},
+for(;y=z.gWY(),y.giq()==null;)z=z.geT(z)
+x=z.geT(z)
+return y.giq().$5(z,new P.Id(x),a,b,c)}},
 WH:{
 "^":"a;",
 fC:function(a){return this.gC5()===a.gC5()},
@@ -5254,28 +5340,28 @@
 if(b)return new P.dv(this,z)
 else return new P.ph(this,z)}},
 TF:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 K5:{
-"^":"Tp:22;c,d",
+"^":"Tp:115;c,d",
 $0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
-"^":"Tp:16;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,39,[],"call"],
+"^":"Tp:116;a,b",
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,184,[],"call"],
 $isEH:true},
 Hs:{
-"^":"Tp:16;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,39,[],"call"],
+"^":"Tp:116;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,184,[],"call"],
 $isEH:true},
 dv:{
-"^":"Tp:75;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,12,[],13,[],"call"],
+"^":"Tp:300;a,b",
+$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
 $isEH:true},
 ph:{
-"^":"Tp:75;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,12,[],13,[],"call"],
+"^":"Tp:300;c,d",
+$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
 $isEH:true},
 uo:{
 "^":"WH;eT>,WY<,R1",
@@ -5298,24 +5384,24 @@
 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)}},
 pK:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
 $isEH:true},
 eM:{
-"^":"Tp:22;c,d",
-$0:function(){var z,y
+"^":"Tp:115;c,d",
+$0:[function(){var z,y
 z=this.c
 P.JS("Uncaught Error: "+H.d(z))
 y=this.d
 if(y==null&&!!J.x(z).$isGe)y=z.gI4()
 if(y!=null)P.JS("Stack Trace: \n"+H.d(y)+"\n")
-throw H.b(z)},
+throw H.b(z)},"$0",null,0,0,null,"call"],
 $isEH:true},
-rF:{
-"^":"Tp:75;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
+Uez:{
+"^":"Tp:300;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
-nU:{
+AHi:{
 "^":"a;",
 gE2:function(){return P.xP()},
 hk:function(a,b){return this.gE2().$2(a,b)},
@@ -5363,12 +5449,12 @@
 "^":"",
 EF:function(a,b,c){return H.B7(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
 Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
-jB:function(){var z=Object.create(null)
+jB:[function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z},
-TQ:[function(a,b){return J.de(a,b)},"$2","Jo",4,0,51],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,52,53,[]],
+return z},"$0","A5",0,0,null],
+TQ:[function(a,b){return J.de(a,b)},"$2","Jo",4,0,198,118,[],199,[]],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,200,118,[]],
 Py:function(a,b,c,d,e){var z
 if(a==null){z=new P.k6(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -5376,15 +5462,15 @@
 return P.MP(a,b,c,d,e)},
 UD:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
 yv:function(a){return H.VM(new P.YO(0,null,null,null,null),[a])},
-FO:function(a){var z,y
+FO:[function(a){var z,y
 if($.xb().tg(0,a))return"(...)"
 $.xb().h(0,a)
 z=[]
 try{P.Vr(a,z)}finally{$.xb().Rz(0,a)}y=P.p9("(")
 y.We(z,", ")
 y.KF(")")
-return y.vM},
-Vr:function(a,b){var z,y,x,w,v,u,t,s,r,q
+return y.vM},"$1","Zw",2,0,null,127,[]],
+Vr:[function(a,b){var z,y,x,w,v,u,t,s,r,q
 z=a.gA(a)
 y=0
 x=0
@@ -5416,10 +5502,10 @@
 if(q==null){y+=5
 q="..."}}if(q!=null)b.push(q)
 b.push(u)
-b.push(v)},
+b.push(v)},"$2","zE",4,0,null,127,[],201,[]],
 L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
 Ls:function(a,b,c,d){return H.VM(new P.b6(0,null,null,null,null,null,0),[d])},
-vW:function(a){var z,y,x,w
+vW:[function(a){var z,y,x,w
 z={}
 for(x=0;w=$.tw(),x<w.length;++x)if(w[x]===a)return"{...}"
 y=P.p9("")
@@ -5429,7 +5515,7 @@
 J.kH(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},
+z.pop()}return y.gvM()},"$1","DH",2,0,null,202,[]],
 k6:{
 "^":"a;X5,vv,OX,OB,wV",
 gB:function(a){return this.X5},
@@ -5532,23 +5618,23 @@
 for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
 return-1},
 $isZ0:true,
-static:{vL:function(a,b){var z=a[b]
-return z===a?null:z},cW:function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},a0:function(){var z=Object.create(null)
+static:{vL:[function(a,b){var z=a[b]
+return z===a?null:z},"$2","ME",4,0,null,197,[],49,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"$3","rn",6,0,null,197,[],49,[],30,[]],a0:[function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
-return z}}},
+return z},"$0","l1",0,0,null]}},
 oi:{
-"^":"Tp:16;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,148,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,375,[],"call"],
 $isEH:true},
 ce:{
-"^":"Tp:16;a,b",
-$1:function(a){return J.de(this.a.t(0,a),this.b)},
+"^":"Tp:116;a,b",
+$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,375,[],"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
 PL:{
@@ -5581,9 +5667,9 @@
 static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"Tp:16;a",
-$1:function(a){var z=H.XY(a,this.a)
-return z},
+"^":"Tp:116;a",
+$1:[function(a){var z=H.XY(a,this.a)
+return z},"$1",null,2,0,null,122,[],"call"],
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -5726,21 +5812,21 @@
 bu:function(a){return P.vW(this)},
 $isFo:true,
 $isZ0:true,
-static:{Qs:function(){var z=Object.create(null)
+static:{Qs:[function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z}}},
+return z},"$0","Bs",0,0,null]}},
 a1:{
-"^":"Tp:16;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,148,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,375,[],"call"],
 $isEH:true},
 ou:{
-"^":"Tp:16;a,b",
-$1:function(a){return J.de(this.a.t(0,a),this.b)},
+"^":"Tp:116;a,b",
+$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,375,[],"call"],
 $isEH:true},
 S9:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
 db:{
@@ -6012,10 +6098,10 @@
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{T2:function(){var z=Object.create(null)
+static:{T2:[function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z}}},
+return z},"$0","um",0,0,null]}},
 ef:{
 "^":"a;Gc<,DG@,zQ@"},
 zQ:{
@@ -6050,9 +6136,9 @@
 $asQV:null},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")}],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")},128,[]],
 ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-Ft:[function(a,b){return H.VM(new H.kV(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")}],
+Ft:[function(a,b){return H.VM(new H.kV(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},128,[]],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.de(z.gl(),b))return!0
 return!1},
@@ -6102,8 +6188,8 @@
 $asQV:null},
 ar:{
 "^":"a+lD;",
-$iszM:true,
-$aszM:null,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -6142,8 +6228,8 @@
 z.We(a,b)
 return z.vM},
 ev:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")}],
-Ft:[function(a,b){return H.VM(new H.kV(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")}],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")},128,[]],
+Ft:[function(a,b){return H.VM(new H.kV(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},128,[]],
 eR:function(a,b){return H.q9(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
@@ -6211,7 +6297,7 @@
 if(J.de(y,0))return
 if(e<0)throw H.b(P.u(e))
 z=J.x(d)
-if(!!z.$iszM){x=e
+if(!!z.$isList){x=e
 w=d}else{w=z.eR(d,e).tt(0,!1)
 x=0}if(typeof y!=="number")return H.s(y)
 z=J.U6(w)
@@ -6260,7 +6346,7 @@
 this.Mh(a,b,c)},
 Mh:function(a,b,c){var z,y
 z=J.x(c)
-if(!!z.$iszM){z=z.gB(c)
+if(!!z.$isList){z=z.gB(c)
 if(typeof z!=="number")return H.s(z)
 this.zB(a,b,b+z,c)}else for(z=z.gA(c);z.G();b=y){y=b+1
 this.u(a,b,z.gl())}},
@@ -6271,49 +6357,20 @@
 z.KF("[")
 z.We(a,", ")
 z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},
-$iszM:true,
-$aszM:null,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
-KPM:{
-"^":"a;",
-u:function(a,b,c){throw H.b(P.f("Cannot modify unmodifiable map"))},
-FV:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
-V1:function(a){throw H.b(P.f("Cannot modify unmodifiable map"))},
-Rz:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
-$isZ0:true},
-Bk:{
-"^":"a;",
-t:function(a,b){return this.Fb.t(0,b)},
-u:function(a,b,c){this.Fb.u(0,b,c)},
-FV:function(a,b){this.Fb.FV(0,b)},
-V1:function(a){this.Fb.V1(0)},
-x4:function(a){return this.Fb.x4(a)},
-di:function(a){return this.Fb.di(a)},
-aN:function(a,b){this.Fb.aN(0,b)},
-gl0:function(a){return this.Fb.X5===0},
-gor:function(a){return this.Fb.X5!==0},
-gB:function(a){return this.Fb.X5},
-gvc:function(){var z=this.Fb
-return H.VM(new P.i5(z),[H.Kp(z,0)])},
-Rz:function(a,b){return this.Fb.Rz(0,b)},
-bu:function(a){return P.vW(this.Fb)},
-gUQ:function(a){var z=this.Fb
-return z.gUQ(z)},
-$isZ0:true},
-Oh:{
-"^":"Bk+KPM;Fb",
-$isZ0:true},
 LG:{
-"^":"Tp:75;a,b",
-$2:function(a,b){var z=this.a
+"^":"Tp:300;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)},
+z.KF(b)},"$2",null,4,0,null,376,[],122,[],"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -6356,7 +6413,7 @@
 h:function(a,b){this.NZ(0,b)},
 FV:function(a,b){var z,y,x,w,v,u,t,s,r
 z=J.x(b)
-if(!!z.$iszM){y=z.gB(b)
+if(!!z.$isList){y=z.gB(b)
 x=this.gB(this)
 if(typeof y!=="number")return H.s(y)
 z=x+y
@@ -6466,11 +6523,11 @@
 $asQV:null,
 static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
 z.Eo(a,b)
-return z},ua:function(a){var z
+return z},ua:[function(a){var z
 if(typeof a!=="number")return a.O()
 a=(a<<2>>>0)-1
 for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}}}},
+if(z===0)return a}},"$1","bD",2,0,null,203,[]]}},
 o0:{
 "^":"a;Lz,pP,qT,Dc,fD",
 gl:function(){return this.fD},
@@ -6598,23 +6655,23 @@
 y=new P.An(c)
 return H.VM(new P.Nb(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Tp:16;a",
-$1:function(a){var z=H.XY(a,this.a)
-return z},
+"^":"Tp:116;a",
+$1:[function(a){var z=H.XY(a,this.a)
+return z},"$1",null,2,0,null,122,[],"call"],
 $isEH:true},
 bF:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Nb")}},
 BW:{
-"^":"Tp:149;a,b,c",
-$1:function(a){var z,y,x,w
+"^":"Tp:377;a,b,c",
+$1:[function(a){var z,y,x,w
 for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
 if(z!==y.bb)throw H.b(P.a4(y))
 w=a.T8
 if(w!=null&&this.$1(w)===!0)return!0
-a=a.Bb}return!1},
+a=a.Bb}return!1},"$1",null,2,0,null,273,[],"call"],
 $isEH:true},
 S6B:{
 "^":"a;",
@@ -6675,23 +6732,23 @@
 Wb:function(a){return a},
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
-VQ:function(a,b){var z=b==null?new P.JC():b
-return z.$2(null,new P.f1(z).$1(a))},
-BS:function(a,b){var z,y,x,w
+VQ:[function(a,b){var z=b==null?new P.JC():b
+return z.$2(null,new P.f1(z).$1(a))},"$2","os",4,0,null,204,[],205,[]],
+BS:[function(a,b){var z,y,x,w
 x=a
 if(typeof x!=="string")throw H.b(P.u(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},
-tp:[function(a){return a.Lt()},"$1","BC",2,0,54,55,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"$2","H4",4,0,null,33,[],205,[]],
+tp:[function(a){return a.Lt()},"$1","BC",2,0,206,6,[]],
 JC:{
-"^":"Tp:75;",
-$2:function(a,b){return b},
+"^":"Tp:300;",
+$2:[function(a,b){return b},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 f1:{
-"^":"Tp:16;a",
-$1:function(a){var z,y,x,w,v,u,t
+"^":"Tp:116;a",
+$1:[function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){z=a
 for(y=this.a,x=0;x<z.length;++x)z[x]=y.$2(x,this.$1(z[x]))
@@ -6700,7 +6757,7 @@
 for(y=this.a,x=0;x<w.length;++x){u=w[x]
 v.u(0,u,y.$2(u,this.$1(a[u])))}t=a.__proto__
 if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.$2("__proto__",this.$1(t)))
-return v},
+return v},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Uk:{
 "^":"a;"},
@@ -6708,7 +6765,7 @@
 "^":"a;"},
 Zi:{
 "^":"Uk;",
-$asUk:function(){return[P.qU,[P.zM,P.KN]]}},
+$asUk:function(){return[J.O,[J.Q,J.bU]]}},
 Ud:{
 "^":"Ge;Ct,FN",
 bu:function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
@@ -6727,13 +6784,13 @@
 KP:function(a){return this.Co(a,null)},
 gZE:function(){return C.cb},
 gHe:function(){return C.A3},
-$asUk:function(){return[P.a,P.qU]}},
+$asUk:function(){return[P.a,J.O]}},
 ze:{
 "^":"zF;UM,Xi",
-$aszF:function(){return[P.a,P.qU]}},
+$aszF:function(){return[P.a,J.O]}},
 Cf:{
 "^":"zF;N5<",
-$aszF:function(){return[P.qU,P.a]}},
+$aszF:function(){return[J.O,P.a]}},
 Sh:{
 "^":"a;iY,Vy,bV",
 Wt:function(a){return this.iY.$1(a)},
@@ -6808,7 +6865,7 @@
 this.aK(a)
 z.KF("\"")
 return!0}else{z=J.x(a)
-if(!!z.$iszM){this.WD(a)
+if(!!z.$isList){this.WD(a)
 y=this.Vy
 y.KF("[")
 if(J.z8(z.gB(a),0)){this.rl(z.t(a,0))
@@ -6832,26 +6889,26 @@
 Ei:function(a){var z=this.bV
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"P3,hyY,FC,zf,fc,fg,Do,bz,eJ,MU,ql,XI,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Ks:function(a,b,c){var z
+static:{"^":"P3,hyY,FC,zf,fc,fg,Do,bz,eJ,Ho,ql,XI,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Ks:[function(a,b,c){var z
 b=P.BC()
 z=P.p9("")
 P.uI(z,b,c).rl(a)
-return z.vM}}},
+return z.vM},"$3","nB",6,0,null,6,[],207,[],208,[]]}},
 z0:{
 "^":"Zi;lH",
 goc:function(a){return"utf-8"},
-gZE:function(){return new P.E3()}},
-E3:{
+gZE:function(){return new P.om()}},
+om:{
 "^":"zF;",
 WJ:function(a){var z,y,x
 z=J.U6(a)
 y=J.vX(z.gB(a),3)
 if(typeof y!=="number")return H.s(y)
-y=H.VM(Array(y),[P.KN])
+y=H.VM(Array(y),[J.bU])
 x=new P.Rw(0,0,y)
 if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
 return C.Nm.D6(y,0,x.ZP)},
-$aszF:function(){return[P.qU,[P.zM,P.KN]]}},
+$aszF:function(){return[J.O,[J.Q,J.bU]]}},
 Rw:{
 "^":"a;WF,ZP,EN",
 Lb:function(a,b){var z,y,x,w,v
@@ -6922,9 +6979,9 @@
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
 "^":"",
-Te:function(a){return},
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,56,53,[],57,[]],
-hl:function(a){var z,y,x,w,v
+Te:[function(a){return},"$1","Ex",2,0,null,51,[]],
+Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,209,118,[],199,[]],
+hl:[function(a){var z,y,x,w,v
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
 z.vM="\""
@@ -6941,11 +6998,11 @@
 else{w=H.Lw(v)
 w=z.vM+=w}}y=w+"\""
 z.vM=y
-return y}return"Instance of '"+H.lh(a)+"'"},
+return y}return"Instance of '"+H.lh(a)+"'"},"$1","Zx",2,0,null,6,[]],
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,58],
-NS:[function(a){return H.CU(a)},"$1","cE",2,0,59],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,60,29,29],
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,212,118,[],199,[]],
+NS:[function(a){return H.CU(a)},"$1","cE",2,0,213,6,[]],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,214,85,85,33,[],34,[],175,[]],
 O8:function(a,b,c){var z,y,x
 z=J.Qi(a,c)
 if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -6956,22 +7013,22 @@
 if(b)return z
 z.fixed$length=init
 return z},
-JS:function(a){var z,y
+JS:[function(a){var z,y
 z=H.d(a)
 y=$.oK
 if(y==null)H.qw(z)
-else y.$1(z)},
+else y.$1(z)},"$1","Pl",2,0,null,6,[]],
 HB:{
-"^":"Tp:75;a",
-$2:function(a,b){this.a.u(0,a.gfN(a),b)},
+"^":"Tp:300;a",
+$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"$2",null,4,0,null,146,[],30,[],"call"],
 $isEH:true},
 CL:{
-"^":"Tp:134;a",
-$2:function(a,b){var z=this.a
+"^":"Tp:359;a",
+$2:[function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
 z.a.KF(": ")
-z.a.KF(P.hl(b));++z.b},
+z.a.KF(P.hl(b));++z.b},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 p4:{
 "^":"a;OF",
@@ -6979,8 +7036,7 @@
 a2:{
 "^":"a;",
 bu:function(a){return this?"true":"false"},
-$isa2:true},
-"+bool":0,
+$isbool:true},
 Tx:{
 "^":"a;"},
 iP:{
@@ -7005,8 +7061,8 @@
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gi,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl: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)
+static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gio,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z=new H.VR(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)
 if(z!=null){y=new P.MF()
 x=z.QK
 if(1>=x.length)return H.e(x,1)
@@ -7039,32 +7095,28 @@
 if(typeof l!=="number")return H.s(l)
 s=J.xH(s,n*l)}k=!0}else k=!1
 j=H.zW(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},Wu:function(a,b){var z=new P.iP(a,b)
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"$1","le",2,0,null,210,[]],Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
-return z},Gq:function(a){var z,y
+return z},Gq:[function(a){var z,y
 z=Math.abs(a)
 y=a<0?"-":""
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},Vx:function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},"$1","Cp",2,0,null,211,[]],Vx:[function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
-return"00"+a},h0:function(a){if(a>=10)return""+a
-return"0"+a}}},
+return"00"+a},"$1","Dv",2,0,null,211,[]],h0:[function(a){if(a>=10)return""+a
+return"0"+a},"$1","wI",2,0,null,211,[]]}},
 MF:{
-"^":"Tp:150;",
-$1:function(a){if(a==null)return 0
-return H.BU(a,null,null)},
+"^":"Tp:379;",
+$1:[function(a){if(a==null)return 0
+return H.BU(a,null,null)},"$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 Rq:{
-"^":"Tp:151;",
-$1:function(a){if(a==null)return 0
-return H.IH(a,null)},
+"^":"Tp:380;",
+$1:[function(a){if(a==null)return 0
+return H.IH(a,null)},"$1",null,2,0,null,378,[],"call"],
 $isEH:true},
-CP:{
-"^":"lf;",
-$isCP:true},
-"+double":0,
 a6:{
 "^":"a;Fq<",
 g:function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},
@@ -7093,20 +7145,20 @@
 v=new P.P7().$1(C.CD.JV(y,1000000))
 return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
 $isa6:true,
-static:{"^":"SF,S4d,pk,LoB,zj5,b2,jS,ll,DoM,f4,vd,IJ,iI,Wr,fm,yn",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"Bk,S4d,pk,LoB,zj5,b2H,jS,ll,DoM,f4,vd,IJZ,iI,Wr,fm,rGr",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Tp:18;",
-$1:function(a){if(a>=100000)return H.d(a)
+"^":"Tp:121;",
+$1:[function(a){if(a>=100000)return H.d(a)
 if(a>=10000)return"0"+H.d(a)
 if(a>=1000)return"00"+H.d(a)
 if(a>=100)return"000"+H.d(a)
 if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},
+return"00000"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 DW:{
-"^":"Tp:18;",
-$1:function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},
+"^":"Tp:121;",
+$1:[function(a){if(a>=10)return H.d(a)
+return"0"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 Ge:{
 "^":"a;",
@@ -7209,51 +7261,31 @@
 EH:{
 "^":"a;",
 $isEH:true},
-KN:{
-"^":"lf;",
-$isKN:true},
-"+int":0,
 QV:{
 "^":"a;",
 $isQV:true,
 $asQV:null},
 AC:{
 "^":"a;"},
-zM:{
-"^":"a;",
-$iszM:true,
-$aszM:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-"+List":0,
 Z0:{
 "^":"a;",
 $isZ0:true},
 L9:{
 "^":"a;",
 bu:function(a){return"null"}},
-"+Null":0,
-lf:{
-"^":"a;",
-$islf:true},
-"+num":0,
 a:{
 "^":";",
 n:function(a,b){return this===b},
 giO:function(a){return H.eQ(this)},
 bu:function(a){return H.a5(this)},
 T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
+gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
 "^":"a;",
 $isOd:true},
 MN:{
 "^":"a;"},
-qU:{
-"^":"a;",
-$isqU:true},
-"+String":0,
 WU:{
 "^":"a;Qk,SU,Oq,Wn",
 gl:function(){return this.Wn},
@@ -7261,11 +7293,14 @@
 z=this.Oq
 this.SU=z
 y=this.Qk
-x=y.length
-if(z===x){this.Wn=null
-return!1}w=C.xB.j(y,z)
+x=J.U6(y)
+if(z===x.gB(y)){this.Wn=null
+return!1}w=x.j(y,this.SU)
 v=this.SU+1
-if((w&64512)===55296&&v<x){u=C.xB.j(y,v)
+if((w&64512)===55296){z=x.gB(y)
+if(typeof z!=="number")return H.s(z)
+z=v<z}else z=!1
+if(z){u=x.j(y,v)
 if((u&64512)===56320){this.Oq=v+1
 this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
 return!0}}this.Oq=v
@@ -7318,7 +7353,7 @@
 if(z&&!0)return""
 z=!z
 if(z);y=z?P.Xc(a):C.jN.ez(b,new P.Kd()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
+if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
 return y},
 Ky:function(a,b){if(a==="")return"/"+H.d(b)
 return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
@@ -7353,20 +7388,13 @@
 z.KF(y)}y=this.Ka
 if(""!==y){z.KF("#")
 z.KF(y)}return z.vM},
-n:function(a,b){var z,y,x
+n:function(a,b){var z,y
 if(b==null)return!1
 z=J.x(b)
 if(!z.$isiD)return!1
-y=this.Fi
-x=b.Fi
-if(y==null?x==null:y===x)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
+if(this.Fi===b.Fi)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
 y=b.r0
-if(z==null?y==null:z===y){z=this.tP
-y=b.tP
-if(z==null?y==null:z===y){z=this.Ka
-y=b.Ka
-y=z==null?y==null:z===y
-z=y}else z=!1}else z=!1}else z=!1
+z=(z==null?y==null:z===y)&&this.tP===b.tP&&this.Ka===b.Ka}else z=!1
 else z=!1
 else z=!1
 else z=!1
@@ -7378,7 +7406,7 @@
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"n2,q7,tv,ux,vI,IE,fd,IL,yT,zk,yt,fC,O5,FsP,qf,ML,j3,r5,Yk,qs,Fm,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,za,fbQ",hK:function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+static:{"^":"n2,q7,tv,v5,vI,SF,fd,IL,hO,zk,yt,fC,O5,lf,qf,ML,j3,r5,Yk,qs,lL,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,za,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
 x=new P.hP()
 w=new P.Uo(a1)
 v=J.U6(a1)
@@ -7435,17 +7463,17 @@
 a=x.C(k,i)?v.Nj(a1,x.g(k,1),i):""
 x=J.Wx(i)
 a0=x.C(i,u)?v.Nj(a1,x.g(i,1),u):""
-return P.R6(a0,c,b,null,z,a,null,g,e)},R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
+return P.R6(a0,c,b,null,z,a,null,g,e)},"$1","rp",2,0,null,215,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
 z=new P.iD(P.L7(b),null,null,z,i,P.LE(f,g),P.UJ(a),null,null)
 z.n3(a,b,c,d,e,f,g,h,i)
-return z},L7:function(a){var z,y
+return z},L7:[function(a){var z,y
 if(a.length===0)return a
 if(C.xB.j(a,0)===91){z=a.length-1
 if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
 P.eg(C.xB.Nj(a,1,z))
 return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
 if(a.charCodeAt(y)===58){P.eg(a)
-return"["+a+"]"}}return a},iy:function(a){var z,y,x,w,v,u
+return"["+a+"]"}}return a},"$1","jC",2,0,null,216,[]],iy:[function(a){var z,y,x,w,v,u
 z=new P.hb()
 if(a==null)return""
 y=a.length
@@ -7459,7 +7487,7 @@
 if(u>=8)return H.e(C.mK,u)
 u=(C.mK[u]&C.jn.W4(1,v&15))!==0}else u=!1
 if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},LE:function(a,b){var z,y,x
+x=!1}}return x?a:a.toLowerCase()},"$1","Um",2,0,null,217,[]],LE:[function(a,b){var z,y,x
 z={}
 y=a==null
 if(y&&!0)return""
@@ -7468,8 +7496,7 @@
 x=P.p9("")
 z.a=!0
 C.jN.aN(b,new P.yZ(z,x))
-return x.vM},UJ: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
+return x.vM},"$2","wF",4,0,null,218,[],219,[]],UJ:[function(a){return P.Xc(a)},"$1","p7",2,0,null,220,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z={}
 y=J.U6(a).u8(a,"%")
 z.a=y
@@ -7508,11 +7535,11 @@
 r=m}else{z.a=t
 r=t}}if(z.b==null)return a
 if(z.c!==r)s.$0()
-return J.AG(z.b)},q5:function(a){var z,y
+return J.AG(z.b)},"$1","Sy",2,0,null,221,[]],q5:[function(a){var z,y
 z=new P.Mx()
 y=a.split(".")
 if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},eg:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"$1","cf",2,0,null,216,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=new P.kZ()
 y=new P.JT(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
@@ -7540,18 +7567,18 @@
 if(q&&!p)z.$1("expected a part after last `:`")
 if(!q)try{J.wT(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
 try{v=P.q5(J.ZZ(a,w))
-s=J.c1(J.UQ(v,0),8)
+s=J.Eh(J.UQ(v,0),8)
 r=J.UQ(v,1)
 if(typeof r!=="number")return H.s(r)
 J.wT(x,(s|r)>>>0)
-r=J.c1(J.UQ(v,2),8)
+r=J.Eh(J.UQ(v,2),8)
 s=J.UQ(v,3)
 if(typeof s!=="number")return H.s(s)
 J.wT(x,(r|s)>>>0)}catch(o){H.Ru(o)
 z.$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
 s=new H.kV(x,new P.d9(x))
 s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},jW:function(a,b,c,d){var z,y,x,w,v,u,t
+return P.F(s,!0,H.ip(s,"mW",0))},"$1","q3",2,0,null,216,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -7564,173 +7591,173 @@
 y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
 y.vM+=u}else{u=H.Lw(37)
 y.vM+=u
-z.$2(v,y)}}return y.vM}}},
+z.$2(v,y)}}return y.vM},"$4$encoding$spaceToPlus","jd",4,5,null,222,223,224,[],225,[],226,[],227,[]]}},
 hP:{
-"^":"Tp:152;",
-$1:function(a){var z
+"^":"Tp:382;",
+$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.aa,z)
 z=(C.aa[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},
+return z},"$1",null,2,0,null,381,[],"call"],
 $isEH:true},
 Uo:{
-"^":"Tp:153;a",
-$1:function(a){a=J.aK(this.a,"]",a)
+"^":"Tp:383;a",
+$1:[function(a){a=J.aK(this.a,"]",a)
 if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},
+return a+1},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 hb:{
-"^":"Tp:152;",
-$1:function(a){var z
+"^":"Tp:382;",
+$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.HE,z)
 z=(C.HE[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},
+return z},"$1",null,2,0,null,381,[],"call"],
 $isEH:true},
 Kd:{
-"^":"Tp:16;",
-$1:function(a){return P.jW(C.Wd,a,C.xM,!1)},
+"^":"Tp:116;",
+$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 yZ:{
-"^":"Tp:75;a,b",
-$2:function(a,b){var z=this.a
+"^":"Tp:300;a,b",
+$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
 z=this.b
 z.KF(P.jW(C.kg,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.jW(C.kg,b,C.xM,!0))},
+z.KF(P.jW(C.kg,b,C.xM,!0))},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 Gs:{
-"^":"Tp:152;",
-$1:function(a){var z
+"^":"Tp:382;",
+$1:[function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
-return z},
+return z},"$1",null,2,0,null,384,[],"call"],
 $isEH:true},
 pm:{
-"^":"Tp:152;",
-$1:function(a){return 97<=a&&a<=102},
+"^":"Tp:382;",
+$1:[function(a){return 97<=a&&a<=102},"$1",null,2,0,null,384,[],"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:152;",
-$1:function(a){var z
+"^":"Tp:382;",
+$1:[function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.kg,z)
 z=(C.kg[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},
+return z},"$1",null,2,0,null,381,[],"call"],
 $isEH:true},
 wm:{
-"^":"Tp:153;b,c,d",
-$1:function(a){var z,y
+"^":"Tp:383;b,c,d",
+$1:[function(a){var z,y
 z=this.b
-y=J.lE(z,a)
+y=C.xB.j(z,a)
 if(this.d.$1(y)===!0)return y-32
 else if(this.c.$1(y)!==!0)throw H.b(P.u("Invalid URI component: "+z))
-else return y},
+else return y},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 FB:{
-"^":"Tp:153;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
-else{v|=32
-if(97<=v&&v<=102)x=x*16+v-97+10
-else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return x},
+"^":"Tp:383;e",
+$1:[function(a){var z,y,x,w
+for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
+if(48<=w&&w<=57)y=y*16+w-48
+else{w|=32
+if(97<=w&&w<=102)y=y*16+w-97+10
+else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return y},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 Lk:{
-"^":"Tp:21;a,f",
-$0:function(){var z,y,x,w,v
+"^":"Tp:126;a,f",
+$0:[function(){var z,y,x,w,v
 z=this.a
 y=z.b
 x=z.c
 w=this.f
 v=z.a
-if(y==null)z.b=P.p9(J.Nj(w,x,v))
-else y.KF(J.Nj(w,x,v))},
+if(y==null)z.b=P.p9(C.xB.Nj(w,x,v))
+else y.KF(C.xB.Nj(w,x,v))},"$0",null,0,0,null,"call"],
 $isEH:true},
 XZ:{
-"^":"Tp:154;",
-$2:function(a,b){var z=J.v1(a)
+"^":"Tp:386;",
+$2:[function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},
+return b*31+z&1073741823},"$2",null,4,0,null,385,[],254,[],"call"],
 $isEH:true},
 Mx:{
-"^":"Tp:49;",
-$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
+"^":"Tp:193;",
+$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 C9:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z,y
 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,155,[],"call"],
+return z},"$1",null,2,0,null,387,[],"call"],
 $isEH:true},
 kZ:{
-"^":"Tp:49;",
-$1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
+"^":"Tp:193;",
+$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 JT:{
-"^":"Tp:156;a,b",
-$2:function(a,b){var z,y
+"^":"Tp:388;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)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
-return z},
+return z},"$2",null,4,0,null,134,[],135,[],"call"],
 $isEH:true},
 d9:{
-"^":"Tp:16;c",
-$1:function(a){var z=J.x(a)
+"^":"Tp:116;c",
+$1:[function(a){var z=J.x(a)
 if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},
+else return[z.m(a,8)&255,z.i(a,255)]},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rI:{
-"^":"Tp:75;",
-$2:function(a,b){var z=J.Wx(a)
+"^":"Tp:300;",
+$2:[function(a,b){var z=J.Wx(a)
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
+b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"$2",null,4,0,null,389,[],390,[],"call"],
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
 else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"$1","pq",2,0,61,7,[]],
-r3:function(a,b){return document.createElement(a)},
-Kn:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
-lt:function(a,b,c,d,e,f,g,h){var z,y,x
+return"transitionend"},"$1","pq",2,0,228,21,[]],
+r3:[function(a,b){return document.createElement(a)},"$2","Oe",4,0,null,102,[],229,[]],
+It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"$3$onProgress$withCredentials","xF",2,5,null,85,85,230,[],231,[],232,[]],
+lt:[function(a,b,c,d,e,f,g,h){var z,y,x
 z=W.zU
 y=H.VM(new P.Zf(P.Dt(z)),[z])
 x=new XMLHttpRequest()
 C.W3.eo(x,"GET",a,!0)
 z=C.fK.aM(x)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
+H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new W.iO(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
 z=C.MD.aM(x)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
-return y.MM},
+return y.MM},"$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,85,85,85,85,85,85,85,230,[],233,[],231,[],234,[],235,[],236,[],237,[],232,[]],
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
-C0:function(a,b){a=536870911&a+b
+C0:[function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},
-Pv:function(a){if(a==null)return
-return W.P1(a)},
-qc:function(a){var z
+return a^a>>>6},"$2","jx",4,0,null,238,[],30,[]],
+Pv:[function(a){if(a==null)return
+return W.P1(a)},"$1","Ie",2,0,null,239,[]],
+qc:[function(a){var z
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
 if(!!J.x(z).$isD0)return z
-return}else return a},
-qr:function(a){return a},
-Pd:function(a){if(!!J.x(a).$isYN)return a
-return P.o7(a,!0)},
-YT:function(a,b){return new W.vZ(a,b)},
-GO:[function(a){return J.TD(a)},"$1","V5",2,0,16,62,[]],
-Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,16,62,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","A6",8,0,63,62,[],64,[],65,[],66,[]],
-wi:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
+return}else return a},"$1","Wq",2,0,null,21,[]],
+qr:[function(a){return a},"$1","Ku",2,0,null,21,[]],
+Pd:[function(a){if(!!J.x(a).$isYN)return a
+return P.o7(a,!0)},"$1","ra",2,0,null,99,[]],
+YT:[function(a,b){return new W.vZ(a,b)},"$2","AD",4,0,null,240,[],7,[]],
+GO:[function(a){return J.TD(a)},"$1","V5",2,0,116,48,[]],
+Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,116,48,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","A6",8,0,241,48,[],12,[],242,[],243,[]],
+wi:[function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
 z=J.Xr(d)
 if(z==null)throw H.b(P.u(d))
 y=z.prototype
@@ -7752,19 +7779,19 @@
 Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
 q={prototype:s}
 if(!v)q.extends=e
-b.registerElement(c,q)},
-aF:function(a){if(J.de($.X3,C.NU))return a
+b.registerElement(c,q)},"$5","uz",10,0,null,97,[],244,[],102,[],11,[],245,[]],
+aF:[function(a){if(J.de($.X3,C.NU))return a
 if(a==null)return
-return $.X3.oj(a,!0)},
-K2:function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},
+return $.X3.oj(a,!0)},"$1","Rj",2,0,null,164,[]],
+K2:[function(a){if(J.de($.X3,C.NU))return a
+return $.X3.PT(a,!0)},"$1","o6",2,0,null,164,[]],
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|LP|lw|D13|Ir|WZq|bf|Nr|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|qkb|V13|vj|LU|V14|KL|V15|F1|V16|aQ|V17|Qa|V18|Ww|V19|tz|V20|Mv|V21|Zt|V22|iL|V23|F1i|XP|V24|NQ|V25|ov|x4|kn|V26|fI|V27|zMr|V28|nk|V29|ob|Bc|Uj|V30|xT|V31|uwf|I5|V32|SC"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|LP|hV|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|Nr|lw|D13|Ir|WZq|rm|Bc|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|IWF|V13|Yj|V14|Oz|V15|YA|V16|qkb|V17|vj|LU|V18|KL|V19|F1|V20|aQ|V21|Qa|V22|Ww|V23|tz|V24|Mv|V25|oM|V26|iL|V27|F1i|XP|V28|NQ|V29|SM|x4|knI|V30|fI|V31|zMr|V32|nk|V33|ob|LPc|Uj|V34|xT|V35|uwf|I5|V36|en"},
 zw:{
 "^":"Gv;",
-$iszM:true,
-$aszM:function(){return[W.nX]},
+$isList:true,
+$asWO:function(){return[W.nX]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.nX]},
@@ -7831,7 +7858,7 @@
 Kb:function(a,b){return a.getElementById(b)},
 ek:function(a,b,c){return a.importNode(b,c)},
 gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.T1.aM(a)},
+gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
 gVY:function(a){return C.DK.aM(a)},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
@@ -7839,7 +7866,7 @@
 pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 $isYN:true,
 "%":"Document|HTMLDocument|XMLDocument"},
-hN:{
+Aj:{
 "^":"KV;",
 gwd:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.e7(a)),[null])
 return a._docChildren},
@@ -7904,7 +7931,7 @@
 PN:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
 gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.T1.f0(a)},
+gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
 gVY:function(a){return C.DK.f0(a)},
 gE8:function(a){return C.W2.f0(a)},
@@ -7957,8 +7984,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]},
@@ -8021,7 +8048,8 @@
 El:{
 "^":"qE;kc:error=,LA:src=",
 xW:function(a){return a.load()},
-"%":"HTMLAudioElement;HTMLMediaElement"},
+"%":"HTMLAudioElement;HTMLMediaElement",
+static:{"^":"pZ<"}},
 zm:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
@@ -8059,7 +8087,7 @@
 tH:{
 "^":"D0;jO:id=,oc:name=,t5:type=,Ye:version=",
 "%":"MIDIInput;MIDIPort"},
-Aj:{
+Wp:{
 "^":"Mf;",
 nH:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
 return},
@@ -8070,7 +8098,7 @@
 z=W.qc(a.target)
 y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.Yq(J.AK(z)))
 return H.VM(new P.hL(J.XH(y.x),J.XH(y.y)),[null])}},
-$isAj:true,
+$isWp:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 H9:{
 "^":"Gv;",
@@ -8128,8 +8156,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]},
@@ -8179,7 +8207,7 @@
 $islp:true,
 "%":"HTMLSelectElement"},
 I0:{
-"^":"hN;",
+"^":"Aj;",
 Kb:function(a,b){return a.getElementById(b)},
 $isI0:true,
 "%":"ShadowRoot"},
@@ -8269,7 +8297,7 @@
 X6:function(a,b,c){return this.xc(a,b,c,null)},
 bu:function(a){return a.toString()},
 gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.T1.aM(a)},
+gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
 gVY:function(a){return C.DK.aM(a)},
 $isu9:true,
@@ -8308,7 +8336,7 @@
 $istn:true,
 $astn:function(){return[null]},
 "%":"ClientRect|DOMRect"},
-Wp:{
+SC:{
 "^":"qE;",
 $isD0:true,
 "%":"HTMLFrameSetElement"},
@@ -8325,8 +8353,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]},
@@ -8345,8 +8373,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$iszM:true,
-$aszM:function(){return[W.yg]},
+$isList:true,
+$asWO:function(){return[W.yg]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.yg]},
@@ -8365,8 +8393,8 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$iszM:true,
-$aszM:function(){return[W.uj]},
+$isList:true,
+$asWO:function(){return[W.uj]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.uj]},
@@ -8409,7 +8437,7 @@
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 $asar:function(){return[W.cv]},
-$aszM:function(){return[W.cv]},
+$asWO:function(){return[W.cv]},
 $asQV:function(){return[W.cv]}},
 wz:{
 "^":"ar;Sn,Sc",
@@ -8425,13 +8453,13 @@
 gDD:function(a){return W.or(this.Sc)},
 sDD:function(a,b){H.bQ(this.Sc,new W.BH(b))},
 gi9:function(a){return C.mt.Uh(this)},
-gVl:function(a){return C.T1.Uh(this)},
+gVl:function(a){return C.pi.Uh(this)},
 gLm:function(a){return C.i3.Uh(this)},
 gVY:function(a){return C.DK.Uh(this)},
 nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.B1())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
-$iszM:true,
-$aszM:null,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -8439,14 +8467,14 @@
 z.nJ(a,b)
 return z}}},
 B1:{
-"^":"Tp:16;",
-$1:function(a){return!!J.x(a).$iscv},
+"^":"Tp:116;",
+$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 BH:{
-"^":"Tp:16;a",
-$1:function(a){var z=this.a
+"^":"Tp:116;a",
+$1:[function(a){var z=this.a
 J.H2(a,z)
-return z},
+return z},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 nX:{
 "^":"Gv;"},
@@ -8463,28 +8491,28 @@
 static:{"^":"fD"}},
 RAp:{
 "^":"Gv+lD;",
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Gb:{
 "^":"RAp+Gm;",
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Kx:{
-"^":"Tp:16;",
-$1:[function(a){return J.EC(a)},"$1",null,2,0,null,157,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){return J.EC(a)},"$1",null,2,0,null,391,[],"call"],
+$isEH:true},
+Cs:{
+"^":"Tp:300;a",
+$2:[function(a,b){this.a.setRequestHeader(a,b)},"$2",null,4,0,null,392,[],30,[],"call"],
 $isEH:true},
 iO:{
-"^":"Tp:75;a",
-$2:function(a,b){this.a.setRequestHeader(a,b)},
-$isEH:true},
-bU:{
-"^":"Tp:16;b,c",
+"^":"Tp:116;b,c",
 $1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -8493,11 +8521,11 @@
 x=this.b
 if(y){y=x.MM
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(z)}else x.pm(a)},"$1",null,2,0,null,7,[],"call"],
+y.OH(z)}else x.pm(a)},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Yg:{
-"^":"Tp:75;a",
-$2:function(a,b){if(b!=null)this.a[a]=b},
+"^":"Tp:300;a",
+$2:[function(a,b){if(b!=null)this.a[a]=b},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 e7:{
 "^":"ar;NL",
@@ -8544,61 +8572,61 @@
 return z[b]},
 $ise7:true,
 $asar:function(){return[W.KV]},
-$aszM:function(){return[W.KV]},
+$asWO:function(){return[W.KV]},
 $asQV:function(){return[W.KV]}},
 nNL:{
 "^":"Gv+lD;",
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 ma:{
 "^":"nNL+Gm;",
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 yoo:{
 "^":"Gv+lD;",
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 ecX:{
 "^":"yoo+Gm;",
-$iszM:true,
-$aszM:function(){return[W.KV]},
+$isList:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 zLC:{
 "^":"Gv+lD;",
-$iszM:true,
-$aszM:function(){return[W.yg]},
+$isList:true,
+$asWO:function(){return[W.yg]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.yg]}},
 w1p:{
 "^":"zLC+Gm;",
-$iszM:true,
-$aszM:function(){return[W.yg]},
+$isList:true,
+$asWO:function(){return[W.yg]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.yg]}},
 dxW:{
 "^":"Gv+lD;",
-$iszM:true,
-$aszM:function(){return[W.uj]},
+$isList:true,
+$asWO:function(){return[W.uj]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.uj]}},
 kEI:{
 "^":"dxW+Gm;",
-$iszM:true,
-$aszM:function(){return[W.uj]},
+$isList:true,
+$asWO:function(){return[W.uj]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.uj]}},
@@ -8614,23 +8642,23 @@
 b.$2(y,this.t(0,y))}},
 gvc:function(){var z,y,x,w
 z=this.MW.attributes
-y=H.VM([],[P.qU])
+y=H.VM([],[J.O])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
 if(this.FJ(z[w])){if(w>=z.length)return H.e(z,w)
 y.push(J.O6(z[w]))}}return y},
 gUQ:function(a){var z,y,x,w
 z=this.MW.attributes
-y=H.VM([],[P.qU])
+y=H.VM([],[J.O])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
 if(this.FJ(z[w])){if(w>=z.length)return H.e(z,w)
 y.push(J.Vm(z[w]))}}return y},
 gl0:function(a){return this.gB(this)===0},
 gor:function(a){return this.gB(this)!==0},
 $isZ0:true,
-$asZ0:function(){return[P.qU,P.qU]}},
+$asZ0:function(){return[J.O,J.O]}},
 Zc:{
-"^":"Tp:75;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,158,[],70,[],"call"],
+"^":"Tp:300;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,376,[],122,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
@@ -8646,7 +8674,7 @@
 FJ:function(a){return a.namespaceURI==null}},
 nF:{
 "^":"As;QX,Kd",
-lF:function(){var z=P.Ls(null,null,null,P.qU)
+lF:function(){var z=P.Ls(null,null,null,J.O)
 this.Kd.aN(0,new W.Si(z))
 return z},
 p5:function(a){var z,y
@@ -8662,38 +8690,38 @@
 z.yJ(a)
 return z}}},
 FK:{
-"^":"Tp:16;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,7,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Si:{
-"^":"Tp:16;a",
-$1:function(a){return this.a.FV(0,a.lF())},
+"^":"Tp:116;a",
+$1:[function(a){return this.a.FV(0,a.lF())},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 vf:{
-"^":"Tp:16;a",
-$1:function(a){return a.OS(this.a)},
+"^":"Tp:116;a",
+$1:[function(a){return a.OS(this.a)},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Iw:{
-"^":"Tp:16;a,b",
-$1:function(a){return a.O4(this.a,this.b)},
+"^":"Tp:116;a,b",
+$1:[function(a){return a.O4(this.a,this.b)},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Fc:{
-"^":"Tp:16;a",
-$1:function(a){return J.V1(a,this.a)},
+"^":"Tp:116;a",
+$1:[function(a){return J.V1(a,this.a)},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 hD:{
-"^":"Tp:75;a",
-$2:function(a,b){return this.a.$1(b)===!0||a===!0},
+"^":"Tp:300;a",
+$2:[function(a,b){return this.a.$1(b)===!0||a===!0},"$2",null,4,0,null,393,[],142,[],"call"],
 $isEH:true},
 I4:{
 "^":"As;MW",
 lF:function(){var z,y,x
-z=P.Ls(null,null,null,P.qU)
+z=P.Ls(null,null,null,J.O)
 for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
 if(x.length!==0)z.h(0,x)}return z},
 p5:function(a){P.F(a,!0,null)
 J.Pw(this.MW,a.zV(0," "))}},
-e0:{
+UC:{
 "^":"a;Ph",
 zc:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
 aM:function(a){return this.zc(a,!1)},
@@ -8715,13 +8743,13 @@
 return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},
 $isqh:true},
 ie:{
-"^":"Tp:16;a",
-$1:function(a){return J.eI(J.l2(a),this.a)},
+"^":"Tp:116;a",
+$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 Ea:{
-"^":"Tp:16;b",
+"^":"Tp:116;b",
 $1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,7,[],"call"],
+return a},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 pu:{
 "^":"qh;DI,Sg,Ph",
@@ -8739,13 +8767,13 @@
 yI:function(a){return this.KR(a,null,null,null)},
 $isqh:true},
 i2:{
-"^":"Tp:16;a",
-$1:function(a){return J.eI(J.l2(a),this.a)},
+"^":"Tp:116;a",
+$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 b0:{
-"^":"Tp:16;b",
+"^":"Tp:116;b",
 $1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,7,[],"call"],
+return a},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Ov:{
 "^":"MO;VP,uv,Ph,u7,Sg",
@@ -8776,10 +8804,10 @@
 cO:[function(a){var z,y
 for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.aV.cO(0)},"$0","gJK",0,0,21],
+this.aV.cO(0)},"$0","gJK",0,0,126],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
 RX:{
-"^":"Tp:22;a,b",
+"^":"Tp:115;a,b",
 $0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 bO:{
@@ -8801,8 +8829,8 @@
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
-$iszM:true,
-$aszM:null,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -8846,11 +8874,11 @@
 return!1},
 gl:function(){return this.QZ}},
 vZ:{
-"^":"Tp:16;a,b",
+"^":"Tp:116;a,b",
 $1:[function(a){var z=H.Va(this.b)
 Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
 a.constructor=a.__proto__.constructor
-return this.a(a)},"$1",null,2,0,null,62,[],"call"],
+return this.a(a)},"$1",null,2,0,null,48,[],"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
@@ -8862,8 +8890,8 @@
 On:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 $isD0:true,
-static:{P1:function(a){if(a===window)return a
-else return new W.dW(a)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+static:{P1:[function(a){if(a===window)return a
+else return new W.dW(a)},"$1","lG",2,0,null,246,[]]}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -8879,7 +8907,7 @@
 eG:{
 "^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEBlendElement"},
-lv:{
+lvr:{
 "^":"d5;t5:type=,UQ:values=,fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
 pf:{
@@ -8918,7 +8946,7 @@
 ca:{
 "^":"d5;x=,y=",
 "%":"SVGFEPointLightElement"},
-zt:{
+zu:{
 "^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
 eW:{
@@ -8951,7 +8979,7 @@
 Ac:{
 "^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-jr:{
+MU:{
 "^":"Yz;fg:height=,R:width=,x=,y=",
 "%":"SVGRectElement"},
 nd:{
@@ -8969,12 +8997,13 @@
 J.r4(z.h2.NL)
 z.FV(0,b)},
 gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.T1.f0(a)},
+gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
 gVY:function(a){return C.DK.f0(a)},
 gE8:function(a){return C.W2.f0(a)},
 $isD0: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"},
+"%":"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",
+static:{"^":"JQ<"}},
 hy:{
 "^":"zp;fg:height=,R:width=,x=,y=",
 Kb:function(a,b){return a.getElementById(b)},
@@ -8999,7 +9028,7 @@
 "^":"As;LO",
 lF:function(){var z,y,x,w
 z=this.LO.getAttribute("class")
-y=P.Ls(null,null,null,P.qU)
+y=P.Ls(null,null,null,J.O)
 if(z==null)return y
 for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=J.rr(x.lo)
 if(w.length!==0)y.h(0,w)}return y},
@@ -9014,16 +9043,16 @@
 $ishq:true,
 static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
-xZ:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
+xZ:[function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},"$2$captureThis","oo",2,3,null,223,128,[],247,[]],
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,47,[],67,[],33,[],68,[]],
-Dm:function(a,b,c){var z
+d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,164,[],247,[],180,[],90,[]],
+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},
-Om:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},
+return!0}catch(z){H.Ru(z)}return!1},"$3","Iy",6,0,null,99,[],12,[],30,[]],
+Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
+return},"$2","OP",4,0,null,99,[],12,[]],
 wY:[function(a){var z
 if(a==null)return
 else if(typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
@@ -9032,10 +9061,10 @@
 else if(!!z.$isiP)return H.o2(a)
 else if(!!z.$isE4)return a.eh
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,16,69,[]],
-hE:function(a,b,c){var z=P.Om(a,b)
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,116,99,[]],
+hE:[function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.$1(a)
-P.Dm(a,b,z)}return z},
+P.Dm(a,b,z)}return z},"$3","dw",6,0,null,99,[],69,[],250,[]],
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
 else{if(a instanceof Object){z=J.x(a)
@@ -9043,13 +9072,13 @@
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.hs())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,54,69,[]],
-ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
+else return P.ND(a)}},"$1","Xl",2,0,206,99,[]],
+ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),new P.QS())},
-iQ:function(a,b,c){var z=P.Om(a,b)
+else return P.iQ(a,$.Iq(),new P.QS())},"$1","ln",2,0,null,99,[]],
+iQ:[function(a,b,c){var z=P.Om(a,b)
 if(z==null||!(a instanceof Object)){z=c.$1(a)
-P.Dm(a,b,z)}return z},
+P.Dm(a,b,z)}return z},"$3","yF",6,0,null,99,[],69,[],250,[]],
 E4:{
 "^":"a;eh",
 t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
@@ -9077,9 +9106,9 @@
 C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Gn(P.UD(null,null)).$1(a)}}},
+return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).$1(a)},"$1","aV",2,0,null,248,[]]}},
 Gn:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
@@ -9090,7 +9119,7 @@
 x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
 z.u(0,a,v)
 C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"$1",null,2,0,null,69,[],"call"],
+return v}else return P.wY(a)},"$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 r7:{
 "^":"E4;eh"},
@@ -9129,47 +9158,47 @@
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 GT:function(a,b){this.V7("sort",[b])},
 np:function(a){return this.GT(a,null)},
-static:{BE:function(a,b,c){var z=J.Wx(a)
+static:{BE:[function(a,b,c){var z=J.Wx(a)
 if(z.C(a,0)||z.D(a,c))throw H.b(P.TE(a,0,c))
 z=J.Wx(b)
-if(z.C(b,a)||z.D(b,c))throw H.b(P.TE(b,a,c))}}},
+if(z.C(b,a)||z.D(b,c))throw H.b(P.TE(b,a,c))},"$3","d6",6,0,null,134,[],135,[],249,[]]}},
 Wk:{
 "^":"E4+lD;",
-$iszM:true,
-$aszM:null,
+$isList:true,
+$asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 DV:{
-"^":"Tp:16;",
-$1:function(a){var z=P.xZ(a,!1)
+"^":"Tp:116;",
+$1:[function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
-return z},
+return z},"$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 Hp:{
-"^":"Tp:16;a",
-$1:function(a){return new this.a(a)},
+"^":"Tp:116;a",
+$1:[function(a){return new this.a(a)},"$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 Nz:{
-"^":"Tp:16;",
-$1:function(a){return new P.r7(a)},
+"^":"Tp:116;",
+$1:[function(a){return new P.r7(a)},"$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 Jd:{
-"^":"Tp:16;",
-$1:function(a){return H.VM(new P.Tz(a),[null])},
+"^":"Tp:116;",
+$1:[function(a){return H.VM(new P.Tz(a),[null])},"$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 QS:{
-"^":"Tp:16;",
-$1:function(a){return new P.E4(a)},
+"^":"Tp:116;",
+$1:[function(a){return new P.E4(a)},"$1",null,2,0,null,99,[],"call"],
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
-VC:function(a,b){a=536870911&a+b
+VC:[function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},
-Up:function(a){a=536870911&a+((67108863&a)<<3>>>0)
+return a^a>>>6},"$2","hj",4,0,null,238,[],30,[]],
+Up:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
 a^=a>>>11
-return 536870911&a+((16383&a)<<15>>>0)},
-J:function(a,b){var z
+return 536870911&a+((16383&a)<<15>>>0)},"$1","Hj",2,0,null,238,[]],
+J:[function(a,b){var z
 if(typeof a!=="number")throw H.b(P.u(a))
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a>b)return b
@@ -9178,15 +9207,15 @@
 if(a===0)z=b===0?1/b<0:b<0
 else z=!1
 if(z||isNaN(b))return b
-return a}return a},
-y:function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
+return a}return a},"$2","yT",4,0,null,118,[],199,[]],
+y:[function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a>b)return a
 if(a<b)return b
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},
+return a},"$2","Rb",4,0,null,118,[],199,[]],
 mg:{
 "^":"a;",
 j1:function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
@@ -9288,20 +9317,14 @@
 $ishL:true},
 HDe:{
 "^":"a;",
-gT8:function(a){var z,y
-z=this.gBb(this)
-y=this.R
+gT8:function(a){var z=this.gBb(this)
 if(typeof z!=="number")return z.g()
-if(typeof y!=="number")return H.s(y)
-return z+y},
-gQG:function(a){var z,y
-z=this.gG6(this)
-y=this.fg
+return z+this.R},
+gQG:function(a){var z=this.gG6(this)
 if(typeof z!=="number")return z.g()
-if(typeof y!=="number")return H.s(y)
-return z+y},
-bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+H.d(this.R)+" x "+H.d(this.fg)},
-n:function(a,b){var z,y,x,w
+return z+this.fg},
+bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+this.R+" x "+this.fg},
+n:function(a,b){var z,y,x
 if(b==null)return!1
 z=J.x(b)
 if(!z.$istn)return!1
@@ -9310,26 +9333,20 @@
 if(y==null?x==null:y===x){y=this.G6
 x=z.gG6(b)
 if(y==null?x==null:y===x){x=this.Bb
-w=this.R
 if(typeof x!=="number")return x.g()
-if(typeof w!=="number")return H.s(w)
-if(x+w===z.gT8(b)){x=this.fg
-if(typeof y!=="number")return y.g()
-if(typeof x!=="number")return H.s(x)
-z=y+x===z.gQG(b)}else z=!1}else z=!1}else z=!1
+if(x+this.R===z.gT8(b)){if(typeof y!=="number")return y.g()
+z=y+this.fg===z.gQG(b)}else z=!1}else z=!1}else z=!1
 return z},
-giO:function(a){var z,y,x,w,v,u
+giO:function(a){var z,y,x,w
 z=J.v1(this.gBb(this))
 y=this.G6
 x=J.v1(y)
 w=this.Bb
-v=this.R
 if(typeof w!=="number")return w.g()
-if(typeof v!=="number")return H.s(v)
-u=this.fg
+w=w+this.R&0x1FFFFFFF
 if(typeof y!=="number")return y.g()
-if(typeof u!=="number")return H.s(u)
-return P.Up(P.VC(P.VC(P.VC(P.VC(0,z),x),w+v&0x1FFFFFFF),y+u&0x1FFFFFFF))},
+y=y+this.fg&0x1FFFFFFF
+return P.Up(P.VC(P.VC(P.VC(P.VC(0,z),x),w),y))},
 gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
@@ -9346,14 +9363,14 @@
 else y=d
 return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.mirrors","dart:mirrors",,P,{
 "^":"",
-re:function(a){var z,y
+re:[function(a){var z,y
 z=J.x(a)
 if(!z.$isuq||z.n(a,C.HH))throw H.b(P.u(H.d(a)+" does not denote a class"))
 y=P.o1(a)
 if(!J.x(y).$isMs)throw H.b(P.u(H.d(a)+" does not denote a class"))
-return y.gJi()},
-o1:function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},
+return y.gJi()},"$1","dO",2,0,null,49,[]],
+o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
+return $.P8()}return H.jO(a.gLU())},"$1","o9",2,0,null,49,[]],
 QF:{
 "^":"a;",
 $isQF:true},
@@ -9403,7 +9420,7 @@
 WS4:{
 "^":"a;ew,oQ,Js,f9"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
 "^":"",
-ah:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
+ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","lc",0,0,null],
 Gj:{
 "^":"mAS;EV"},
 mAS:{
@@ -9433,6 +9450,7 @@
 Rz:function(a,b){return this.EV.Rz(0,b)},
 gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
+bu:function(a){return P.vW(this.EV)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
 "^":"",
 UI:function(a){a.toString
@@ -9443,6 +9461,7 @@
 return a},
 WZ:{
 "^":"Gv;",
+gbx:function(a){return C.PT},
 $isWZ:true,
 "%":"ArrayBuffer"},
 pF:{
@@ -9458,10 +9477,12 @@
 "%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
 df:{
 "^":"pF;",
+gbx:function(a){return C.T1},
 $isHY:true,
 "%":"DataView"},
 Hg:{
 "^":"Dg;",
+gbx:function(a){return C.hN},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9470,15 +9491,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.CP]},
+$isList:true,
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.CP]},
+$asQV:function(){return[J.Pp]},
 $isHY:true,
 "%":"Float32Array"},
 fS:{
 "^":"Dg;",
+gbx:function(a){return C.lk},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9487,15 +9509,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.CP]},
+$isList:true,
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.CP]},
+$asQV:function(){return[J.Pp]},
 $isHY:true,
 "%":"Float64Array"},
 PS:{
 "^":"Pg;",
+gbx:function(a){return C.jV},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9504,15 +9527,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]},
+$asQV:function(){return[J.bU]},
 $isHY:true,
 "%":"Int16Array"},
 dE:{
 "^":"Pg;",
+gbx:function(a){return C.Im},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9521,15 +9545,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]},
+$asQV:function(){return[J.bU]},
 $isHY:true,
 "%":"Int32Array"},
-Eb:{
+IJ:{
 "^":"Pg;",
+gbx:function(a){return C.la},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9538,15 +9563,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]},
+$asQV:function(){return[J.bU]},
 $isHY:true,
 "%":"Int8Array"},
 us:{
 "^":"Pg;",
+gbx:function(a){return C.iG},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9555,15 +9581,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]},
+$asQV:function(){return[J.bU]},
 $isHY:true,
 "%":"Uint16Array"},
 qe:{
 "^":"Pg;",
+gbx:function(a){return C.Vh},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9572,15 +9599,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]},
+$asQV:function(){return[J.bU]},
 $isHY:true,
 "%":"Uint32Array"},
 eE:{
 "^":"Pg;",
+gbx:function(a){return C.nG},
 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)
@@ -9590,15 +9618,16 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]},
+$asQV:function(){return[J.bU]},
 $isHY:true,
 "%":"CanvasPixelArray|Uint8ClampedArray"},
 V6:{
 "^":"Pg;",
+gbx:function(a){return C.eY},
 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)
@@ -9608,11 +9637,11 @@
 a[b]=c},
 D6:function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]},
+$asQV:function(){return[J.bU]},
 $isHY:true,
 "%":";Uint8Array"},
 b0B:{
@@ -9637,18 +9666,18 @@
 return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true,
-$iszM:true,
-$aszM:function(){return[P.CP]},
+$isList:true,
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.CP]}},
+$asQV:function(){return[J.Pp]}},
 Ui:{
 "^":"b0B+lD;",
-$iszM:true,
-$aszM:function(){return[P.CP]},
+$isList:true,
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.CP]}},
+$asQV:function(){return[J.Pp]}},
 Ip:{
 "^":"Ui+SU7;"},
 Pg:{
@@ -9657,36 +9686,36 @@
 return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isPg:true,
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]}},
+$asQV:function(){return[J.bU]}},
 ObS:{
 "^":"b0B+lD;",
-$iszM:true,
-$aszM:function(){return[P.KN]},
+$isList:true,
+$asWO:function(){return[J.bU]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.KN]}},
+$asQV:function(){return[J.bU]}},
 nA:{
 "^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
 "^":"",
-qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
+qw:[function(a){if(typeof dartPrint=="function"){dartPrint(a)
 return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
 return}if(typeof window=="object")return
 if(typeof print=="function"){print(a)
-return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw"Unable to print message: "+String(a)},"$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 Ir:{
-"^":["D13;Py%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.Py},null,null,1,0,85,"error",82,104],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,86,27,[],"error",82],
+"^":["D13;Py%-341,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.Py},null,null,1,0,320,"error",308,311],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,321,30,[],"error",308],
 "@":function(){return[C.uW]},
 static:{hG:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -9694,29 +9723,29 @@
 a.X0=w
 C.OD.ZL(a)
 C.OD.oX(a)
-return a},null,null,0,0,22,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[159],
+return a},null,null,0,0,115,"new ErrorViewElement$created"]}},
+"+ErrorViewElement":[394],
 D13:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
-bf:{
-"^":["WZq;a3%-125,Ab%-125,Ln%-160,y4%-161,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.a3},null,null,1,0,87,"text",82,83],
-sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,8,27,[],"text",82],
-gzW:[function(a){return a.Ab},null,null,1,0,87,"lineMode",82,83],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,8,27,[],"lineMode",82],
-gFR:[function(a){return a.Ln},null,null,1,0,162,"callback",82,104],
+rm:{
+"^":["WZq;a3%-305,Ab%-305,Ln%-395,y4%-396,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.a3},null,null,1,0,312,"text",308,309],
+sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,32,30,[],"text",308],
+gzW:[function(a){return a.Ab},null,null,1,0,312,"lineMode",308,309],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",308],
+gFR:[function(a){return a.Ln},null,null,1,0,397,"callback",308,311],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,163,27,[],"callback",82],
-gPK:[function(a){return a.y4},null,null,1,0,164,"results",82,83],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,165,27,[],"results",82],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,398,30,[],"callback",308],
+gPK:[function(a){return a.y4},null,null,1,0,399,"results",308,309],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,400,30,[],"results",308],
 az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
 z=this.ct(a,C.eh,a.Ab,z)
 a.Ab=z
 if(J.de(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,120,7,[],121,[],119,[],"updateLineMode"],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,350,21,[],351,[],82,[],"updateLineMode"],
 kk:[function(a,b,c,d){var z,y,x
 J.zJ(b)
 z=a.a3
@@ -9725,15 +9754,15 @@
 x=R.Jk(y)
 J.kW(x,"expr",z)
 J.BM(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,120,7,[],121,[],119,[],"eval"],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,350,21,[],351,[],82,[],"eval"],
 A3:[function(a,b){var z=J.MI(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,166,7,[],"selectExpr"],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,401,21,[],"selectExpr"],
 "@":function(){return[C.Qz]},
 static:{Rp:[function(a){var z,y,x,w,v
 z=R.Jk([])
 y=$.Nd()
-x=P.Py(null,null,null,P.qU,W.I0)
-w=P.qU
+x=P.Py(null,null,null,J.O,W.I0)
+w=J.O
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
 a.Ab="1-line"
@@ -9743,39 +9772,39 @@
 a.X0=v
 C.Gh.ZL(a)
 C.Gh.oX(a)
-return a},null,null,0,0,22,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[167],
+return a},null,null,0,0,115,"new EvalBoxElement$created"]}},
+"+EvalBoxElement":[402],
 WZq:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"Tp:16;a-29",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,16,168,[],"call"],
+"^":"Tp:116;a-85",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,116,57,[],"call"],
 $isEH:true},
-"+ YW":[124]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
+"+ YW":[315]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
 Lt:{
-"^":["Nr;TS%-109,bY%-29,jv%-125,oy%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gO9:[function(a){return a.TS},null,null,1,0,126,"busy",82,83],
-sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,127,27,[],"busy",82],
-gFR:[function(a){return a.bY},null,null,1,0,22,"callback",82,104],
+"^":["Bc;TS%-304,bY%-85,jv%-305,oy%-341,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gO9:[function(a){return a.TS},null,null,1,0,307,"busy",308,309],
+sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,310,30,[],"busy",308],
+gFR:[function(a){return a.bY},null,null,1,0,115,"callback",308,311],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,16,27,[],"callback",82],
-gNW:[function(a){return a.jv},null,null,1,0,87,"expr",82,104],
-sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,8,27,[],"expr",82],
-gyG:[function(a){return a.oy},null,null,1,0,85,"result",82,104],
-syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,86,27,[],"result",82],
+sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,116,30,[],"callback",308],
+gNW:[function(a){return a.jv},null,null,1,0,312,"expr",308,311],
+sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,32,30,[],"expr",308],
+gyG:[function(a){return a.oy},null,null,1,0,320,"result",308,311],
+syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,321,30,[],"result",308],
 wB:[function(a,b,c,d){var z=a.TS
 if(z===!0)return
 if(a.bY!=null){a.TS=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.Kz(a)).YM(new R.Ou(a))}},"$3","gDf",6,0,130,53,[],57,[],123,[],"evalNow"],
+this.LY(a,a.jv).ml(new R.Kz(a)).YM(new R.Ou(a))}},"$3","gDf",6,0,313,118,[],199,[],289,[],"evalNow"],
 "@":function(){return[C.Vn]},
 static:{fL:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.TS=!1
@@ -9787,35 +9816,35 @@
 a.X0=w
 C.UF.ZL(a)
 C.UF.oX(a)
-return a},null,null,0,0,22,"new EvalLinkElement$created"]}},
-"+EvalLinkElement":[169],
-Nr:{
+return a},null,null,0,0,115,"new EvalLinkElement$created"]}},
+"+EvalLinkElement":[403],
+Bc:{
 "^":"xc+Pi;",
 $isd3:true},
 Kz:{
-"^":"Tp:86;a-29",
+"^":"Tp:321;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,86,92,[],"call"],
+y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,321,101,[],"call"],
 $isEH:true},
-"+ Kz":[124],
+"+ Kz":[315],
 Ou:{
-"^":"Tp:22;b-29",
+"^":"Tp:115;b-85",
 $0:[function(){var z,y
 z=this.b
 y=J.RE(z)
-y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,22,"call"],
+y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,115,"call"],
 $isEH:true},
-"+ Ou":[124]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ Ou":[315]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 UL:{
-"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.E6]},
 static:{zY:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -9824,19 +9853,19 @@
 a.X0=w
 C.MC.ZL(a)
 C.MC.oX(a)
-return a},null,null,0,0,22,"new FieldRefElement$created"]}},
-"+FieldRefElement":[110]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+return a},null,null,0,0,115,"new FieldRefElement$created"]}},
+"+FieldRefElement":[342]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 jM:{
-"^":["pva;vt%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gt0:[function(a){return a.vt},null,null,1,0,103,"field",82,104],
-st0:[function(a,b){a.vt=this.ct(a,C.Gx,a.vt,b)},null,null,3,0,105,27,[],"field",82],
-pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"^":["pva;vt%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gt0:[function(a){return a.vt},null,null,1,0,337,"field",308,311],
+st0:[function(a,b){a.vt=this.ct(a,C.Gx,a.vt,b)},null,null,3,0,338,30,[],"field",308],
+pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 "@":function(){return[C.vc]},
-static:{Sy:[function(a){var z,y,x,w
+static:{bH:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -9844,16 +9873,16 @@
 a.X0=w
 C.LT.ZL(a)
 C.LT.oX(a)
-return a},null,null,0,0,22,"new FieldViewElement$created"]}},
-"+FieldViewElement":[170],
+return a},null,null,0,0,115,"new FieldViewElement$created"]}},
+"+FieldViewElement":[404],
 pva:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
 qW:{
-"^":["rs;lh%-109,qe%-109,zg%-109,Fs%-109,AP,fn,tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gU4:[function(a){return a.lh},null,null,1,0,126,"qualified",82,104],
-sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,127,27,[],"qualified",82],
+"^":["rs;lh%-304,qe%-304,zg%-304,Fs%-304,AP,fn,tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gU4:[function(a){return a.lh},null,null,1,0,307,"qualified",308,311],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,310,30,[],"qualified",308],
 P9:[function(a,b){var z,y,x
 Q.xI.prototype.P9.call(this,a,b)
 this.ct(a,C.D2,0,1)
@@ -9867,18 +9896,18 @@
 a.qe=this.ct(a,C.D2,a.qe,x)
 if(y){y=J.U6(z)
 y=y.t(z,"owner")!=null&&J.de(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,26,65,[],"refChanged"],
-gSY4:[function(a){return a.qe},null,null,1,0,126,"hasParent",82,83],
-sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,127,27,[],"hasParent",82],
-gIO:[function(a){return a.zg},null,null,1,0,126,"hasClass",82,83],
-sIO:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,127,27,[],"hasClass",82],
-gmN:[function(a){return a.Fs},null,null,1,0,126,"isDart",82,83],
-smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,127,27,[],"isDart",82],
+a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,169,242,[],"refChanged"],
+gSY4:[function(a){return a.qe},null,null,1,0,307,"hasParent",308,309],
+sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,310,30,[],"hasParent",308],
+gIO:[function(a){return a.zg},null,null,1,0,307,"hasClass",308,309],
+sIO:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,310,30,[],"hasClass",308],
+gmN:[function(a){return a.Fs},null,null,1,0,307,"isDart",308,309],
+smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,310,30,[],"isDart",308],
 "@":function(){return[C.o3]},
 static:{Wz:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.lh=!0
@@ -9891,20 +9920,20 @@
 a.X0=w
 C.Xo.ZL(a)
 C.Xo.oX(a)
-return a},null,null,0,0,22,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[171],
+return a},null,null,0,0,115,"new FunctionRefElement$created"]}},
+"+FunctionRefElement":[405],
 rs:{
 "^":"xI+Pi;",
 $isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 mk:{
-"^":["cda;De%-101,Iu%-125,Ru%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.De},null,null,1,0,103,"function",82,104],
-sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,105,27,[],"function",82],
-gUx:[function(a){return a.Iu},null,null,1,0,87,"qualifiedName",82,104],
-sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,8,27,[],"qualifiedName",82],
-gfY:[function(a){return a.Ru},null,null,1,0,87,"kind",82,104],
-sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,8,27,[],"kind",82],
+"^":["cda;De%-336,Iu%-305,Ru%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.De},null,null,1,0,337,"function",308,311],
+sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,338,30,[],"function",308],
+gUx:[function(a){return a.Iu},null,null,1,0,312,"qualifiedName",308,311],
+sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,32,30,[],"qualifiedName",308],
+gfY:[function(a){return a.Ru},null,null,1,0,312,"kind",308,311],
+sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,32,30,[],"kind",308],
 FW:[function(a,b){var z,y,x
 z=b!=null
 y=z&&J.UQ(b,"parent")!=null?J.UQ(b,"parent"):null
@@ -9913,7 +9942,7 @@
 z=z.t(b,"owner")!=null&&J.de(z.t(b,"owner").gzS(),"Class")}else z=!1
 x=z?J.UQ(b,"owner"):null
 if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
-return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,172,173,[],"_getQualifiedName"],
+return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,406,17,[],"_getQualifiedName"],
 ql:[function(a,b){var z,y
 this.ct(a,C.AO,0,1)
 this.ct(a,C.fy,0,1)
@@ -9946,13 +9975,13 @@
 case"kInvokeFieldDispatcher":a.Ru=this.ct(a,C.fy,y,"invoke field dispatcher")
 break
 default:a.Ru=this.ct(a,C.fy,y,"UNKNOWN")
-break}},"$1","gNC",2,0,26,65,[],"functionChanged"],
-pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+break}},"$1","gNC",2,0,169,242,[],"functionChanged"],
+pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -9960,49 +9989,49 @@
 a.X0=w
 C.h4.ZL(a)
 C.h4.oX(a)
-return a},null,null,0,0,22,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[174],
+return a},null,null,0,0,115,"new FunctionViewElement$created"]}},
+"+FunctionViewElement":[407],
 cda:{
 "^":"uL+Pi;",
 $isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
 "^":"",
 Qb:{
 "^":"a;HW,mS",
-F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,175],
+F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,408],
 gvH:function(a){return J.Ts(this.mS,4)},
-static:{"^":"Q0",x6:function(a,b){var z=J.RE(b)
-return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.eY(a)),z.gx(b)),4))}}},
+static:{"^":"Q0z",x6:function(a,b){var z=J.RE(b)
+return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.YD(a)),z.gx(b)),4))}}},
 uc:{
 "^":"a;Yu<,tL"},
 pL:{
-"^":["waa;hi%-29,An%-29,dW%-29,rM%-29,Ge%-29,UL%-29,PA%-125,Oh%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gys:[function(a){return a.PA},null,null,1,0,87,"status",82,83],
-sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,8,27,[],"status",82],
-gyw:[function(a){return a.Oh},null,null,1,0,103,"fragmentation",82,104],
-syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,105,27,[],"fragmentation",82],
+"^":["waa;hi%-85,An%-85,dW%-85,rM%-85,Ge%-85,UL%-85,PA%-305,Oh%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gys:[function(a){return a.PA},null,null,1,0,312,"status",308,309],
+sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",308],
+gyw:[function(a){return a.Oh},null,null,1,0,337,"fragmentation",308,311],
+syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,338,30,[],"fragmentation",308],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
 a.hi=z
 J.oL(z).yI(this.gmo(a))
-J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,21,"enteredView"],
+J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,126,"enteredView"],
 LV:[function(a,b){var z,y,x
 for(z=J.GP(b),y=0;z.G();){x=z.gl()
 if(typeof x!=="number")return H.s(x)
-y=y*256+x}return y},"$1","gzK",2,0,176,177,[],"_packColor"],
+y=y*256+x}return y},"$1","gzK",2,0,409,410,[],"_packColor"],
 tn:[function(a,b,c,d){var z,y
 z=a.UL
 y=J.uH(c,"@")
 if(0>=y.length)return H.e(y,0)
 J.kW(z,b,y[0])
 J.kW(a.rM,b,d)
-J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,178,179,[],64,[],177,[],"_addClass"],
+J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,411,412,[],12,[],410,[],"_addClass"],
 an:[function(a,b,c){var z,y,x,w,v,u,t
 for(z=J.GP(J.UQ(b,"members"));z.G();){y=z.gl()
 x=J.U6(y)
 if(!J.de(x.t(y,"type"),"@Class")){N.Jx("").To(H.d(y))
 continue}w=H.BU(C.Nm.grZ(J.uH(x.t(y,"id"),"/")),null,null)
-v=w==null?C.vT:P.r2(w)
+v=w==null?C.OY:P.r2(w)
 u=[v.j1(128),v.j1(128),v.j1(128),255]
 x=x.t(y,"name")
 t=a.UL
@@ -10011,16 +10040,16 @@
 J.kW(t,w,x[0])
 J.kW(a.rM,w,u)
 J.kW(a.Ge,this.LV(a,u),w)}this.tn(a,c,"Free",$.R2())
-this.tn(a,0,"",$.eK())},"$2","gUw",4,0,180,181,[],182,[],"_updateClassList"],
-LI:[function(a,b){var z=b==null?C.vT:P.r2(b)
-return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,183,179,[],"_classIdToRGBA"],
+this.tn(a,0,"",$.eK())},"$2","gUw",4,0,413,414,[],415,[],"_updateClassList"],
+LI:[function(a,b){var z=b==null?C.OY:P.r2(b)
+return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,416,412,[],"_classIdToRGBA"],
 Ic:[function(a,b){var z,y,x
 z=O.x6(a.An,b)
 y=z.mS
 x=J.Cl(J.Qd(z.HW),y,J.WB(y,4))
-return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,184,185,[],"_classNameAt"],
+return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,417,418,[],"_classNameAt"],
 WE:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=J.vX(a.dW,J.eY(a.An))
+z=J.vX(a.dW,J.YD(a.An))
 y=J.Ts(O.x6(a.An,b).mS,4)
 x=J.Wx(y)
 w=x.Z(y,z)
@@ -10045,7 +10074,7 @@
 break}o+=2}x=H.BU(x.t(t,"object_start"),null,null)
 r=J.UQ(a.Oh,"unit_size_bytes")
 if(typeof r!=="number")return H.s(r)
-return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,186,185,[],"_objectAt"],
+return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,419,418,[],"_objectAt"],
 U8:[function(a,b){var z,y,x,w,v,u
 z=J.RE(b)
 y=this.WE(a,z.gD7(b))
@@ -10056,9 +10085,9 @@
 v=J.Cl(J.Qd(z.HW),w,J.WB(w,4))
 u=J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,v)))
 z=J.de(u,"")?"-":H.d(u)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,166,91,[],"_handleMouseMove"],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,401,325,[],"_handleMouseMove"],
 f1:[function(a,b){var z=J.cR(this.WE(a,J.HF(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,166,91,[],"_handleClick"],
+window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,401,325,[],"_handleClick"],
 My:[function(a){var z,y,x,w
 z=a.Oh
 if(z==null||a.hi==null)return
@@ -10074,9 +10103,9 @@
 if(typeof w!=="number")return H.s(w)
 w=P.f9(J.Vf(a.hi).createImageData(x,z*w))
 a.An=w
-J.No(a.hi,J.eY(w))
-J.OE(a.hi,J.kd(a.An))
-this.ps(a,0)},"$0","gCT",0,0,21,"_updateFragmentationData"],
+J.No(a.hi,J.YD(w))
+J.OE(a.hi,J.OBt(a.An))
+this.ps(a,0)},"$0","gCT",0,0,126,"_updateFragmentationData"],
 ps:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 z=J.UQ(a.Oh,"pages")
 y=J.U6(z)
@@ -10112,20 +10141,20 @@
 J.wp(n.gRn(o),y,x.g(y,4),l)
 v=new O.Qb(o,x.g(y,4))}y=J.Vf(a.hi)
 x=a.An
-J.J4(y,x,0,0,0,w,J.eY(x),m)
-P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,187,188,[],"_renderPages"],
+J.J4(y,x,0,0,0,w,J.YD(x),m)
+P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,420,421,[],"_renderPages"],
 pA:[function(a,b){var z=a.Oh
 if(z==null)return
-J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
-YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,26,65,[],"fragmentationChanged"],
+J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,169,242,[],"fragmentationChanged"],
 "@":function(){return[C.Cu]},
-static:{"^":"nK<-29,RD<-29,SoT<-29",pn:[function(a){var z,y,x,w,v,u,t
+static:{"^":"nK<-85,RD<-85,SoT<-85",pn:[function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
 w=$.Nd()
-v=P.Py(null,null,null,P.qU,W.I0)
-u=P.qU
+v=P.Py(null,null,null,J.O,W.I0)
+u=J.O
 t=W.cv
 t=H.VM(new V.qC(P.Py(null,null,null,u,t),null,null),[u,t])
 a.rM=z
@@ -10136,41 +10165,41 @@
 a.X0=t
 C.pJ.ZL(a)
 C.pJ.oX(a)
-return a},null,null,0,0,22,"new HeapMapElement$created"]}},
-"+HeapMapElement":[189],
+return a},null,null,0,0,115,"new HeapMapElement$created"]}},
+"+HeapMapElement":[422],
 waa:{
 "^":"uL+Pi;",
 $isd3:true},
 WQ:{
-"^":"Tp:22;a-29,b-93",
-$0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,22,"call"],
+"^":"Tp:115;a-85,b-326",
+$0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,115,"call"],
 $isEH:true},
-"+ WQ":[124],
+"+ WQ":[315],
 aG:{
-"^":"Tp:105;a-29",
+"^":"Tp:338;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,105,190,[],"call"],
+y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,338,423,[],"call"],
 $isEH:true},
-"+ aG":[124],
+"+ aG":[315],
 aO:{
-"^":"Tp:75;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
 $isEH:true},
-"+ aO":[124],
+"+ aO":[315],
 oc:{
-"^":"Tp:22;a-29",
-$0:[function(){J.vP(this.a)},"$0",null,0,0,22,"call"],
+"^":"Tp:115;a-85",
+$0:[function(){J.vP(this.a)},"$0",null,0,0,115,"call"],
 $isEH:true},
-"+ oc":[124]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+"+ oc":[315]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 jY:{
-"^":["V4;GQ%-29,J0%-29,Oc%-29,CO%-29,nc%-192,Ol%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gLF:[function(a){return a.nc},null,null,1,0,193,"classTable",82,83],
-sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,194,27,[],"classTable",82],
-gB1:[function(a){return a.Ol},null,null,1,0,103,"profile",82,104],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,105,27,[],"profile",82],
+"^":["V4;GQ%-85,J0%-85,Oc%-85,CO%-85,nc%-425,Ol%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gLF:[function(a){return a.nc},null,null,1,0,426,"classTable",308,309],
+sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,427,30,[],"classTable",308],
+gB1:[function(a){return a.Ol},null,null,1,0,337,"profile",308,311],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,338,30,[],"profile",308],
 i4:[function(a){var z,y
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
@@ -10183,10 +10212,10 @@
 z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
 a.CO=z
 z.bG.u(0,"title","Old Space")
-this.uB(a)},"$0","gQd",0,0,21,"enteredView"],
+this.uB(a)},"$0","gQd",0,0,126,"enteredView"],
 hZ:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=a.Ol
-if(z==null||!J.x(J.UQ(z,"members")).$iszM||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
+if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
 a.nc.lb()
 for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
 if(this.K1(a,y))continue
@@ -10212,23 +10241,23 @@
 J.qK(a.Oc,["Used",z.t(o,"used")])
 J.qK(a.Oc,["Free",J.xH(z.t(o,"capacity"),z.t(o,"used"))])
 J.qK(a.Oc,["External",z.t(o,"external")])
-this.uB(a)},"$0","gYs",0,0,21,"_updateChartData"],
+this.uB(a)},"$0","gYs",0,0,126,"_updateChartData"],
 uB:[function(a){var z=a.J0
 if(z==null)return
 z.W2(a.GQ)
-a.CO.W2(a.Oc)},"$0","goI",0,0,21,"_draw"],
+a.CO.W2(a.Oc)},"$0","goI",0,0,126,"_draw"],
 AE:[function(a,b,c,d){var z,y
 if(!!J.x(d).$isqk){z=a.nc.gxp()
 y=d.cellIndex
 if(z==null?y!=null:z!==y){a.nc.sxp(y)
-J.Yl(a.nc)}}},"$3","gQq",6,0,195,7,[],121,[],119,[],"changeSort",83],
+J.Yl(a.nc)}}},"$3","gQq",6,0,428,21,[],351,[],82,[],"changeSort",309],
 K1:[function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
 x=z.t(b,"old")
 for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
 for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"$1","gbU",2,0,196,70,[],"_classHasNoAllocations"],
+return!0},"$1","gbU",2,0,429,122,[],"_classHasNoAllocations"],
 VI:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:return J.UQ(J.UQ(b,"new"),7)
@@ -10242,40 +10271,40 @@
 case 7:z=J.U6(b)
 return J.WB(J.UQ(z.t(b,"old"),3),J.UQ(z.t(b,"old"),5))
 case 8:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,197,70,[],73,[],"_combinedTableColumnValue"],
+return J.WB(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,430,122,[],15,[],"_combinedTableColumnValue"],
 pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 cQ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,26,106,[],"refreshGC"],
+J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,169,339,[],"refreshGC"],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,26,106,[],"resetAccumulator"],
+J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,169,339,[],"resetAccumulator"],
 pM:[function(a,b){var z,y,x,w
 try{this.hZ(a)}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 N.Jx("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,26,65,[],"profileChanged"],
+this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,169,242,[],"profileChanged"],
 Ar:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,198,199,[],"formattedAverage",83],
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,431,432,[],"formattedAverage",309],
 uW:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,198,199,[],"formattedCollections",83],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,431,432,[],"formattedCollections",309],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,198,199,[],"formattedTotalCollectionTime",83],
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,431,432,[],"formattedTotalCollectionTime",309],
 Dd:[function(a){var z=new G.ig(P.zV(J.UQ($.NR,"DataTable"),null))
 a.GQ=z
 z.Gl("string","Type")
@@ -10287,12 +10316,12 @@
 z=H.VM([],[G.Ni])
 z=this.ct(a,C.M5,a.nc,new G.Vz([new G.Kt("Class",G.My()),new G.Kt("Accumulator Size (New)",G.AF()),new G.Kt("Accumulator (New)",G.Vj()),new G.Kt("Current Size (New)",G.AF()),new G.Kt("Current (New)",G.Vj()),new G.Kt("Accumulator Size (Old)",G.AF()),new G.Kt("Accumulator (Old)",G.Vj()),new G.Kt("Current Size (Old)",G.AF()),new G.Kt("Current (Old)",G.Vj())],z,[],0,!0,null,null))
 a.nc=z
-z.sxp(1)},null,null,0,0,22,"created"],
+z.sxp(1)},null,null,0,0,115,"created"],
 "@":function(){return[C.dA]},
-static:{"^":"BO<-29,bQj<-29,xK<-29,V1g<-29,r1K<-29,qEV<-29,pC<-29,DY2<-29",Lz:[function(a){var z,y,x,w
+static:{"^":"BO<-85,bQj<-85,xK<-85,V1g<-85,r1K<-85,qEV<-85,pC<-85,DY2<-85",Lz:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -10301,65 +10330,65 @@
 C.Vc.ZL(a)
 C.Vc.oX(a)
 C.Vc.Dd(a)
-return a},null,null,0,0,22,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[200],
+return a},null,null,0,0,115,"new HeapProfileElement$created"]}},
+"+HeapProfileElement":[433],
 V4:{
 "^":"uL+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:105;a-29",
+"^":"Tp:338;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,338,423,[],"call"],
 $isEH:true},
-"+ nx":[124],
+"+ nx":[315],
 jm:{
-"^":"Tp:75;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
 $isEH:true},
-"+ jm":[124],
+"+ jm":[315],
 AN:{
-"^":"Tp:105;a-29",
+"^":"Tp:338;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,338,423,[],"call"],
 $isEH:true},
-"+ AN":[124],
+"+ AN":[315],
 Ao:{
-"^":"Tp:75;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
 $isEH:true},
-"+ Ao":[124],
+"+ Ao":[315],
 xj:{
-"^":"Tp:105;a-29",
+"^":"Tp:338;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,105,190,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,338,423,[],"call"],
 $isEH:true},
-"+ xj":[124],
+"+ xj":[315],
 VB:{
-"^":"Tp:75;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,75,7,[],191,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
 $isEH:true},
-"+ VB":[124]}],["html_common","dart:html_common",,P,{
+"+ VB":[315]}],["html_common","dart:html_common",,P,{
 "^":"",
-bL:function(a){var z,y
+bL:[function(a){var z,y
 z=[]
 y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).$1(a)
 new P.wO().$0()
-return y},
-o7:function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},
-f9:function(a){var z,y
+return y},"$1","Lq",2,0,null,30,[]],
+o7:[function(a,b){var z=[]
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},"$2$mustCopy","A1",2,3,null,223,6,[],251,[]],
+f9:[function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
 if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.la(a.data,a.height,a.width)},
-QO:function(a){if(!!J.x(a).$isla)return{data:a.Rn,height:a.fg,width:a.R}
-return a},
+y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"$1","D3",2,0,null,252,[]],
+QO:[function(a){if(!!J.x(a).$isqS)return{data:a.Rn,height:a.fg,width:a.R}
+return a},"$1","Gg",2,0,null,253,[]],
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
 $.L4=z}return z},
@@ -10367,34 +10396,34 @@
 if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
 $.PN=z}return z},
 aI:{
-"^":"Tp:52;b,c",
-$1:function(a){var z,y,x
+"^":"Tp:200;b,c",
+$1:[function(a){var z,y,x
 z=this.b
 y=z.length
 for(x=0;x<y;++x)if(z[x]===a)return x
 z.push(a)
 this.c.push(null)
-return y},
+return y},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rG:{
-"^":"Tp:137;d",
-$1:function(a){var z=this.d
+"^":"Tp:363;d",
+$1:[function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
-return z[a]},
+return z[a]},"$1",null,2,0,null,334,[],"call"],
 $isEH:true},
 yh:{
-"^":"Tp:201;e",
-$2:function(a,b){var z=this.e
+"^":"Tp:434;e",
+$2:[function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
-z[a]=b},
+z[a]=b},"$2",null,4,0,null,334,[],28,[],"call"],
 $isEH:true},
 wO:{
-"^":"Tp:22;",
-$0:function(){},
+"^":"Tp:115;",
+$0:[function(){},"$0",null,0,0,null,"call"],
 $isEH:true},
 Tm:{
-"^":"Tp:16;f,UI,bK",
-$1:function(a){var z,y,x,w,v,u
+"^":"Tp:116;f,UI,bK",
+$1:[function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -10416,7 +10445,7 @@
 z.a=w
 this.bK.$2(x,w)
 y.aN(a,new P.ib(z,this))
-return z.a}if(!!y.$iszM){v=y.gB(a)
+return z.a}if(!!y.$isList){v=y.gB(a)
 x=this.f.$1(a)
 w=this.UI.$1(x)
 if(w!=null){if(!0===w){w=new Array(v)
@@ -10426,37 +10455,37 @@
 u=0
 for(;u<v;++u){z=this.$1(y.t(a,u))
 if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ib:{
-"^":"Tp:75;a,Gq",
-$2:function(a,b){this.a.a[a]=this.Gq.$1(b)},
+"^":"Tp:300;a,Gq",
+$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 CA:{
-"^":"Tp:52;a,b",
-$1:function(a){var z,y,x,w
+"^":"Tp:200;a,b",
+$1:[function(a){var z,y,x,w
 z=this.a
 y=z.length
 for(x=0;x<y;++x){w=z[x]
 if(w==null?a==null:w===a)return x}z.push(a)
 this.b.push(null)
-return y},
+return y},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 YL:{
-"^":"Tp:137;c",
-$1:function(a){var z=this.c
+"^":"Tp:363;c",
+$1:[function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
-return z[a]},
+return z[a]},"$1",null,2,0,null,334,[],"call"],
 $isEH:true},
 KC:{
-"^":"Tp:201;d",
-$2:function(a,b){var z=this.d
+"^":"Tp:434;d",
+$2:[function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
-z[a]=b},
+z[a]=b},"$2",null,4,0,null,334,[],28,[],"call"],
 $isEH:true},
 xL:{
-"^":"Tp:16;e,f,UI,bK",
-$1:function(a){var z,y,x,w,v,u,t
+"^":"Tp:116;e,f,UI,bK",
+$1:[function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
 if(typeof a==="number")return a
@@ -10480,11 +10509,11 @@
 u=J.w1(y)
 t=0
 for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
-return y}return a},
+return y}return a},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
-la:{
+qS:{
 "^":"a;Rn>,fg>,R>",
-$isla:true,
+$isqS:true,
 $isSg:true},
 As:{
 "^":"a;",
@@ -10503,11 +10532,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.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,202],
+return H.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,435,128,[]],
 ev:function(a,b){var z=this.lF()
 return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},
 Ft:[function(a,b){var z=this.lF()
-return H.VM(new H.kV(z,b),[H.ip(z,"mW",0),null])},"$1","git",2,0,203],
+return H.VM(new H.kV(z,b),[H.ip(z,"mW",0),null])},"$1","git",2,0,436,128,[]],
 Vr:function(a,b){return this.lF().Vr(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
@@ -10536,21 +10565,21 @@
 this.p5(z)
 return y},
 $isz5:true,
-$asz5:function(){return[P.qU]},
+$asz5:function(){return[J.O]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.qU]}},
+$asQV:function(){return[J.O]}},
 GE:{
-"^":"Tp:16;a",
-$1:function(a){return a.h(0,this.a)},
+"^":"Tp:116;a",
+$1:[function(a){return a.h(0,this.a)},"$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 rl:{
-"^":"Tp:16;a",
-$1:function(a){return a.FV(0,this.a)},
+"^":"Tp:116;a",
+$1:[function(a){return a.FV(0,this.a)},"$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 uQ:{
-"^":"Tp:16;",
-$1:function(a){return a.V1(0)},
+"^":"Tp:116;",
+$1:[function(a){return a.V1(0)},"$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 D7:{
 "^":"ar;ndS,h2",
@@ -10590,36 +10619,36 @@
 gA:function(a){var z=this.gzT()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
-"^":"Tp:16;",
-$1:function(a){return!!J.x(a).$iscv},
+"^":"Tp:116;",
+$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 GS:{
-"^":"Tp:16;",
-$1:function(a){return J.QC(a)},
+"^":"Tp:116;",
+$1:[function(a){return J.QC(a)},"$1",null,2,0,null,295,[],"call"],
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
 pR:{
-"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gD5:[function(a){var z=a.tY
 if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
 else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
 else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,87,"hoverText"],
-Qx:[function(a){return this.gus(a)},"$0","gyX",0,0,22,"expander"],
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,312,"hoverText"],
+Qx:[function(a){return this.gus(a)},"$0","gyX",0,0,115,"expander"],
 vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,204,205,[],106,[],"expandEvent"],
+c.$0()}},"$2","gus",4,0,437,438,[],339,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{lu:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -10628,32 +10657,32 @@
 a.X0=w
 C.cp.ZL(a)
 C.cp.oX(a)
-return a},null,null,0,0,22,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[110],
+return a},null,null,0,0,115,"new InstanceRefElement$created"]}},
+"+InstanceRefElement":[342],
 Js:{
-"^":"Tp:16;a-29",
+"^":"Tp:116;a-85",
 $1:[function(a){var z,y
 z=J.U6(a)
 if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
 a.szz(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
-y.ct(z,C.kY,0,1)},"$1",null,2,0,16,168,[],"call"],
+y.ct(z,C.kY,0,1)},"$1",null,2,0,116,57,[],"call"],
 $isEH:true},
-"+ Js":[124]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[315]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["V9;Xh%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gQr:[function(a){return a.Xh},null,null,1,0,103,"instance",82,104],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,105,27,[],"instance",82],
-vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
-Xe:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,111,113,[],"retainedSize"],
-pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
-"@":function(){return[C.be]},
+"^":["V9;Xh%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gQr:[function(a){return a.Xh},null,null,1,0,337,"instance",308,311],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,338,30,[],"instance",308],
+vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
+Xe:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,343,344,[],"retainedSize"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
+"@":function(){return[C.qlk]},
 static:{Co:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -10661,15 +10690,15 @@
 a.X0=w
 C.pU.ZL(a)
 C.pU.oX(a)
-return a},null,null,0,0,22,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[206],
+return a},null,null,0,0,115,"new InstanceViewElement$created"]}},
+"+InstanceViewElement":[439],
 V9:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 Se:{
-"^":["Y2;B1>,SF<-207,H<-207,Zn@-125,vs@-125,ki@-125,Vh@-125,LH@-125,eT,yt-93,wd-94,oH-95,R7,aZ,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
-gtT:[function(a){return J.on(this.H)},null,null,1,0,115,"code",82],
+"^":["Y2;B1>,SF<-440,H<-440,Zn@-305,vs@-305,ki@-305,Vh@-305,LH@-305,eT,yt-326,wd-327,oH-328,R7,aZ,cp,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
+gtT:[function(a){return J.on(this.H)},null,null,1,0,346,"code",308],
 C4:function(a){var z,y,x,w,v,u,t,s,r
 z=this.B1
 y=J.UQ(z,"threshold")
@@ -10707,25 +10736,25 @@
 z.mW(a,b,c,d)
 return z}}},
 E7:{
-"^":["V10;pD%-101,zt%-109,eH%-125,NT%-125,Xv%-125,M5%-125,ik%-125,jS%-125,XX%-208,BJ%-125,qO=-29,Hm%-209,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.pD},null,null,1,0,103,"profile",82,104],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,105,27,[],"profile",82],
-gPL:[function(a){return a.zt},null,null,1,0,126,"hideTagsChecked",82,83],
-sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,127,27,[],"hideTagsChecked",82],
-gEW:[function(a){return a.eH},null,null,1,0,87,"sampleCount",82,83],
-sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,8,27,[],"sampleCount",82],
-gUo:[function(a){return a.NT},null,null,1,0,87,"refreshTime",82,83],
-sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,8,27,[],"refreshTime",82],
-gEly:[function(a){return a.Xv},null,null,1,0,87,"sampleRate",82,83],
-sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,8,27,[],"sampleRate",82],
-gIZ:[function(a){return a.M5},null,null,1,0,87,"sampleDepth",82,83],
-sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,8,27,[],"sampleDepth",82],
-gNG:[function(a){return a.ik},null,null,1,0,87,"displayCutoff",82,83],
-sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,8,27,[],"displayCutoff",82],
-gQl:[function(a){return a.jS},null,null,1,0,87,"timeSpan",82,83],
-sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,8,27,[],"timeSpan",82],
-gib:[function(a){return a.BJ},null,null,1,0,87,"tagSelector",82,83],
-sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,8,27,[],"tagSelector",82],
+"^":["V10;pD%-336,zt%-304,eH%-305,NT%-305,Xv%-305,M5%-305,ik%-305,jS%-305,XX%-441,BJ%-305,qO=-85,Hm%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,337,"profile",308,311],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,338,30,[],"profile",308],
+gPL:[function(a){return a.zt},null,null,1,0,307,"hideTagsChecked",308,309],
+sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,310,30,[],"hideTagsChecked",308],
+gEW:[function(a){return a.eH},null,null,1,0,312,"sampleCount",308,309],
+sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,32,30,[],"sampleCount",308],
+gUo:[function(a){return a.NT},null,null,1,0,312,"refreshTime",308,309],
+sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,32,30,[],"refreshTime",308],
+gEly:[function(a){return a.Xv},null,null,1,0,312,"sampleRate",308,309],
+sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",308],
+gIZ:[function(a){return a.M5},null,null,1,0,312,"sampleDepth",308,309],
+sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",308],
+gNG:[function(a){return a.ik},null,null,1,0,312,"displayCutoff",308,309],
+sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",308],
+gQl:[function(a){return a.jS},null,null,1,0,312,"timeSpan",308,309],
+sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,32,30,[],"timeSpan",308],
+gib:[function(a){return a.BJ},null,null,1,0,312,"tagSelector",308,309],
+sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,32,30,[],"tagSelector",308],
 pM:[function(a,b){var z,y,x,w
 z=a.pD
 if(z==null)return
@@ -10748,27 +10777,27 @@
 a.ik=this.ct(a,C.aH,a.ik,z)
 J.QP(a.pD).N3(a.pD)
 J.kW(a.pD,"threshold",a.XX)
-this.Cx(a)},"$1","gwm",2,0,26,65,[],"profileChanged"],
+this.Cx(a)},"$1","gwm",2,0,169,242,[],"profileChanged"],
 i4:[function(a){var z=R.Jk([])
 a.Hm=new G.XN(z,null,null)
-this.Cx(a)},"$0","gQd",0,0,21,"enteredView"],
-m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,26,65,[],"tagSelectorChanged"],
+this.Cx(a)},"$0","gQd",0,0,126,"enteredView"],
+m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,169,242,[],"tagSelectorChanged"],
 pA:[function(a,b){var z="profile?tags="+H.d(a.BJ)
-J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 Cx:[function(a){if(a.pD==null)return
-this.EX(a)},"$0","gBn",0,0,21,"_update"],
+this.EX(a)},"$0","gBn",0,0,126,"_update"],
 EX:[function(a){var z,y,x,w,v
 z=J.QP(a.pD).gBC()
 if(z==null)return
 try{a.Hm.rT(X.SJ(a.pD,z,z,null))}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,21,"_buildStackTree"],
-ba:[function(a){this.EX(a)},"$0","gvr",0,0,21,"_buildTree"],
-ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,210,98,[],"padding",83],
+N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,126,"_buildStackTree"],
+ba:[function(a){this.EX(a)},"$0","gvr",0,0,126,"_buildTree"],
+ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,443,331,[],"padding",309],
 ZZ:[function(a,b){var z=J.bY(J.xH(b.gyt(),1),9)
 if(z>>>0!==z||z>=9)return H.e(C.Ym,z)
-return C.Ym[z]},"$1","gth",2,0,210,98,[],"coloring",83],
+return C.Ym[z]},"$1","gth",2,0,443,331,[],"coloring",309],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.de(J.F8(w.gN(b)),"expand")&&!J.de(w.gN(b),d))return
@@ -10779,12 +10808,12 @@
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
-N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,195,7,[],121,[],119,[],"toggleExpanded",83],
+N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,428,21,[],351,[],82,[],"toggleExpanded",309],
 "@":function(){return[C.jR]},
-static:{"^":"B6<-29",jD:[function(a){var z,y,x,w
+static:{"^":"B6<-85",jD:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.eH=""
@@ -10801,27 +10830,27 @@
 a.X0=w
 C.kS.ZL(a)
 C.kS.oX(a)
-return a},null,null,0,0,22,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[211],
+return a},null,null,0,0,115,"new IsolateProfileElement$created"]}},
+"+IsolateProfileElement":[444],
 V10:{
 "^":"uL+Pi;",
 $isd3:true},
 SV:{
-"^":"Tp:105;a-29",
+"^":"Tp:338;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,105,212,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,338,202,[],"call"],
 $isEH:true},
-"+ SV":[124]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+"+ SV":[315]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oO:{
-"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.j6]},
 static:{Zgg:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -10830,18 +10859,18 @@
 a.X0=w
 C.LN.ZL(a)
 C.LN.oX(a)
-return a},null,null,0,0,22,"new IsolateRefElement$created"]}},
-"+IsolateRefElement":[110]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+return a},null,null,0,0,115,"new IsolateRefElement$created"]}},
+"+IsolateRefElement":[342]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
 Stq:{
-"^":["V11;Pw%-213,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,81,"isolate",82,104],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,84,27,[],"isolate",82],
+"^":["V11;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
 "@":function(){return[C.aM]},
 static:{N5:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -10849,14 +10878,136 @@
 a.X0=w
 C.Qt.ZL(a)
 C.Qt.oX(a)
-return a},null,null,0,0,22,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[214],
+return a},null,null,0,0,115,"new IsolateSummaryElement$created"]}},
+"+IsolateSummaryElement":[446],
 V11:{
 "^":"uL+Pi;",
+$isd3:true},
+IWF:{
+"^":["V12;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
+TJ:[function(a,b){return a.Pw.cv("debug/pause").ml(new D.GG(a))},"$1","gAK",2,0,447,117,[],"pause"],
+nY:[function(a,b){return a.Pw.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,447,117,[],"resume"],
+"@":function(){return[C.Xuf]},
+static:{dm:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.F2.ZL(a)
+C.F2.oX(a)
+return a},null,null,0,0,115,"new IsolateRunStateElement$created"]}},
+"+IsolateRunStateElement":[448],
+V12:{
+"^":"uL+Pi;",
+$isd3:true},
+GG:{
+"^":"Tp:116;a-85",
+$1:[function(a){return J.am(J.qz(this.a))},"$1",null,2,0,116,57,[],"call"],
+$isEH:true},
+"+ GG":[315],
+r8:{
+"^":"Tp:116;a-85",
+$1:[function(a){return J.am(J.qz(this.a))},"$1",null,2,0,116,57,[],"call"],
+$isEH:true},
+"+ r8":[315],
+Yj:{
+"^":["V13;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
+"@":function(){return[C.Ux]},
+static:{b2:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.rC.ZL(a)
+C.rC.oX(a)
+return a},null,null,0,0,115,"new IsolateLocationElement$created"]}},
+"+IsolateLocationElement":[449],
+V13:{
+"^":"uL+Pi;",
+$isd3:true},
+Oz:{
+"^":["V14;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
+"@":function(){return[C.Po]},
+static:{RP:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.kd.ZL(a)
+C.kd.oX(a)
+return a},null,null,0,0,115,"new IsolateSharedSummaryElement$created"]}},
+"+IsolateSharedSummaryElement":[450],
+V14:{
+"^":"uL+Pi;",
+$isd3:true},
+vT:{
+"^":"a;z3,Nt",
+eC:function(a){var z,y,x,w,v,u
+z=this.z3.Yb
+if(J.de(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Name"])
+z.V7("addColumn",["number","Value"])}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
+for(y=J.GP(a.gvc()),x=J.U6(a);y.G();){w=y.gl()
+v=J.uH(x.t(a,w),"%")
+if(0>=v.length)return H.e(v,0)
+u=[]
+C.Nm.FV(u,C.Nm.ez([w,H.IH(v[0],null)],P.En()))
+u=new P.Tz(u)
+u.$builtinTypeInfo=[null]
+z.V7("addRow",[u])}},
+W2:function(a){var z=this.Nt
+if(z==null){z=new G.qu(null,P.L5(null,null,null,null,null))
+z.vR=P.zV(J.UQ($.NR,"PieChart"),[a])
+this.Nt=z}z.W2(this.z3)}},
+YA:{
+"^":["V15;E1%-451,iF%-452,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ghw:[function(a){return a.E1},null,null,1,0,453,"counters",308,311],
+shw:[function(a,b){a.E1=this.ct(a,C.MR,a.E1,b)},null,null,3,0,454,30,[],"counters",308],
+ak:[function(a,b){var z,y
+z=a.E1
+if(z==null)return
+a.iF.eC(z)
+y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#counterPieChart")
+if(y!=null)a.iF.W2(y)},"$1","gAB",2,0,169,242,[],"countersChanged"],
+"@":function(){return[C.Bd]},
+static:{BP:[function(a){var z,y,x,w,v
+z=P.zV(J.UQ($.NR,"DataTable"),null)
+y=$.Nd()
+x=P.Py(null,null,null,J.O,W.I0)
+w=J.O
+v=W.cv
+v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
+a.iF=new D.vT(new G.ig(z),null)
+a.SO=y
+a.B7=x
+a.X0=v
+C.wQ.ZL(a)
+C.wQ.oX(a)
+return a},null,null,0,0,115,"new IsolateCounterChartElement$created"]}},
+"+IsolateCounterChartElement":[455],
+V15:{
+"^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
 Lr:{
-"^":"a;hO,YT",
+"^":"a;hO,Pl",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
 z=this.hO.Yb
 if(J.de(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
@@ -10895,36 +11046,37 @@
 y.$builtinTypeInfo=[null]
 z.V7("addRow",[y])}},
 W2:function(a){var z,y
-if(this.YT==null){z=P.L5(null,null,null,null,null)
+if(this.Pl==null){z=P.L5(null,null,null,null,null)
 y=new G.qu(null,z)
 y.vR=P.zV(J.UQ($.NR,"SteppedAreaChart"),[a])
-this.YT=y
+this.Pl=y
 z.u(0,"isStacked",!0)
-this.YT.bG.u(0,"connectSteps",!1)
-this.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.YT.W2(this.hO)}},
+this.Pl.bG.u(0,"connectSteps",!1)
+this.Pl.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.Pl.W2(this.hO)}},
 qkb:{
-"^":["V12;oY%-213,ts%-215,e6%-216,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.oY},null,null,1,0,81,"isolate",82,104],
-sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,84,27,[],"isolate",82],
+"^":["V16;oY%-445,ts%-456,e6%-457,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.oY},null,null,1,0,318,"isolate",308,311],
+sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,319,30,[],"isolate",308],
 vV:[function(a,b){var z=a.oY
-return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
-Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,21,"_updateTagProfile"],
+return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
+Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,126,"_updateTagProfile"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,21,"enteredView"],
+a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,126,"enteredView"],
 xo:[function(a){var z
 Z.uL.prototype.xo.call(this,a)
 z=a.ts
-if(z!=null)z.ed()},"$0","gbt",0,0,21,"leftView"],
+if(z!=null)z.ed()},"$0","gbt",0,0,126,"leftView"],
 Ob:[function(a){var z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#tagProfileChart")
-if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,21,"_drawTagProfileChart"],
-pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
-xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"$3","gDQ",6,0,130,53,[],57,[],123,[],"resume"],
+if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,126,"_drawTagProfileChart"],
+pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
+TJ:[function(a,b){return a.oY.cv("debug/pause").ml(new L.CV(a))},"$1","gAK",2,0,447,117,[],"pause"],
+nY:[function(a,b){return a.oY.cv("resume").ml(new L.IT(a))},"$1","gDQ",2,0,447,117,[],"resume"],
 "@":function(){return[C.NG]},
 static:{uD:[function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.NR,"DataTable"),null)
 y=$.Nd()
-x=P.Py(null,null,null,P.qU,W.I0)
-w=P.qU
+x=P.Py(null,null,null,J.O,W.I0)
+w=J.O
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
 a.e6=new L.Lr(new G.ig(z),null)
@@ -10933,27 +11085,32 @@
 a.X0=v
 C.Xe.ZL(a)
 C.Xe.oX(a)
-return a},null,null,0,0,22,"new IsolateViewElement$created"]}},
-"+IsolateViewElement":[217],
-V12:{
+return a},null,null,0,0,115,"new IsolateViewElement$created"]}},
+"+IsolateViewElement":[458],
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 BQ:{
-"^":"Tp:16;a-29",
+"^":"Tp:116;a-85",
 $1:[function(a){var z,y,x
 z=this.a
 y=J.RE(z)
 y.ge6(z).eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
 if(x!=null)y.ge6(z).W2(x)
-y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,16,218,[],"call"],
+y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,116,459,[],"call"],
 $isEH:true},
-"+ BQ":[124],
+"+ BQ":[315],
+CV:{
+"^":"Tp:116;a-85",
+$1:[function(a){return J.am(J.Ag(this.a))},"$1",null,2,0,116,57,[],"call"],
+$isEH:true},
+"+ CV":[315],
 IT:{
-"^":"Tp:16;a-29",
-$1:[function(a){J.am(J.Ag(this.a))},"$1",null,2,0,16,168,[],"call"],
+"^":"Tp:116;a-85",
+$1:[function(a){return J.am(J.Ag(this.a))},"$1",null,2,0,116,57,[],"call"],
 $isEH:true},
-"+ IT":[124]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+"+ IT":[315]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 fM:{
 "^":"a;Fv,lp",
@@ -10972,7 +11129,7 @@
 x.vM+=q
 this.KN(t,v)
 q=x.vM+=s?r:H.d(r)
-x.vM=q+"}\n"}else if(!!s.$iszM){if(typeof "  "!=="number")return H.s("  ")
+x.vM=q+"}\n"}else if(!!s.$isList){if(typeof "  "!=="number")return H.s("  ")
 r=b*"  "
 s=typeof r==="string"
 x.vM+=s?r:H.d(r)
@@ -10999,7 +11156,7 @@
 x.vM=s+"{\n"
 this.KN(v,w)
 s=x.vM+=u?t:H.d(t)
-x.vM=s+"}\n"}else if(!!u.$iszM){if(typeof "  "!=="number")return H.s("  ")
+x.vM=s+"}\n"}else if(!!u.$isList){if(typeof "  "!=="number")return H.s("  ")
 t=b*"  "
 u=typeof t==="string"
 s=x.vM+=u?t:H.d(t)
@@ -11012,12 +11169,12 @@
 u=x.vM+=typeof v==="string"?v:H.d(v)
 x.vM=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":["V13;OZ%-101,X7%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gIr:[function(a){return a.OZ},null,null,1,0,103,"map",82,104],
+"^":["V17;OZ%-336,X7%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gIr:[function(a){return a.OZ},null,null,1,0,337,"map",308,311],
 ez:function(a,b){return this.gIr(a).$1(b)},
-sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,105,27,[],"map",82],
-gdQ:[function(a){return a.X7},null,null,1,0,87,"mapAsString",82,83],
-sdQ:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,8,27,[],"mapAsString",82],
+sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,338,30,[],"map",308],
+gxU:[function(a){return a.X7},null,null,1,0,312,"mapAsString",308,309],
+sxU:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,32,30,[],"mapAsString",308],
 oC:[function(a,b){var z,y,x
 z=P.p9("")
 y=P.Ls(null,null,null,null)
@@ -11027,12 +11184,12 @@
 new Z.fM(z,y).KN(x,0)
 z.KF("}\n")
 z=z.vM
-a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,26,65,[],"mapChanged"],
+a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,169,242,[],"mapChanged"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -11040,19 +11197,19 @@
 a.X0=w
 C.Yt.ZL(a)
 C.Yt.oX(a)
-return a},null,null,0,0,22,"new JsonViewElement$created"]}},
-"+JsonViewElement":[219],
-V13:{
+return a},null,null,0,0,115,"new JsonViewElement$created"]}},
+"+JsonViewElement":[460],
+V17:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.uy]},
 static:{rA:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -11061,20 +11218,20 @@
 a.X0=w
 C.Z3.ZL(a)
 C.Z3.oX(a)
-return a},null,null,0,0,22,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[110]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+return a},null,null,0,0,115,"new LibraryRefElement$created"]}},
+"+LibraryRefElement":[342]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 KL:{
-"^":["V14;a1%-220,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.a1},null,null,1,0,221,"library",82,104],
-stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,222,27,[],"library",82],
-vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,111,112,[],"eval"],
-pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"^":["V18;a1%-461,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.a1},null,null,1,0,462,"library",308,311],
+stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,463,30,[],"library",308],
+vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
+pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 "@":function(){return[C.Oyb]},
 static:{Ro:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -11082,9 +11239,9 @@
 a.X0=w
 C.MG.ZL(a)
 C.MG.oX(a)
-return a},null,null,0,0,22,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[223],
-V14:{
+return a},null,null,0,0,115,"new LibraryViewElement$created"]}},
+"+LibraryViewElement":[464],
+V18:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
@@ -11136,17 +11293,17 @@
 $isTJ:true,
 static:{"^":"DY",Jx:function(a){return $.U0().to(a,new N.dG(a))}}},
 dG:{
-"^":"Tp:22;a",
-$0:function(){var z,y,x,w,v
+"^":"Tp:115;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 '.'"))
 y=C.xB.cn(z,".")
 if(y===-1)x=z!==""?N.Jx(""):null
 else{x=N.Jx(C.xB.Nj(z,0,y))
-z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.TJ)
+z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,J.O,N.TJ)
 v=new N.TJ(z,x,null,w,H.VM(new Q.Gj(w),[null,null]),null)
 v.QL(z,x,w)
-return v},
+return v},"$0",null,0,0,null,"call"],
 $isEH:true},
 qV:{
 "^":"a;oc>,P>",
@@ -11170,41 +11327,41 @@
 giO:function(a){return this.P},
 bu:function(a){return this.oc},
 $isqV:true,
-static:{"^":"K9,tmj,EL,LkO,reI,pd,EN,MHK,ow,lM,B9"}},
+static:{"^":"K9,tmj,EL,LkO,reI,pd,dc,MHK,ow,lM,B9"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
 bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
 $isHV:true,
-static:{"^":"xO"}}}],["","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
+static:{"^":"xO"}}}],["","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
 "^":"",
-E2:function(){N.Jx("").sOR(C.IF)
+E2:[function(){N.Jx("").sOR(C.IF)
 N.Jx("").gSZ().yI(new F.em())
 N.Jx("").To("Starting Observatory")
 var z=H.VM(new P.Zf(P.Dt(null)),[null])
 N.Jx("").To("Loading Google Charts API")
 J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],null,null))])
-z.MM.ml(G.vN()).ml(new F.Lb())},
+z.MM.ml(G.vN()).ml(new F.Lb())},"$0","qg",0,0,null],
 em:{
-"^":"Tp:225;",
+"^":"Tp:466;",
 $1:[function(a){var z
 if(J.de(a.gOR(),C.nT)){z=J.RE(a)
 if(J.co(z.gG1(a),"Error evaluating expression"))z=J.kE(z.gG1(a),"Can't assign to null: ")===!0||J.kE(z.gG1(a),"Expression is not assignable: ")===!0
 else z=!1}else z=!1
 if(z)return
-P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,224,[],"call"],
+P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,465,[],"call"],
 $isEH:true},
 Lb:{
-"^":"Tp:16;",
+"^":"Tp:116;",
 $1:[function(a){N.Jx("").To("Initializing Polymer")
-A.Ok()},"$1",null,2,0,null,17,[],"call"],
-$isEH:true}}],["metadata","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
+A.Ok()},"$1",null,2,0,null,117,[],"call"],
+$isEH:true}}],["metadata","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
 jh:{
 "^":"a;T9,Ym",
-static:{"^":"LB,en,pjg,nq,xa"}},
-WO:{
+static:{"^":"LB,ziq,pjg,nq,xa"}},
+tzK:{
 "^":"a;"},
-jA:{
+bW:{
 "^":"a;oc>"},
 PO:{
 "^":"a;"},
@@ -11212,14 +11369,14 @@
 "^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 F1:{
-"^":["V15;Mz%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gqW:[function(a){return a.Mz},null,null,1,0,126,"pad",82,104],
-sqW:[function(a,b){a.Mz=this.ct(a,C.ZU,a.Mz,b)},null,null,3,0,127,27,[],"pad",82],
+"^":["V19;Mz%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gqW:[function(a){return a.Mz},null,null,1,0,307,"pad",308,311],
+sqW:[function(a,b){a.Mz=this.ct(a,C.ZU,a.Mz,b)},null,null,3,0,310,30,[],"pad",308],
 "@":function(){return[C.nW]},
 static:{aD:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Mz=!0
@@ -11228,24 +11385,24 @@
 a.X0=w
 C.kD.ZL(a)
 C.kD.oX(a)
-return a},null,null,0,0,22,"new NavBarElement$created"]}},
-"+NavBarElement":[226],
-V15:{
+return a},null,null,0,0,115,"new NavBarElement$created"]}},
+"+NavBarElement":[467],
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
 aQ:{
-"^":["V16;KU%-125,V4%-125,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,87,"link",82,104],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,8,27,[],"link",82],
-gdU:[function(a){return a.V4},null,null,1,0,87,"anchor",82,104],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,8,27,[],"anchor",82],
-grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
+"^":["V20;KU%-305,V4%-305,Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,312,"link",308,311],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",308],
+gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",308,311],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",308],
+grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
 "@":function(){return[C.u7]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.KU="#"
@@ -11256,22 +11413,22 @@
 a.X0=w
 C.SU.ZL(a)
 C.SU.oX(a)
-return a},null,null,0,0,22,"new NavMenuElement$created"]}},
-"+NavMenuElement":[227],
-V16:{
+return a},null,null,0,0,115,"new NavMenuElement$created"]}},
+"+NavMenuElement":[468],
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
 Qa:{
-"^":["V17;KU%-125,V4%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,87,"link",82,104],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,8,27,[],"link",82],
-gdU:[function(a){return a.V4},null,null,1,0,87,"anchor",82,104],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,8,27,[],"anchor",82],
+"^":["V21;KU%-305,V4%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,312,"link",308,311],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",308],
+gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",308,311],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",308],
 "@":function(){return[C.qT]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.KU="#"
@@ -11281,31 +11438,31 @@
 a.X0=w
 C.nn.ZL(a)
 C.nn.oX(a)
-return a},null,null,0,0,22,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[228],
-V17:{
+return a},null,null,0,0,115,"new NavMenuItemElement$created"]}},
+"+NavMenuItemElement":[469],
+V21:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":["V18;rU%-29,SB%-109,Hq%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFR:[function(a){return a.rU},null,null,1,0,22,"callback",82,104],
+"^":["V22;rU%-85,SB%-304,Hq%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFR:[function(a){return a.rU},null,null,1,0,115,"callback",308,311],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,16,27,[],"callback",82],
-gxw:[function(a){return a.SB},null,null,1,0,126,"active",82,104],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,127,27,[],"active",82],
-gph:[function(a){return a.Hq},null,null,1,0,87,"label",82,104],
-sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,8,27,[],"label",82],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,116,30,[],"callback",308],
+gxw:[function(a){return a.SB},null,null,1,0,307,"active",308,311],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,310,30,[],"active",308],
+gph:[function(a){return a.Hq},null,null,1,0,312,"label",308,311],
+sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,32,30,[],"label",308],
 Ty:[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.gCB(a))},"$3","gyr",6,0,120,7,[],121,[],119,[],"buttonClick"],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,21,"refreshDone"],
+if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,350,21,[],351,[],82,[],"buttonClick"],
+ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,126,"refreshDone"],
 "@":function(){return[C.XG]},
 static:{zN:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SB=!1
@@ -11315,20 +11472,20 @@
 a.X0=w
 C.J7.ZL(a)
 C.J7.oX(a)
-return a},null,null,0,0,22,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[229],
-V18:{
+return a},null,null,0,0,115,"new NavRefreshElement$created"]}},
+"+NavRefreshElement":[470],
+V22:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["V19;Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
-"@":function(){return[C.hr]},
+"^":["V23;Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
+"@":function(){return[C.NT]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11337,27 +11494,27 @@
 a.X0=w
 C.lx.ZL(a)
 C.lx.oX(a)
-return a},null,null,0,0,22,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[230],
-V19:{
+return a},null,null,0,0,115,"new TopNavMenuElement$created"]}},
+"+TopNavMenuElement":[471],
+V23:{
 "^":"uL+Pi;",
 $isd3:true},
 Mv:{
-"^":["V20;Jo%-109,iy%-213,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
-gF1:[function(a){return a.iy},null,null,1,0,81,"isolate",82,104],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,84,27,[],"isolate",82],
-vD:[function(a,b){this.ct(a,C.Ia,0,1)},"$1","gQ1",2,0,26,65,[],"isolateChanged"],
+"^":["V24;Jo%-304,iy%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
+gF1:[function(a){return a.iy},null,null,1,0,318,"isolate",308,311],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,319,30,[],"isolate",308],
+vD:[function(a,b){this.ct(a,C.Ia,0,1)},"$1","gQ1",2,0,169,242,[],"isolateChanged"],
 gu6:[function(a){var z=a.iy
 if(z!=null)return z.gHP()
-else return""},null,null,1,0,87,"hashLinkWorkaround",82],
-su6:[function(a,b){},null,null,3,0,16,231,[],"hashLinkWorkaround",82],
-"@":function(){return[C.oD]},
+else return""},null,null,1,0,312,"hashLinkWorkaround",308],
+su6:[function(a,b){},null,null,3,0,116,28,[],"hashLinkWorkaround",308],
+"@":function(){return[C.zaS]},
 static:{Du:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11366,22 +11523,22 @@
 a.X0=w
 C.RR.ZL(a)
 C.RR.oX(a)
-return a},null,null,0,0,22,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[232],
-V20:{
+return a},null,null,0,0,115,"new IsolateNavMenuElement$created"]}},
+"+IsolateNavMenuElement":[472],
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
-Zt:{
-"^":["V21;Ap%-220,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.Ap},null,null,1,0,221,"library",82,104],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,222,27,[],"library",82],
-grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
+oM:{
+"^":["V25;Ap%-461,Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.Ap},null,null,1,0,462,"library",308,311],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,463,30,[],"library",308],
+grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
 "@":function(){return[C.KI]},
 static:{IV:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11390,22 +11547,22 @@
 a.X0=w
 C.ct.ZL(a)
 C.ct.oX(a)
-return a},null,null,0,0,22,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[233],
-V21:{
+return a},null,null,0,0,115,"new LibraryNavMenuElement$created"]}},
+"+LibraryNavMenuElement":[473],
+V25:{
 "^":"uL+Pi;",
 $isd3:true},
 iL:{
-"^":["V22;Au%-101,Jo%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Au},null,null,1,0,103,"cls",82,104],
-sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,105,27,[],"cls",82],
-grZ:[function(a){return a.Jo},null,null,1,0,126,"last",82,104],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,127,27,[],"last",82],
-"@":function(){return[C.iF]},
+"^":["V26;Au%-336,Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Au},null,null,1,0,337,"cls",308,311],
+sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,338,30,[],"cls",308],
+grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
+"@":function(){return[C.qJ]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
@@ -11414,35 +11571,35 @@
 a.X0=w
 C.ae.ZL(a)
 C.ae.oX(a)
-return a},null,null,0,0,22,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[234],
-V22:{
+return a},null,null,0,0,115,"new ClassNavMenuElement$created"]}},
+"+ClassNavMenuElement":[474],
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 F1i:{
-"^":["V23;k5%-109,Oe%-235,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzj:[function(a){return a.k5},null,null,1,0,126,"devtools",82,104],
-szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,127,27,[],"devtools",82],
-guw:[function(a){return a.Oe},null,null,1,0,236,"app",82,83],
-suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,237,27,[],"app",82],
+"^":["V27;k5%-304,Oe%-475,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,307,"devtools",308,311],
+szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,310,30,[],"devtools",308],
+guw:[function(a){return a.Oe},null,null,1,0,476,"app",308,309],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,477,30,[],"app",308],
 ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,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)
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.PI()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.hq()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,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)
+a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.SC()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.US()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,22,"created"],
+a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,115,"created"],
 "@":function(){return[C.kR]},
 static:{fv:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.k5=!1
@@ -11452,43 +11609,43 @@
 C.k0.ZL(a)
 C.k0.oX(a)
 C.k0.ZB(a)
-return a},null,null,0,0,22,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[238],
-V23:{
+return a},null,null,0,0,115,"new ObservatoryApplicationElement$created"]}},
+"+ObservatoryApplicationElement":[478],
+V27:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,21,"enteredView"],
-xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,21,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,239,64,[],65,[],66,[],"attributeChanged"],
-b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,240,241,[],"formatTimePrecise"],
-nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,240,241,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,240,231,[],"formatSeconds"],
-Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,18,19,[],"formatSize"],
+"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,126,"enteredView"],
+xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,126,"leftView"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,479,12,[],242,[],243,[],"attributeChanged"],
+b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,480,123,[],"formatTimePrecise"],
+nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,480,123,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,480,28,[],"formatSeconds"],
+Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,121,124,[],"formatSize"],
 at:[function(a,b){var z,y,x
 z=J.U6(b)
 y=J.UQ(z.t(b,"script"),"user_name")
 x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","guT",2,0,242,243,[],"fileAndLine"],
-b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,244,245,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,244,245,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","guT",2,0,481,482,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,483,11,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,483,11,[],"isError"],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,244,245,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,244,245,[],"isBool"],
-ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,244,245,[],"isString"],
-rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,244,245,[],"isInstance"],
-JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,244,245,[],"isDouble"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,483,11,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,483,11,[],"isBool"],
+ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,483,11,[],"isString"],
+rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,483,11,[],"isInstance"],
+JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,483,11,[],"isDouble"],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,244,245,[],"isList"],
-tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,244,245,[],"isType"],
-AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,244,245,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,483,11,[],"isList"],
+tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,483,11,[],"isType"],
+AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,483,11,[],"isUnexpected"],
 "@":function(){return[C.Br]},
 static:{Hx:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -11496,8 +11653,8 @@
 a.X0=w
 C.Pf.ZL(a)
 C.Pf.oX(a)
-return a},null,null,0,0,22,"new ObservatoryElement$created"]}},
-"+ObservatoryElement":[246]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+return a},null,null,0,0,115,"new ObservatoryElement$created"]}},
+"+ObservatoryElement":[484]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -11506,8 +11663,8 @@
 z=P.bK(this.gl1(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"$0","gqw",0,0,21],
-ni:[function(a){a.AP=null},"$0","gl1",0,0,21],
+k0:[function(a){},"$0","gqw",0,0,126],
+ni:[function(a){a.AP=null},"$0","gl1",0,0,126],
 BN:[function(a){var z,y,x
 z=a.fn
 a.fn=null
@@ -11515,7 +11672,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,126],
+return!0}return!1},"$0","gDx",0,0,307],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -11539,27 +11696,27 @@
 "^":"Pi;b9,kK,Sv,rk,YX,B6,AP,fn",
 kb:function(a){return this.rk.$1(a)},
 gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,22,"value",82],
+gP:[function(a){return this.Sv},null,null,1,0,115,"value",308],
 wE:function(a){var z,y,x,w,v
 if(this.YX)return
 this.YX=!0
 z=this.geu()
 for(y=this.b9,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=this.kK;y.G();){w=J.xq(y.lo).w4(!1)
 v=w.Lj
-w.dB=v.cR(z)
+w.pN=v.cR(z)
 w.o7=P.VH(P.AY(),v)
 w.Bd=v.Al(P.v3())
 x.push(w)}this.Ow()},
 TF:[function(a){if(this.B6)return
 this.B6=!0
-P.rb(this.gMc())},"$1","geu",2,0,26,17,[]],
+P.rb(this.gMc())},"$1","geu",2,0,169,117,[]],
 Ow:[function(){var z,y
 this.B6=!1
 z=this.b9
 if(z.length===0)return
 y=H.VM(new H.A8(z,new Y.E5()),[null,null]).br(0)
 if(this.rk!=null)y=this.kb(y)
-this.Sv=F.Wi(this,C.ls,this.Sv,y)},"$0","gMc",0,0,21],
+this.Sv=F.Wi(this,C.ls,this.Sv,y)},"$0","gMc",0,0,126],
 cO:function(a){var z,y
 z=this.b9
 if(z.length===0)return
@@ -11567,15 +11724,15 @@
 C.Nm.sB(z,0)
 C.Nm.sB(this.kK,0)
 this.Sv=null},
-k0:[function(a){return this.wE(0)},"$0","gqw",0,0,22],
-ni:[function(a){return this.cO(0)},"$0","gl1",0,0,22],
+k0:[function(a){return this.wE(0)},"$0","gqw",0,0,115],
+ni:[function(a){return this.cO(0)},"$0","gl1",0,0,115],
 $isJ3:true},
 E5:{
-"^":"Tp:16;",
-$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,69,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,99,[],"call"],
 $isEH:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
-Y3:function(){var z,y,x,w,v,u,t,s,r,q
+Y3:[function(){var z,y,x,w,v,u,t,s,r,q
 if($.Td)return
 if($.tW==null)return
 $.Td=!0
@@ -11597,45 +11754,45 @@
 for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
 q=J.U6(r)
 w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.el=$.tW.length
-$.Td=!1},
-Ht:function(){var z={}
+$.Td=!1},"$0","D6",0,0,null],
+Ht:[function(){var z={}
 z.a=!1
 z=new O.o5(z)
-return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},
+return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"$0","Zq",0,0,null],
 o5:{
-"^":"Tp:247;a",
-$2:function(a,b){var z=this.a
+"^":"Tp:485;a",
+$2:[function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.b5(z))},
+a.RK(b,new O.b5(z))},"$2",null,4,0,null,181,[],166,[],"call"],
 $isEH:true},
 b5:{
-"^":"Tp:22;a",
+"^":"Tp:115;a",
 $0:[function(){this.a.a=!1
 O.Y3()},"$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"Tp:36;b",
+"^":"Tp:182;b",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,33,[],34,[],35,[],37,[],"call"],
+return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
 $isEH:true},
 Zb:{
-"^":"Tp:22;c,d,e,f",
+"^":"Tp:115;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},
 id:{
-"^":"Tp:248;UI",
+"^":"Tp:486;UI",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,33,[],34,[],35,[],37,[],"call"],
+return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
 $isEH:true},
 iV:{
-"^":"Tp:16;bK,Gq,Rm,w3",
+"^":"Tp:116;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,231,[],"call"],
+return this.w3.$1(a)},"$1",null,2,0,null,28,[],"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
-f6:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z=J.WB(J.xH(f,e),1)
 y=J.WB(J.xH(c,b),1)
 if(typeof z!=="number")return H.s(z)
@@ -11670,8 +11827,8 @@
 if(typeof n!=="number")return n.g()
 n=P.J(o+1,n+1)
 if(t>=l)return H.e(m,t)
-m[t]=n}}return x},
-Mw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+m[t]=n}}return x},"$6","cL",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
+Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
 if(0>=z)return H.e(a,0)
@@ -11705,11 +11862,11 @@
 v=p
 y=w}else{u.push(2)
 v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},
-rB:function(a,b,c){var z,y,x
+x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"$1","fZ",2,0,null,260,[]],
+rB:[function(a,b,c){var z,y,x
 for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},
-xU:function(a,b,c){var z,y,x,w,v,u
+return c},"$3","QI",6,0,null,261,[],262,[],263,[]],
+xU:[function(a,b,c){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.gB(a)
 x=J.U6(b)
@@ -11719,8 +11876,8 @@
 u=z.t(a,y)
 w=J.xH(w,1)
 u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},
-jj:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+if(!u)break;++v}return v},"$3","M9",6,0,null,261,[],262,[],263,[]],
+jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.Wx(c)
 y=J.Wx(f)
 x=P.J(z.W(c,b),y.W(f,e))
@@ -11768,8 +11925,8 @@
 y.$builtinTypeInfo=[null]
 s=new G.DA(a,y,t,n,0)}J.wT(s.Il,z.t(d,o));++o
 break}if(s!=null)p.push(s)
-return p},
-m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return p},"$6","mu",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
+m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.RE(b)
 y=z.gWA(b)
 z=z.gvH(b)
@@ -11808,12 +11965,12 @@
 q.jr=J.WB(q.jr,m)
 if(typeof m!=="number")return H.s(m)
 s+=m
-t=!0}else t=!1}if(!t)a.push(u)},
-xl:function(a,b){var z,y
+t=!0}else t=!1}if(!t)a.push(u)},"$2","pE",4,0,null,264,[],29,[]],
+xl:[function(a,b){var z,y
 z=H.VM([],[G.DA])
 for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},
-u2:function(a,b){var z,y,x,w,v,u
+return z},"$2","l0",4,0,null,76,[],265,[]],
+u2:[function(a,b){var z,y,x,w,v,u
 if(b.length===1)return b
 z=[]
 for(y=G.xl(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=a.ao;y.G();){w=y.lo
@@ -11822,7 +11979,7 @@
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
 if(!J.de(v,x[u]))z.push(w)
 continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"$2","W5",4,0,null,76,[],265,[]],
 DA:{
 "^":"a;WA>,ok,Il<,jr,dM",
 gvH:function(a){return this.jr},
@@ -11853,15 +12010,15 @@
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
-Wi:function(a,b,c,d){var z=J.RE(a)
+Wi:[function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},
+return d},"$4","Ha",8,0,null,101,[],266,[],242,[],243,[]],
 d3:{
 "^":"a;",
 $isd3:true},
-X6:{
-"^":"Tp:75;a,b",
-$2:function(a,b){var z,y,x,w,v
+lS:{
+"^":"Tp:300;a,b",
+$2:[function(a,b){var z,y,x,w,v
 z=this.b
 y=z.wv.rN(a).gAx()
 if(!J.de(b,y)){x=this.a
@@ -11870,14 +12027,14 @@
 x.a=v
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
-z.V2.u(0,a,y)}},
+z.V2.u(0,a,y)}},"$2",null,4,0,null,12,[],242,[],"call"],
 $isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
 "^":"",
 xh:{
 "^":"Pi;L1,AP,fn",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",82],
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},66,[],"value",82],
-bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",308],
+sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},243,[],"value",308],
+bu:function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
 "^":"er;b3,xg,ao,AP,fn",
@@ -11885,7 +12042,7 @@
 if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
 this.xg=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.ao.length},null,null,1,0,249,"length",82],
+gB:[function(a){return this.ao.length},null,null,1,0,487,"length",308],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.ao
 y=z.length
@@ -11913,10 +12070,10 @@
 u=[]
 w=new P.Yp(u)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,137,27,[],"length",82],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,363,30,[],"length",308],
 t:[function(a,b){var z=this.ao
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[P.KN]}},this.$receiver,"wn")},73,[],"[]",82],
+return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[J.bU]}},this.$receiver,"wn")},15,[],"[]",308],
 u:[function(a,b,c){var z,y,x,w
 z=this.ao
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -11928,12 +12085,12 @@
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[P.KN,a]}},this.$receiver,"wn")},73,[],27,[],"[]=",82],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,126,"isEmpty",82],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,126,"isNotEmpty",82],
+z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[J.bU,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",308],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,307,"isEmpty",308],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,307,"isNotEmpty",308],
 Mh:function(a,b,c){var z,y,x
 z=J.x(c)
-if(!z.$iszM&&!z.$isz5)c=z.br(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
 y=J.q8(c)
 z=this.xg
 if(z!=null){x=z.iE
@@ -11994,7 +12151,7 @@
 oF:function(a,b,c){var z,y,x,w
 if(b<0||b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
-if(!z.$iszM&&!z.$isz5)c=z.br(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
 y=J.q8(c)
 z=this.ao
 x=z.length
@@ -12048,7 +12205,7 @@
 if(x){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,126],
+return!0}return!1},"$0","gL6",0,0,307],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -12056,8 +12213,8 @@
 "^":"ar+Pi;",
 $isd3:true},
 Bj:{
-"^":"Tp:22;a",
-$0:function(){this.a.xg=null},
+"^":"Tp:115;a",
+$0:[function(){this.a.xg=null},"$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
 HA:{
@@ -12069,18 +12226,18 @@
 $isHA:true},
 qC:{
 "^":"Pi;Zp,AP,fn",
-gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",82],
+gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",308],
 gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",82],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",308],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,249,"length",82],
+return z.gB(z)},null,null,1,0,487,"length",308],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,126,"isEmpty",82],
+return z.gB(z)===0},null,null,1,0,307,"isEmpty",308],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,126,"isNotEmpty",82],
-di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,250,27,[],"containsValue",82],
-x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,250,76,[],"containsKey",82],
-t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},76,[],"[]",82],
+return z.gB(z)!==0},null,null,1,0,307,"isNotEmpty",308],
+di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,488,30,[],"containsValue",308],
+x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,488,49,[],"containsKey",308],
+t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},49,[],"[]",308],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -12089,8 +12246,9 @@
 w=this.AP
 if(w!=null){v=w.iE
 w=v==null?w!=null:v!==w}else w=!1
-if(w)if(y!==z.gB(z)){F.Wi(this,C.Wn,y,z.gB(z))
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))},"$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"un",void:true,args:[a,b]}},this.$receiver,"qC")},76,[],27,[],"[]=",82],
+if(w){z=z.gB(z)
+if(y!==z){F.Wi(this,C.Wn,y,z)
+this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"un",void:true,args:[a,b]}},this.$receiver,"qC")},49,[],30,[],"[]=",308],
 FV:function(a,b){J.kH(b,new V.zT(this))},
 Rz:function(a,b){var z,y,x,w,v
 z=this.Zp
@@ -12122,68 +12280,68 @@
 return y}}},
 zT:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,[],27,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:75;a",
-$2:function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},
+"^":"Tp:300;a",
+$2:[function(a,b){var z=this.a
+z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
 "^":"",
-Wa:function(a,b){var z=J.x(a)
+Wa:[function(a,b){var z=J.x(a)
 if(!!z.$isqI)return J.de(a.oc,b)
 if(!!z.$isHA){z=J.x(b)
 if(!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},
-yf:function(a,b){var z,y,x,w
+return J.de(a.G3,b)}return!1},"$2","Uv",4,0,null,29,[],49,[]],
+yf:[function(a,b){var z,y,x,w
 if(a==null)return
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$iszM&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
-y=J.zH(z)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
+y=H.jO(J.bB(z.gAx()).LU)
 try{if(L.TH(y,b)){x=z.rN(b).gAx()
 return x}if(L.M6(y,C.fz)){x=J.UQ(a,J.GL(b))
 return x}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.Ek))x.x9("can't get "+H.d(b)+" in "+H.d(a))
-return},
-ir:function(a,b,c){var z,y,x,w
+return},"$2","MT",4,0,null,6,[],74,[]],
+ir:[function(a,b,c){var z,y,x,w
 if(a==null)return!1
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$iszM&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
 return!0}}else if(!!J.x(b).$iswv){z=H.vn(a)
-y=J.zH(z)
+y=H.jO(J.bB(z.gAx()).LU)
 try{if(L.dR(y,b)){x=c
 z.tu(b,2,[x],C.CM)
 H.vn(x)
 return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
 return!0}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.Ek))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},
-TH:function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().Fb
+return!1},"$3","J6",6,0,null,6,[],74,[],30,[]],
+TH:[function(a,b){var z
+for(;!J.de(a,$.aA());){z=a.gYK().nb
 if(z.x4(b))return!0
 if(z.x4(C.OV))return!0
-a=L.pY(a)}return!1},
-dR:function(a,b){var z,y
+a=L.pY(a)}return!1},"$2","fY",4,0,null,11,[],12,[]],
+dR:[function(a,b){var z,y
 z=new H.GD(H.u1(H.d(b.gfN(b))+"="))
-for(;!J.de(a,$.aA());){y=a.gYK().Fb
+for(;!J.de(a,$.aA());){y=a.gYK().nb
 if(!!J.x(y.t(0,b)).$isRY)return!0
 if(y.x4(z))return!0
 if(y.x4(C.OV))return!0
-a=L.pY(a)}return!1},
-M6:function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().Fb.t(0,b)
+a=L.pY(a)}return!1},"$2","we",4,0,null,11,[],12,[]],
+M6:[function(a,b){var z
+for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
 if(!!J.x(z).$isRS&&z.guU())return!0
-a=L.pY(a)}return!1},
-pY:function(a){var z,y
+a=L.pY(a)}return!1},"$2","Wt",4,0,null,11,[],12,[]],
+pY:[function(a){var z,y
 try{z=a.gAY()
 return z}catch(y){H.Ru(y)
-return $.aA()}},
-cB:function(a){a=J.JA(a,$.c3(),"")
+return $.aA()}},"$1","WV",2,0,null,11,[]],
+cB:[function(a){a=J.JA(a,$.c3(),"")
 if(a==="")return!0
 if(0>=a.length)return H.e(a,0)
 if(a[0]===".")return!1
-return $.tN().zD(a)},
+return $.tN().zD(a)},"$1","wf",2,0,null,94,[]],
 WR:{
 "^":"Pi;ay,YB,BK,kN,cs,cT,AP,fn",
 E4:function(a){return this.cT.$1(a)},
@@ -12196,7 +12354,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,22,"value",82],
+return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",308],
 sP:[function(a,b){var z,y,x,w
 z=this.BK
 y=z.length
@@ -12212,16 +12370,16 @@
 if(w>=z.length)return H.e(z,w)
 if(L.ir(x,z[w],b)){z=this.kN
 if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,251,66,[],"value",82],
+z[y]=b}},null,null,3,0,489,243,[],"value",308],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
-this.XI()},"$0","gqw",0,0,21],
+this.XI()},"$0","gqw",0,0,126],
 ni:[function(a){var z,y
 for(z=0;y=this.cs,z<y.length;++z){y=y[z]
 if(y!=null){y.ed()
 y=this.cs
 if(z>=y.length)return H.e(y,z)
-y[z]=null}}O.Pi.prototype.ni.call(this,this)},"$0","gl1",0,0,21],
+y[z]=null}}O.Pi.prototype.ni.call(this,this)},"$0","gl1",0,0,126],
 Zy:function(a){var z,y,x,w,v,u
 if(a==null)a=this.BK.length
 z=this.BK
@@ -12278,7 +12436,7 @@
 if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(y).$iswn){z=this.cs
 w=y.gvp().w4(!1)
 v=w.Lj
-w.dB=v.cR(new L.Px(this,a,x))
+w.pN=v.cR(new L.Px(this,a,x))
 w.o7=P.VH(P.AY(),v)
 w.Bd=v.Al(P.v3())
 if(a>=z.length)return H.e(z,a)
@@ -12286,7 +12444,7 @@
 if(!!z.$isd3){v=this.cs
 w=z.gUj(y).w4(!1)
 z=w.Lj
-w.dB=z.cR(new L.C4(this,a,x))
+w.pN=z.cR(new L.C4(this,a,x))
 w.o7=P.VH(P.AY(),z)
 w.Bd=z.Al(P.v3())
 if(a>=v.length)return H.e(v,a)
@@ -12307,24 +12465,24 @@
 z.d4(a,b,c)
 return z}}},
 qL:{
-"^":"Tp:16;",
-$1:function(a){return},
+"^":"Tp:116;",
+$1:[function(a){return},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 Px:{
-"^":"Tp:253;a,b,c",
+"^":"Tp:490;a,b,c",
 $1:[function(a){var z,y
 for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"$1",null,2,0,null,252,[],"call"],
+return}},"$1",null,2,0,null,265,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:254;d,e,f",
+"^":"Tp:491;d,e,f",
 $1:[function(a){var z,y
 for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"$1",null,2,0,null,252,[],"call"],
+return}},"$1",null,2,0,null,265,[],"call"],
 $isEH:true},
 Md:{
-"^":"Tp:22;",
-$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)},
+"^":"Tp:115;",
+$0:[function(){return new H.VR(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)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
 Jk:[function(a){var z,y,x
@@ -12335,46 +12493,46 @@
 return y}if(!!z.$isQV){z=z.ez(a,R.np())
 x=Q.uX(null,null)
 x.FV(0,z)
-return x}return a},"$1","np",2,0,16,27,[]],
+return x}return a},"$1","np",2,0,116,30,[]],
 km:{
-"^":"Tp:75;a",
-$2:function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},
+"^":"Tp:300;a",
+$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"$2",null,4,0,null,376,[],122,[],"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
-JX:function(){var z,y
+JX:[function(){var z,y
 z=document.createElement("style",null)
 J.c9(z,".polymer-veiled { opacity: 0; } \n.polymer-unveil{ -webkit-transition: opacity 0.3s; transition: opacity 0.3s; }\n")
 y=document.querySelector("head")
 y.insertBefore(z,y.firstChild)
 A.B2()
-$.mC().MM.ml(new A.Zj())},
-B2:function(){var z,y,x
+$.mC().MM.ml(new A.Zj())},"$0","Ti",0,0,null],
+B2:[function(){var z,y,x
 for(z=$.IN(),z=H.VM(new H.a7(z,1,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-for(x=W.vD(document.querySelectorAll(y),null),x=x.gA(x);x.G();)J.wT(J.pP(x.lo),"polymer-veiled")}},
-yV:function(a){var z,y
+for(x=W.vD(document.querySelectorAll(y),null),x=x.gA(x);x.G();)J.wT(J.pP(x.lo),"polymer-veiled")}},"$0","Gi",0,0,null],
+yV:[function(a){var z,y
 z=$.xY().Rz(0,a)
-if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},
-oF:function(a,b){var z,y,x,w
+if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},"$1","Km",2,0,null,12,[]],
+oF:[function(a,b){var z,y,x,w
 if(J.de(a,$.H8()))return b
 b=A.oF(a.gAY(),b)
-for(z=a.gYK().Fb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
+for(z=a.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 if(y.gFo()||y.gq4())continue
 x=J.x(y)
 if(!(!!x.$isRY&&!x.gV5(y)))w=!!x.$isRS&&y.glT()
 else w=!0
 if(w)for(w=J.GP(y.gc9());w.G();)if(!!J.x(w.lo.gAx()).$isyL){if(!x.$isRS||A.bc(a,y)){if(b==null)b=P.Fl(null,null)
-b.u(0,y.gIf(),y)}break}}return b},
-yX:function(a,b){var z,y
-do{z=a.gYK().Fb.t(0,b)
+b.u(0,y.gIf(),y)}break}}return b},"$2","Cd",4,0,null,267,[],268,[]],
+Oy:[function(a,b){var z,y
+do{z=a.gYK().nb.t(0,b)
 y=J.x(z)
 if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
 a=a.gAY()}while(!J.de(a,$.H8()))
-return},
-bc:function(a,b){var z,y
+return},"$2","il",4,0,null,267,[],74,[]],
+bc:[function(a,b){var z,y
 z=H.u1(H.d(b.gIf().fN)+"=")
-y=a.gYK().Fb.t(0,new H.GD(z))
-return!!J.x(y).$isRS&&y.ghB()},
-YG:function(a,b,c){var z,y,x
+y=a.gYK().nb.t(0,new H.GD(z))
+return!!J.x(y).$isRS&&y.ghB()},"$2","i8",4,0,null,267,[],269,[]],
+YG:[function(a,b,c){var z,y,x
 z=$.cM()
 if(z==null||a==null)return
 if(!z.Bm("ShadowDOMPolyfill"))return
@@ -12382,8 +12540,8 @@
 if(y==null)return
 x=J.UQ(y,"ShadowCSS")
 if(x==null)return
-x.V7("shimStyling",[a,b,c])},
-Hl:function(a){var z,y,x,w,v,u
+x.V7("shimStyling",[a,b,c])},"$3","OA",6,0,null,270,[],12,[],271,[]],
+Hl:[function(a){var z,y,x,w,v,u
 if(a==null)return""
 w=J.RE(a)
 z=w.gmH(a)
@@ -12401,67 +12559,66 @@
 if(!!J.x(w).$isNh){y=w
 x=new H.XO(u,null)
 $.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},
-Ad:function(a,b){var z
+return""}else throw u}},"$1","NI",2,0,null,272,[]],
+Ad:[function(a,b){var z
 if(b==null)b=C.Tu
 $.Ej().u(0,a,b)
 z=$.p2().Rz(0,a)
-if(z!=null)J.Or(z)},
-xv:function(a){A.om(a,new A.Mq())},
-om:function(a,b){var z
+if(z!=null)J.Or(z)},"$2","ZK",2,2,null,85,12,[],11,[]],
+xv:[function(a){A.pb(a,new A.Mq())},"$1","N1",2,0,null,273,[]],
+pb:[function(a,b){var z
 if(a==null)return
 b.$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.om(z,b)},
-lJ:function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
-return new A.L6(a,b)},
-z9:function(a){var z
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"$2","e0",4,0,null,273,[],164,[]],
+lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
+return new A.L6(a,b)},"$4","y4",8,0,null,274,[],12,[],273,[],275,[]],
+z9:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},
-HR:function(a,b,c){var z,y,x
+return $.od().t(0,a)},"$1","b4",2,0,null,273,[]],
+HR:[function(a,b,c){var z,y,x
 z=H.vn(a)
-y=A.Rk(z.gt5(z),b)
+y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
 if(y!=null){x=y.gMP()
 x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},
-Rk:function(a,b){var z
-do{z=a.gYK().Fb.t(0,b)
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"$3","xi",6,0,null,48,[],276,[],19,[]],
+Rk:[function(a,b){var z
+do{z=a.gYK().nb.t(0,b)
 if(!!J.x(z).$isRS)return z
-a=a.gAY()}while(a!=null)},
-ZI:function(a,b){var z,y
+a=a.gAY()}while(a!=null)},"$2","ov",4,0,null,11,[],12,[]],
+ZI:[function(a,b){var z,y
 if(a==null)return
 z=document.createElement("style",null)
 J.c9(z,J.nJ(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},
-pX:function(){var z=window
+b.appendChild(z)},"$2","tO",4,0,null,277,[],278,[]],
+pX:[function(){var z=window
 C.ol.hr(z)
-C.ol.oB(z,W.aF(new A.hm()))},
-al:function(a,b){var z,y,x
+C.ol.oB(z,W.aF(new A.hm()))},"$0","ji",0,0,null],
+al:[function(a,b){var z,y,x
 z=J.x(b)
 y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
 z=J.RE(y)
 if(J.de(z.gUx(y),C.PU)||J.de(z.gUx(y),C.nN))if(a!=null){x=A.h5(a)
 if(x!=null)return P.re(x)
-z=H.vn(a)
-return z.gt5(z)}return y},
-h5:function(a){if(a==null)return C.Qf
+return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"$2","bP",4,0,null,30,[],74,[]],
+h5:[function(a){if(a==null)return C.Qf
 if(typeof a==="number"&&Math.floor(a)===a)return C.yw
 if(typeof a==="number")return C.O4
 if(typeof a==="boolean")return C.HL
 if(typeof a==="string")return C.Db
 if(!!J.x(a).$isiP)return C.Yc
-return},
-Ok:function(){if($.uP){var z=$.X3.iT(O.Ht())
+return},"$1","v9",2,0,null,30,[]],
+Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
 z.Gr(A.PB())
 return z}A.ei()
-return $.X3},
+return $.X3},"$0","ym",0,0,null],
 ei:[function(){var z=document
 W.wi(window,z,"polymer-element",C.Bm,null)
 A.Jv()
 A.JX()
-$.ax().ml(new A.rD())},"$0","PB",0,0,21],
-Jv:function(){var z,y,x,w,v,u,t
+$.ax().ml(new A.rD())},"$0","PB",0,0,126],
+Jv:[function(){var z,y,x,w,v,u,t
 for(w=$.UP(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
 try{A.pw(z)}catch(v){u=H.Ru(v)
 y=u
@@ -12472,11 +12629,11 @@
 t=y
 if(t==null)H.vh(P.u("Error must not be null"))
 if(u.Gv!==0)H.vh(P.w("Future already completed"))
-u.CG(t,x)}}},
-GA:function(a,b,c,d){var z,y,x,w,v,u
+u.CG(t,x)}}},"$0","vH",0,0,null],
+GA:[function(a,b,c,d){var z,y,x,w,v,u
 if(c==null)c=P.Ls(null,null,null,W.YN)
 if(d==null){d=[]
-d.$builtinTypeInfo=[P.qU]}if(a==null){z="warning: "+H.d(b)+" not found."
+d.$builtinTypeInfo=[J.O]}if(a==null){z="warning: "+H.d(b)+" not found."
 y=$.oK
 if(y==null)H.qw(z)
 else y.$1(z)
@@ -12490,8 +12647,8 @@
 x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
 v=$.oK
 if(v==null)H.qw(z)
-else v.$1(z)}}return d},
-pw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
+else v.$1(z)}}return d},"$4","fE",4,4,null,85,85,279,[],280,[],281,[],282,[]],
+pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=$.RQ()
 z.toString
 y=P.hK(a)
@@ -12513,19 +12670,17 @@
 s=y.tP}w=z.ku
 v=z.gJf(z)
 u=z.gtp(z)}x=z.Fi}p=P.R6(y.Ka,v,t,null,u,s,null,x,w)
-y=$.UG().Fb
+y=$.UG().nb
 o=y.t(0,p)
 n=p.r0
-r=p.Fi
-q=z.Fi
-if(r==null?q==null:r===q)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
+if(p.Fi===z.Fi)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
 else z=!1
 else z=!1
 else z=!1
 if(z){z=p.r0
 m=y.t(0,P.hK("package:"+C.xB.yn(z,J.U6(z).cn(z,"packages/")+9)))
 if(m!=null)o=m}if(o==null){$.M7().To(p.bu(0)+" library not found")
-return}z=o.gYK().Fb
+return}z=o.gYK().nb
 z=z.gUQ(z)
 y=new A.Fn()
 r=new H.U5(z,y)
@@ -12534,7 +12689,7 @@
 y=new H.SO(z,y)
 y.$builtinTypeInfo=[H.Kp(r,0)]
 for(;y.G();)A.ZB(o,z.gl())
-z=o.gYK().Fb
+z=o.gYK().nb
 z=z.gUQ(z)
 y=new A.e3()
 r=new H.U5(z,y)
@@ -12548,8 +12703,8 @@
 j=l.gYj()
 $.Ej().u(0,q,j)
 i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},
-ZB:function(a,b){var z,y,x
+if(i!=null)J.Or(i)}}}},"$1","qt",2,0,null,283,[]],
+ZB:[function(a,b){var z,y,x
 for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
 break}if(!y)return
 if(!b.gFo()){x="warning: methods marked with @initMethod should be static, "+J.AG(b.gIf())+" is not."
@@ -12562,10 +12717,10 @@
 z=$.oK
 if(z==null)H.qw(x)
 else z.$1(x)
-return}a.CI(b.gIf(),C.xD)},
+return}a.CI(b.gIf(),C.xD)},"$2","Ii",4,0,null,101,[],233,[]],
 Zj:{
-"^":"Tp:16;",
-$1:[function(a){A.pX()},"$1",null,2,0,null,17,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){A.pX()},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 XP:{
 "^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,lk",
@@ -12601,7 +12756,7 @@
 A.ZI(this.J3(a,this.kO(a,"global"),"global"),document.head)
 A.YG(this.gZf(a),y,z)
 w=P.re(a.zx)
-v=w.gYK().Fb.t(0,C.c8)
+v=w.gYK().nb.t(0,C.c8)
 if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
 this.Ba(a,y)
 A.yV(a.RT)},
@@ -12630,7 +12785,7 @@
 y=y!=null&&y.x4(w)}else y=!1
 if(y)continue
 v=new H.GD(H.u1(w))
-u=A.yX(b,v)
+u=A.Oy(b,v)
 if(u==null){window
 y="property for attribute "+w+" of polymer-element name="+H.d(a.RT)+" not found."
 if(typeof console!="undefined")console.warn(y)
@@ -12638,7 +12793,7 @@
 if(y==null){y=P.Fl(null,null)
 a.Q7=y}y.u(0,v,u)}}},
 Vk:function(a){var z,y
-z=P.L5(null,null,null,P.qU,P.a)
+z=P.L5(null,null,null,J.O,P.a)
 a.xX=z
 y=a.aa
 if(y!=null)z.FV(0,J.Ng(y))
@@ -12686,14 +12841,14 @@
 q1:function(a,b){var z,y,x,w
 if(J.de(b,$.H8()))return
 this.q1(a,b.gAY())
-for(z=b.gYK().Fb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
+for(z=b.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 if(!J.x(y).$isRS||y.gFo()||!y.guU())continue
 x=y.gIf().fN
 w=J.rY(x)
 if(w.Tc(x,"Changed")&&!w.n(x,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
 x=w.Nj(x,0,J.xH(w.gB(x),7))
 a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},
-qC:function(a,b){var z=P.L5(null,null,null,P.qU,null)
+qC:function(a,b){var z=P.L5(null,null,null,J.O,null)
 b.aN(0,new A.MX(z))
 return z},
 du:function(a){a.RT=a.getAttribute("name")
@@ -12704,48 +12859,48 @@
 C.zb.du(a)
 return a}}},
 q6:{
-"^":"Tp:22;",
-$0:function(){return[]},
+"^":"Tp:115;",
+$0:[function(){return[]},"$0",null,0,0,null,"call"],
 $isEH:true},
 CK:{
-"^":"Tp:75;a",
-$2:function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},
+"^":"Tp:300;a",
+$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 LJ:{
-"^":"Tp:75;a",
-$2:function(a,b){var z,y,x
+"^":"Tp:300;a",
+$2:[function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
 x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 ZG:{
-"^":"Tp:16;",
-$1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
+"^":"Tp:116;",
+$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 Oc:{
-"^":"Tp:16;a",
-$1:function(a){return J.Kf(a,this.a)},
+"^":"Tp:116;a",
+$1:[function(a){return J.Kf(a,this.a)},"$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 MX:{
-"^":"Tp:75;a",
-$2:function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},
+"^":"Tp:300;a",
+$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 w12:{
-"^":"Tp:22;",
-$0:function(){var z=P.L5(null,null,null,P.qU,P.qU)
+"^":"Tp:115;",
+$0:[function(){var z=P.L5(null,null,null,J.O,J.O)
 C.FS.aN(0,new A.r3y(z))
-return z},
+return z},"$0",null,0,0,null,"call"],
 $isEH:true},
 r3y:{
-"^":"Tp:75;a",
-$2:function(a,b){this.a.u(0,b,a)},
+"^":"Tp:300;a",
+$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,492,[],493,[],"call"],
 $isEH:true},
 yL:{
 "^":"ndx;",
 $isyL:true},
 zs:{
-"^":["a;KM:X0=-102",function(){return[C.Nw]}],
+"^":["a;KM:X0=-306",function(){return[C.Nw]}],
 Pa:function(a){var z
 if(W.Pv(this.gM0(a).defaultView)==null)z=$.Bh>0
 else z=!0
@@ -12810,7 +12965,7 @@
 x=y.rN(z.gIf()).gAx()
 w=Z.Zh(c,x,A.al(x,z))
 if(w==null?x!=null:w!==x){y.tu(z.gIf(),2,[w],C.CM)
-H.vn(w)}},"$2","ghW",4,0,255],
+H.vn(w)}},"$2","ghW",4,0,494,12,[],30,[]],
 B2:function(a,b){var z=J.ak(a.dZ)
 if(z==null)return
 return z.t(0,b)},
@@ -12862,14 +13017,14 @@
 J.AA(M.Ky(a))
 y=this.gIW(a)
 for(;y!=null;){A.xv(y)
-y=y.olderShadowRoot}a.Uk=!0},"$0","gJg",0,0,21],
+y=y.olderShadowRoot}a.Uk=!0},"$0","gJg",0,0,126],
 BT:function(a,b){var z
 if(a.Uk===!0){$.P5().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
 return}$.P5().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
 z=a.oq
 if(z!=null){z.TP(0)
 a.oq=null}if(b===!0)return
-A.om(this.gIW(a),new A.TV())},
+A.pb(this.gIW(a),new A.TV())},
 oW:function(a){return this.BT(a,null)},
 Xl:function(a){var z,y,x,w,v
 z=J.xR(a.dZ)
@@ -12882,7 +13037,7 @@
 x=P.L5(null,null,null,P.wv,A.bS)
 for(w=J.GP(b);w.G();){v=w.gl()
 if(!J.x(v).$isqI)continue
-J.Pz(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,256,257,[]],
+J.iF(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,495,496,[]],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
@@ -12894,12 +13049,12 @@
 if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
 w=c.gvp().w4(!1)
 x=w.Lj
-w.dB=x.cR(new A.xf(a,d,y))
+w.pN=x.cR(new A.xf(a,d,y))
 w.o7=P.VH(P.AY(),x)
 w.Bd=x.Al(P.v3())
 x=H.d(J.GL(b))+"__array"
 v=a.Sa
-if(v==null){v=P.L5(null,null,null,P.qU,P.MO)
+if(v==null){v=P.L5(null,null,null,J.O,P.MO)
 a.Sa=v}v.u(0,x,w)}},
 l5:function(a,b){var z=a.Sa.Rz(0,b)
 if(z==null)return!1
@@ -12936,7 +13091,7 @@
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
 if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,258,91,[]],
+this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,497,325,[]],
 ea:function(a,b,c,d){var z,y
 z=$.SS()
 y=z.Im(C.R5)
@@ -12952,31 +13107,31 @@
 $isD0:true,
 $isKV:true},
 WC:{
-"^":"Tp:75;a",
-$2:function(a,b){var z=J.Vs(this.a)
+"^":"Tp:300;a",
+$2:[function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).$0())
-z.t(0,a)},
+z.t(0,a)},"$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 Xi:{
-"^":"Tp:22;b",
-$0:function(){return this.b},
+"^":"Tp:115;b",
+$0:[function(){return this.b},"$0",null,0,0,null,"call"],
 $isEH:true},
 TV:{
-"^":"Tp:16;",
-$1:function(a){var z=J.x(a)
-if(!!z.$iszs)z.oW(a)},
+"^":"Tp:116;",
+$1:[function(a){var z=J.x(a)
+if(!!z.$iszs)z.oW(a)},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 Mq:{
-"^":"Tp:16;",
-$1:function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},
+"^":"Tp:116;",
+$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"$1",null,2,0,null,273,[],"call"],
 $isEH:true},
 Oa:{
-"^":"Tp:22;a",
-$0:function(){return new A.bS(this.a.jL,null)},
+"^":"Tp:115;a",
+$0:[function(){return new A.bS(this.a.jL,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 n1:{
-"^":"Tp:75;b,c,d,e",
-$2:function(a,b){var z,y,x
+"^":"Tp:300;b,c,d,e",
+$2:[function(a,b){var z,y,x
 z=this.e
 if(z!=null&&z.x4(a))J.Jr(this.b,a)
 z=this.d
@@ -12985,14 +13140,14 @@
 if(y!=null){z=this.b
 x=J.RE(b)
 J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"$2",null,4,0,null,12,[],498,[],"call"],
 $isEH:true},
 xf:{
-"^":"Tp:16;a,b,c",
-$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,257,[],"call"],
+"^":"Tp:116;a,b,c",
+$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,496,[],"call"],
 $isEH:true},
 L6:{
-"^":"Tp:75;a,b",
+"^":"Tp:300;a,b",
 $2:[function(a,b){var z,y,x
 z=$.SS()
 if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
@@ -13001,10 +13156,10 @@
 if(x!=null)y=x
 z=J.f5(b).t(0,y)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"$2",null,4,0,null,259,[],260,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"$2",null,4,0,null,292,[],273,[],"call"],
 $isEH:true},
 Rs:{
-"^":"Tp:16;c,d,e",
+"^":"Tp:116;c,d,e",
 $1:[function(a){var z,y,x,w,v,u
 z=this.e
 y=A.z9(z)
@@ -13016,26 +13171,26 @@
 u=L.Sk(v,C.xB.yn(w,1),null)
 w=u.gP(u)}else v=y
 u=J.x(a)
-x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"$1",null,2,0,null,91,[],"call"],
+x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 uJ:{
-"^":"Tp:16;",
-$1:function(a){return!a.gQ2()},
+"^":"Tp:116;",
+$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,499,[],"call"],
 $isEH:true},
 hm:{
-"^":"Tp:16;",
+"^":"Tp:116;",
 $1:[function(a){var z,y,x,w
 z=W.vD(document.querySelectorAll(".polymer-veiled"),null)
 for(y=z.gA(z);y.G();){x=J.pP(y.lo)
 w=J.w1(x)
 w.h(x,"polymer-unveil")
 w.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
-y.gtH(y).ml(new A.Ji(z))}},"$1",null,2,0,null,17,[],"call"],
+y.gtH(y).ml(new A.Ji(z))}},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 Ji:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z
-for(z=this.a,z=z.gA(z);z.G();)J.V1(J.pP(z.lo),"polymer-unveil")},"$1",null,2,0,null,17,[],"call"],
+for(z=this.a,z=z.gA(z);z.G();)J.V1(J.pP(z.lo),"polymer-unveil")},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 Bf:{
 "^":"TR;I6,iU,Jq,dY,qP,ZY,xS,PB,eS,ay",
@@ -13050,15 +13205,15 @@
 if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
 z=this.dY
 if(z==null?w!=null:z!==w)J.ta(this.xS,w)
-return}}},"$1","giz",2,0,261,252,[]],
+return}}},"$1","giz",2,0,500,265,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
 xc:{
-"^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 oX:function(a){this.Pa(a)},
 static:{G7:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -13068,7 +13223,7 @@
 C.Iv.oX(a)
 return a}}},
 jpR:{
-"^":["qE+zs;KM:X0=-102",function(){return[C.Nw]}],
+"^":["qE+zs;KM:X0=-306",function(){return[C.Nw]}],
 $iszs:true,
 $isTU:true,
 $isd3:true,
@@ -13090,104 +13245,105 @@
 if(z!=null){z.ed()
 this.ih=null}},
 tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"$0","gv6",0,0,21]},
+this.Ws()}},"$0","gv6",0,0,126]},
 V3:{
 "^":"a;ns",
 $isV3:true},
 rD:{
-"^":"Tp:16;",
+"^":"Tp:116;",
 $1:[function(a){var z=$.mC().MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(null)
-return},"$1",null,2,0,null,17,[],"call"],
+return},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 Fn:{
-"^":"Tp:16;",
-$1:function(a){return!!J.x(a).$isRS},
+"^":"Tp:116;",
+$1:[function(a){return!!J.x(a).$isRS},"$1",null,2,0,null,501,[],"call"],
 $isEH:true},
 e3:{
-"^":"Tp:16;",
-$1:function(a){return!!J.x(a).$isMs},
+"^":"Tp:116;",
+$1:[function(a){return!!J.x(a).$isMs},"$1",null,2,0,null,501,[],"call"],
 $isEH:true},
 pM:{
-"^":"Tp:16;",
-$1:function(a){return!a.gQ2()},
+"^":"Tp:116;",
+$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,499,[],"call"],
 $isEH:true},
 Mh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
 "^":"",
-Zh:function(a,b,c){var z,y,x
+Zh:[function(a,b,c){var z,y,x
 z=J.UQ($.CT(),J.Ba(c))
 if(z!=null)return z.$2(a,b)
 try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
-return a}},
+return a}},"$3","jo",6,0,null,30,[],284,[],11,[]],
 W6:{
-"^":"Tp:22;",
-$0:function(){var z=P.L5(null,null,null,null,null)
+"^":"Tp:115;",
+$0:[function(){var z=P.L5(null,null,null,null,null)
 z.u(0,C.AZ,new Z.Lf())
 z.u(0,C.ok,new Z.fT())
 z.u(0,C.N4,new Z.pp())
 z.u(0,C.Kc,new Z.nl())
 z.u(0,C.PC,new Z.ik())
 z.u(0,C.md,new Z.LfS())
-return z},
+return z},"$0",null,0,0,null,"call"],
 $isEH:true},
 Lf:{
-"^":"Tp:75;",
-$2:[function(a,b){return a},"$2",null,4,0,null,231,[],17,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){return a},"$2",null,4,0,null,28,[],117,[],"call"],
 $isEH:true},
 fT:{
-"^":"Tp:75;",
-$2:[function(a,b){return a},"$2",null,4,0,null,231,[],17,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){return a},"$2",null,4,0,null,28,[],117,[],"call"],
 $isEH:true},
 pp:{
-"^":"Tp:75;",
+"^":"Tp:300;",
 $2:[function(a,b){var z,y
 try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},"$2",null,4,0,null,231,[],262,[],"call"],
+return b}},"$2",null,4,0,null,28,[],502,[],"call"],
 $isEH:true},
 nl:{
-"^":"Tp:75;",
-$2:[function(a,b){return!J.de(a,"false")},"$2",null,4,0,null,231,[],17,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){return!J.de(a,"false")},"$2",null,4,0,null,28,[],117,[],"call"],
 $isEH:true},
 ik:{
-"^":"Tp:75;",
-$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,231,[],262,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,28,[],502,[],"call"],
 $isEH:true},
 mf:{
-"^":"Tp:16;a",
-$1:function(a){return this.a},
+"^":"Tp:116;a",
+$1:[function(a){return this.a},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 LfS:{
-"^":"Tp:75;",
-$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,231,[],262,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,28,[],502,[],"call"],
 $isEH:true},
 HK:{
-"^":"Tp:16;b",
-$1:function(a){return this.b},
+"^":"Tp:116;b",
+$1:[function(a){return this.b},"$1",null,2,0,null,117,[],"call"],
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 ul:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.Vk(a.gvc(),new T.o8(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","qP",2,0,54,70,[]],
+return z},"$1","qP",2,0,206,122,[]],
 PX:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.kl(a.gvc(),new T.ex(a)).zV(0,";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Fx",2,0,54,70,[]],
+return z},"$1","Fx",2,0,206,122,[]],
 o8:{
-"^":"Tp:16;a",
-$1:function(a){return J.de(this.a.t(0,a),!0)},
+"^":"Tp:116;a",
+$1:[function(a){return J.de(this.a.t(0,a),!0)},"$1",null,2,0,null,376,[],"call"],
 $isEH:true},
 ex:{
-"^":"Tp:16;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,158,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,376,[],"call"],
 $isEH:true},
 e9:{
 "^":"T4p;",
 op:[function(a,b,c){var z,y,x
+if(a==null)return
 z=new Y.hc(H.VM([],[Y.Pn]),P.p9(""),new P.WU(a,0,0,null),null)
 y=new U.tc()
 y=new T.FX(y,z,null,null)
@@ -13199,23 +13355,23 @@
 if(M.wR(c)){z=J.x(b)
 z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"$3","gca",6,0,263],
+return new T.Xy(this,b,x)},"$3","gca",6,0,503,274,[],12,[],273,[]],
 CE:function(a){return new T.uK(this)}},
 Xy:{
-"^":"Tp:75;a,b,c",
+"^":"Tp:300;a,b,c",
 $2:[function(a,b){var z
 if(!J.x(a).$isz6){z=this.a.nF
 a=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}z=!!J.x(b).$iscv
 if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
 if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"$2",null,4,0,null,259,[],260,[],"call"],
+return T.FL(this.c,a,null)},"$2",null,4,0,null,292,[],273,[],"call"],
 $isEH:true},
 uK:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z
 if(!!J.x(a).$isz6)z=a
 else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}return z},"$1",null,2,0,null,259,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}return z},"$1",null,2,0,null,292,[],"call"],
 $isEH:true},
 mY:{
 "^":"Pi;a9,Cu,uI,Y7,AP,fn",
@@ -13224,12 +13380,12 @@
 z=this.Y7
 if(!!J.x(a).$isfk){y=J.OS(J.kl(a.bm,new T.mB(this,a)),!1)
 this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"$1","gUG",2,0,16,70,[]],
-gP:[function(a){return this.Y7},null,null,1,0,22,"value",82],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"$1","gUG",2,0,116,122,[]],
+gP:[function(a){return this.Y7},null,null,1,0,115,"value",308],
 sP:[function(a,b){var z,y,x
 try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
 if(!!J.x(x).$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,16,70,[],"value",82],
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,116,122,[],"value",308],
 yB:function(a,b,c){var z,y,x,w
 y=this.Cu
 y.gju().yI(this.gUG()).fm(0,new T.GX(this))
@@ -13242,14 +13398,14 @@
 z.yB(a,b,c)
 return z}}},
 GX:{
-"^":"Tp:16;a",
-$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"$1",null,2,0,null,7,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 mB:{
-"^":"Tp:16;a,b",
+"^":"Tp:116;a,b",
 $1:[function(a){var z=P.L5(null,null,null,null,null)
 z.u(0,this.b.F5,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"$1",null,2,0,null,135,[],"call"],
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"$1",null,2,0,null,334,[],"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 XF:{
@@ -13262,14 +13418,14 @@
 bX:{
 "^":"Tp;a,b",
 $1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"$1",null,2,0,null,135,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"$1",null,2,0,null,334,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"CV",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
-OH:function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
+OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
 J.UK(z,new K.Ed(b))
-return z.gLv()},
-jX:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+return z.gLv()},"$2","tk",4,0,null,285,[],278,[]],
+jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
 y=new K.c4(z)
@@ -13297,79 +13453,79 @@
 if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
 else{H.vn(p).tu(new H.GD(H.u1(u)),2,[b],C.CM)
-H.vn(b)}},
-ci:function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
-return a},
+H.vn(b)}},"$3","wA",6,0,null,285,[],30,[],278,[]],
+ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
+return a},"$1","W1",2,0,null,122,[]],
 Uf:{
-"^":"Tp:75;",
-$2:function(a,b){return J.WB(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.WB(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 wJY:{
-"^":"Tp:75;",
-$2:function(a,b){return J.xH(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.xH(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 zOQ:{
-"^":"Tp:75;",
-$2:function(a,b){return J.vX(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.vX(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 W6o:{
-"^":"Tp:75;",
-$2:function(a,b){return J.FW(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.FW(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 MdQ:{
-"^":"Tp:75;",
-$2:function(a,b){return J.de(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.de(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 YJG:{
-"^":"Tp:75;",
-$2:function(a,b){return!J.de(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return!J.de(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 DOe:{
-"^":"Tp:75;",
-$2:function(a,b){return J.z8(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.z8(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 lPa:{
-"^":"Tp:75;",
-$2:function(a,b){return J.J5(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.J5(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 Ufa:{
-"^":"Tp:75;",
-$2:function(a,b){return J.u6(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.u6(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 Raa:{
-"^":"Tp:75;",
-$2:function(a,b){return J.Bl(a,b)},
+"^":"Tp:300;",
+$2:[function(a,b){return J.Bl(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 w0:{
-"^":"Tp:75;",
-$2:function(a,b){return a===!0||b===!0},
+"^":"Tp:300;",
+$2:[function(a,b){return a===!0||b===!0},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 w4:{
-"^":"Tp:75;",
-$2:function(a,b){return a===!0&&b===!0},
+"^":"Tp:300;",
+$2:[function(a,b){return a===!0&&b===!0},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 w5:{
-"^":"Tp:75;",
-$2:function(a,b){var z=H.Og(P.a)
+"^":"Tp:300;",
+$2:[function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.$1(a)
-throw H.b(K.kG("Filters must be a one-argument function."))},
+throw H.b(K.kG("Filters must be a one-argument function."))},"$2",null,4,0,null,118,[],128,[],"call"],
 $isEH:true},
 w7:{
-"^":"Tp:16;",
-$1:function(a){return a},
+"^":"Tp:116;",
+$1:[function(a){return a},"$1",null,2,0,null,118,[],"call"],
 $isEH:true},
 w10:{
-"^":"Tp:16;",
-$1:function(a){return J.Z7(a)},
+"^":"Tp:116;",
+$1:[function(a){return J.Z7(a)},"$1",null,2,0,null,118,[],"call"],
 $isEH:true},
 w11:{
-"^":"Tp:16;",
-$1:function(a){return a!==!0},
+"^":"Tp:116;",
+$1:[function(a){return a!==!0},"$1",null,2,0,null,118,[],"call"],
 $isEH:true},
 c4:{
-"^":"Tp:22;a",
-$0:function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},
+"^":"Tp:115;a",
+$0:[function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
 $isEH:true},
 z6:{
 "^":"a;eT>,k8<,bq,G9",
@@ -13383,8 +13539,7 @@
 else{z=this.bq.Zp
 if(z.x4(b))return K.ci(z.t(0,b))
 else if(this.k8!=null){y=new H.GD(H.u1(b))
-z=this.gCH()
-x=Z.y1(z.gt5(z),y)
+x=Z.y1(H.jO(J.bB(this.gCH().Ax).LU),y)
 z=J.x(x)
 if(!z.$isRY)w=!!z.$isRS&&x.glT()
 else w=!0
@@ -13392,19 +13547,17 @@
 else if(!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
 if(z!=null)return K.ci(z.t(0,b))
 else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},
-tI:function(a){var z,y
+tI:function(a){var z
 if(J.de(a,"this"))return
 else{z=this.bq
 if(z.Zp.x4(a))return z
 else{z=H.u1(a)
-y=this.gCH()
-if(Z.y1(y.gt5(y),new H.GD(z))!=null)return this.k8}}z=this.eT
+if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return this.k8}}z=this.eT
 if(z!=null)return z.tI(a)},
-tg:function(a,b){var z,y
+tg:function(a,b){var z
 if(this.bq.Zp.x4(b))return!0
 else{z=H.u1(b)
-y=this.gCH()
-if(Z.y1(y.gt5(y),new H.GD(z))!=null)return!0}z=this.eT
+if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return!0}z=this.eT
 if(z!=null)return z.tg(0,b)
 return!1},
 $isz6:true},
@@ -13453,13 +13606,13 @@
 return x},
 ZR:function(a){var z,y,x,w,v
 z=J.UK(a.ghP(),this)
-if(a.gre()==null)y=null
-else{x=a.gre()
-w=this.gnG()
-x.toString
-y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.fa(z,y,a,null,null,null,P.bK(null,null,!1,null))
+y=a.gre()
+if(y==null)x=null
+else{w=this.gnG()
+y.toString
+x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
-if(y!=null)H.bQ(y,new K.Os(v))
+if(x!=null)H.bQ(x,new K.Os(v))
 return v},
 ti:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
 o0:function(a){var z,y
@@ -13470,7 +13623,7 @@
 YV:function(a){var z,y,x
 z=J.UK(a.gG3(a),this)
 y=J.UK(a.gv4(),this)
-x=new K.jV(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
 return x},
@@ -13494,16 +13647,16 @@
 y.sbO(x)
 return x}},
 Os:{
-"^":"Tp:16;a",
-$1:function(a){var z=this.a
+"^":"Tp:116;a",
+$1:[function(a){var z=this.a
 a.sbO(z)
-return z},
+return z},"$1",null,2,0,null,118,[],"call"],
 $isEH:true},
 B8:{
-"^":"Tp:16;a",
-$1:function(a){var z=this.a
+"^":"Tp:116;a",
+$1:[function(a){var z=this.a
 a.sbO(z)
-return z},
+return z},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Wh:{
 "^":"Ay;KL,bO,tj,Lv,k6",
@@ -13531,11 +13684,11 @@
 $iskB:true,
 $ishw:true},
 ID:{
-"^":"Tp:75;",
-$2:function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},
+"^":"Tp:300;",
+$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
+return a},"$2",null,4,0,null,202,[],21,[],"call"],
 $isEH:true},
-jV:{
+qR:{
 "^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
 RR:function(a,b){return b.YV(this)},
 $asAy:function(){return[U.wk]},
@@ -13557,12 +13710,12 @@
 $isw6:true,
 $ishw:true},
 Qv:{
-"^":"Tp:16;a,b,c",
-$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
+"^":"Tp:116;a,b,c",
+$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
 $isEH:true},
 Xm:{
-"^":"Tp:16;d",
-$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
+"^":"Tp:116;d",
+$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 mv:{
 "^":"Ay;wz<,KL,bO,tj,Lv,k6",
@@ -13598,8 +13751,8 @@
 $isuk:true,
 $ishw:true},
 uA:{
-"^":"Tp:16;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,17,[],"call"],
+"^":"Tp:116;a,b",
+$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 vl:{
 "^":"Ay;hP<,KL,bO,tj,Lv,k6",
@@ -13619,12 +13772,12 @@
 $isx9:true,
 $ishw:true},
 Li:{
-"^":"Tp:16;a,b,c",
-$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
+"^":"Tp:116;a,b,c",
+$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
 $isEH:true},
 WK:{
-"^":"Tp:16;d",
-$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
+"^":"Tp:116;d",
+$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 iT:{
 "^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
@@ -13634,18 +13787,18 @@
 return}y=this.Jn.gLv()
 x=J.U6(z)
 this.Lv=x.t(z,y)
-if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},
 RR:function(a,b){return b.CU(this)},
 $asAy:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
-ja:{
-"^":"Tp:16;a,b,c",
-$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
+tE:{
+"^":"Tp:116;a,b,c",
+$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
 $isEH:true},
 ey:{
-"^":"Tp:16;d",
-$1:function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},
+"^":"Tp:116;d",
+$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 fa:{
 "^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
@@ -13669,16 +13822,16 @@
 $isJy:true,
 $ishw:true},
 WW:{
-"^":"Tp:16;",
-$1:[function(a){return a.gLv()},"$1",null,2,0,null,53,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){return a.gLv()},"$1",null,2,0,null,118,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:254;a,b,c",
-$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,257,[],"call"],
+"^":"Tp:491;a,b,c",
+$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
 $isEH:true},
 a9:{
-"^":"Tp:16;d",
-$1:function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},
+"^":"Tp:116;d",
+$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 VA:{
 "^":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
@@ -13696,15 +13849,15 @@
 $isX7:true,
 $ishw:true},
 J1:{
-"^":"Tp:16;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,17,[],"call"],
+"^":"Tp:116;a,b",
+$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 fk:{
 "^":"a;F5,bm",
 $isfk:true},
 wL:{
-"^":"a:16;lR,ex",
-$1:function(a){return this.lR.F2(this.ex,[a],null).Ax},
+"^":"a:116;lR,ex",
+$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"$1","gKu",2,0,null,504,[]],
 $iswL:true,
 $isEH:true},
 B0:{
@@ -13713,27 +13866,27 @@
 $isB0:true,
 static:{kG:function(a){return new K.B0(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
 "^":"",
-Pu:function(a,b){var z,y
+Pu:[function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
 if(a==null||b==null)return!1
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},
-au:function(a){a.toString
-return U.xk(H.n3(a,0,new U.xs()))},
-Zm:function(a,b){var z=J.WB(a,b)
+if(!J.de(y,b[z]))return!1}return!0},"$2","xV",4,0,null,118,[],199,[]],
+au:[function(a){a.toString
+return U.xk(H.n3(a,0,new U.xs()))},"$1","bT",2,0,null,286,[]],
+Zm:[function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},
-xk:function(a){if(typeof a!=="number")return H.s(a)
+return a^a>>>6},"$2","uN",4,0,null,238,[],30,[]],
+xk:[function(a){if(typeof a!=="number")return H.s(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},
+return 536870911&a+((16383&a)<<15>>>0)},"$1","Zy",2,0,null,238,[]],
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,264,7,[],53,[]],
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,505,21,[],118,[]],
 F2:function(a,b,c){return new U.Jy(a,b,c)}},
 hw:{
 "^":"a;",
@@ -13874,8 +14027,8 @@
 return U.xk(U.Zm(U.Zm(U.Zm(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:75;",
-$2:function(a,b){return U.Zm(a,J.v1(b))},
+"^":"Tp:300;",
+$2:[function(a,b){return U.Zm(a,J.v1(b))},"$2",null,4,0,null,506,[],507,[],"call"],
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
@@ -13901,12 +14054,9 @@
 this.w5()
 w=this.o9()
 this.Sk.toString
-a=new U.X7(a,w)}else{if(J.de(J.Iz(this.fL.lo),8)){z=this.fL.lo.gG8()
-if(typeof z!=="number")return z.F()
-if(typeof b!=="number")return H.s(b)
-z=z>=b}else z=!1
-if(z)a=this.Tw(a)
-else break}return a},
+a=new U.X7(a,w)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
+else break
+return a},
 qL:function(a,b){var z,y
 z=J.x(b)
 if(!!z.$isw6){z=z.gP(b)
@@ -13915,17 +14065,12 @@
 y=b.gre()
 this.Sk.toString
 return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
-Tw:function(a){var z,y,x,w
+Tw:function(a){var z,y,x
 z=this.fL.lo
 this.w5()
 y=this.WT()
 while(!0){x=this.fL.lo
-if(x!=null)if(J.de(J.Iz(x),8)||J.de(J.Iz(this.fL.lo),3)||J.de(J.Iz(this.fL.lo),9)){x=this.fL.lo.gG8()
-w=z.gG8()
-if(typeof x!=="number")return x.D()
-if(typeof w!=="number")return H.s(w)
-w=x>w
-x=w}else x=!1
+if(x!=null)x=(J.de(J.Iz(x),8)||J.de(J.Iz(this.fL.lo),3)||J.de(J.Iz(this.fL.lo),9))&&J.z8(this.fL.lo.gG8(),z.gG8())
 else x=!1
 if(!x)break
 y=this.BH(y,this.fL.lo.gG8())}x=J.Vm(z)
@@ -14035,17 +14180,17 @@
 return y},
 tw:function(){return this.yj("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,71,72,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,287,127,[]],
 Ae:{
-"^":"a;vH>-93,P>-265",
+"^":"a;vH>-326,P>-508",
 n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,16,69,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,249,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,87,"toString"],
+return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,116,99,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,487,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,312,"toString"],
 $isAe:true,
 "@":function(){return[C.Nw]},
 "<>":[3],
-static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[P.KN,a]}},this.$receiver,"Ae")},73,[],27,[],"new IndexedValue"]}},
+static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.bU,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
 "+IndexedValue":[0],
 Bt:{
 "^":"mW;ty",
@@ -14074,19 +14219,19 @@
 return!1},
 $asAC:function(a){return[[K.Ae,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{
 "^":"",
-y1:function(a,b){var z,y,x
-if(a.gYK().Fb.x4(b))return a.gYK().Fb.t(0,b)
+y1:[function(a,b){var z,y,x
+if(a.gYK().nb.x4(b))return a.gYK().nb.t(0,b)
 z=a.gAY()
 if(z!=null&&!J.de(J.Ba(z),C.PU)){y=Z.y1(a.gAY(),b)
 if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return},"$2","rz",4,0,null,288,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
-wX:function(a){switch(a){case 102:return 12
+wX:[function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
 case 118:return 11
-default:return a}},
+default:return a}},"$1","uO",2,0,null,289,[]],
 Pn:{
 "^":"a;fY>,P>,G8<",
 bu:function(a){return"("+this.fY+", '"+this.P+"')"},
@@ -14184,7 +14329,7 @@
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,266,267,[]]},
+DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,509,94,[]]},
 d2:{
 "^":"fr;",
 W9:function(a){return this.xn(a)},
@@ -14197,7 +14342,8 @@
 this.xn(a)},
 ZR:function(a){var z
 J.UK(a.ghP(),this)
-if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
+z=a.gre()
+if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
 this.xn(a)},
 ti:function(a){return this.xn(a)},
 o0:function(a){var z
@@ -14217,14 +14363,14 @@
 this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 NQ:{
-"^":["V24;kW%-235,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-guw:[function(a){return a.kW},null,null,1,0,236,"app",82,104],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,237,27,[],"app",82],
+"^":["V28;kW%-475,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,476,"app",308,311],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,477,30,[],"app",308],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -14232,52 +14378,52 @@
 a.X0=w
 C.Cc.ZL(a)
 C.Cc.oX(a)
-return a},null,null,0,0,22,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[268],
-V24:{
+return a},null,null,0,0,115,"new ResponseViewerElement$created"]}},
+"+ResponseViewerElement":[510],
+V28:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
 "^":"",
-ov:{
-"^":["V25;QV%-269,t7%-93,hX%-93,FZ%-109,Bs%-270,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.QV},null,null,1,0,271,"script",82,104],
-sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,272,27,[],"script",82],
-gBV:[function(a){return a.t7},null,null,1,0,249,"pos",82,104],
-sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,137,27,[],"pos",82],
-giX:[function(a){return a.hX},null,null,1,0,249,"endPos",82,104],
-siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,137,27,[],"endPos",82],
-gHp:[function(a){return a.FZ},null,null,1,0,126,"coverage",82,104],
-sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,127,27,[],"coverage",82],
-gSw:[function(a){return a.Bs},null,null,1,0,273,"lines",82,83],
-sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,274,27,[],"lines",82],
+SM:{
+"^":["V29;QV%-511,t7%-326,hX%-326,FZ%-304,Bs%-512,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.QV},null,null,1,0,513,"script",308,311],
+sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,514,30,[],"script",308],
+gBV:[function(a){return a.t7},null,null,1,0,487,"pos",308,311],
+sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,363,30,[],"pos",308],
+giX:[function(a){return a.hX},null,null,1,0,487,"endPos",308,311],
+siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,363,30,[],"endPos",308],
+gHp:[function(a){return a.FZ},null,null,1,0,307,"coverage",308,311],
+sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,310,30,[],"coverage",308],
+gSw:[function(a){return a.Bs},null,null,1,0,515,"lines",308,309],
+sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,516,30,[],"lines",308],
 rh:[function(a,b){this.VH(a)
-this.ct(a,C.du,0,1)},"$1","grO",2,0,26,65,[],"scriptChanged"],
-Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,26,65,[],"posChanged"],
+this.ct(a,C.wq,0,1)},"$1","grO",2,0,169,242,[],"scriptChanged"],
+Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,169,242,[],"posChanged"],
 OM:[function(a,b){this.ct(a,C.Cv,0,1)
-this.ct(a,C.du,0,1)},"$1","gTA",2,0,16,65,[],"coverageChanged"],
+this.ct(a,C.wq,0,1)},"$1","gTA",2,0,116,242,[],"coverageChanged"],
 qEQ:[function(a,b){var z,y
 z=a.QV
 if(z==null||a.FZ!==!0)return"min-width:32px;"
 y=J.UQ(z.gu9(),b.gRd())
 if(y==null)return"min-width:32px;"
 if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"$1","gL0",2,0,275,276,[],"hitStyle",83],
+return"min-width:32px;background-color:green"},"$1","gL0",2,0,517,192,[],"hitStyle",309],
 VH:[function(a){var z,y,x,w,v
 if(J.iS(a.QV)!==!0){J.SK(a.QV).ml(new T.ZJ(a))
 return}this.ct(a,C.Cv,0,1)
 J.U2(a.Bs)
 z=a.QV.q6(a.t7)
-y=a.hX
+if(z!=null){y=a.hX
 x=a.QV
 if(y==null)J.wT(a.Bs,J.UQ(J.Ew(x),J.xH(z,1)))
 else{w=x.q6(y)
-for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.wT(a.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}},"$0","gI2",0,0,21,"_updateProperties"],
+for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.wT(a.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}}},"$0","gI2",0,0,126,"_updateProperties"],
 "@":function(){return[C.OLi]},
-static:{"^":"bN<-29,JP<-29,VnP<-29",T5:[function(a){var z,y,x,w,v
+static:{"^":"bN<-85,JP<-85,VnP<-85",T5:[function(a){var z,y,x,w,v
 z=R.Jk([])
 y=$.Nd()
-x=P.Py(null,null,null,P.qU,W.I0)
-w=P.qU
+x=P.Py(null,null,null,J.O,W.I0)
+w=J.O
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
 a.FZ=!1
@@ -14287,48 +14433,48 @@
 a.X0=v
 C.HD.ZL(a)
 C.HD.oX(a)
-return a},null,null,0,0,22,"new ScriptInsetElement$created"]}},
-"+ScriptInsetElement":[277],
-V25:{
+return a},null,null,0,0,115,"new ScriptInsetElement$created"]}},
+"+ScriptInsetElement":[518],
+V29:{
 "^":"uL+Pi;",
 $isd3:true},
 ZJ:{
-"^":"Tp:16;a-29",
+"^":"Tp:116;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,16,17,[],"call"],
+if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,116,117,[],"call"],
 $isEH:true},
-"+ ZJ":[124]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+"+ ZJ":[315]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
-kn:{
-"^":["x4;jJ%-93,AP,fn,tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gBV:[function(a){return a.jJ},null,null,1,0,249,"pos",82,104],
-sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,137,27,[],"pos",82],
+knI:{
+"^":["x4;jJ%-326,AP,fn,tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gBV:[function(a){return a.jJ},null,null,1,0,487,"pos",308,311],
+sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,363,30,[],"pos",308],
 gD5:[function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.gD5.call(this,a)
-return z.gzz()},null,null,1,0,87,"hoverText"],
-Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,26,65,[],"posChanged"],
+return z.gzz()},null,null,1,0,312,"hoverText"],
+Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,169,242,[],"posChanged"],
 r6:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,26,17,[],"_updateProperties"],
+this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,169,117,[],"_updateProperties"],
 goc:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
 y=a.tY
 if(z===!0)return H.d(Q.xI.prototype.goc.call(this,a))+":"+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,87,"name"],
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,312,"name"],
 gO3:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
 y=a.tY
 if(z===!0)return Q.xI.prototype.gO3.call(this,a)+"#line="+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,87,"url"],
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,312,"url"],
 "@":function(){return[C.Ur]},
 static:{Th:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.jJ=-1
@@ -14338,31 +14484,31 @@
 a.X0=w
 C.c0.ZL(a)
 C.c0.oX(a)
-return a},null,null,0,0,22,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[278],
+return a},null,null,0,0,115,"new ScriptRefElement$created"]}},
+"+ScriptRefElement":[519],
 x4:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V26;Uz%-269,HJ%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.Uz},null,null,1,0,271,"script",82,104],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,272,27,[],"script",82],
-gjG:[function(a){return a.HJ},null,null,1,0,126,"showCoverage",82,104],
-sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,127,27,[],"showCoverage",82],
+"^":["V30;Uz%-511,HJ%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,513,"script",308,311],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,514,30,[],"script",308],
+gjG:[function(a){return a.HJ},null,null,1,0,307,"showCoverage",308,311],
+sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,310,30,[],"showCoverage",308],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Uz
 if(z==null)return
-J.SK(z)},"$0","gQd",0,0,21,"enteredView"],
-ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,16,65,[],"showCoverageChanged"],
-pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
-j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,26,106,[],"refreshCoverage"],
+J.SK(z)},"$0","gQd",0,0,126,"enteredView"],
+ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,116,242,[],"showCoverageChanged"],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,169,339,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
 static:{Ry:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.HJ=!1
@@ -14371,9 +14517,9 @@
 a.X0=w
 C.cJ.ZL(a)
 C.cJ.oX(a)
-return a},null,null,0,0,22,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[279],
-V26:{
+return a},null,null,0,0,115,"new ScriptViewElement$created"]}},
+"+ScriptViewElement":[520],
+V30:{
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
@@ -14393,7 +14539,7 @@
 v.$builtinTypeInfo=[w]
 v=new Q.wn(null,null,v,null,null)
 v.$builtinTypeInfo=[w]
-w=P.KN
+w=J.bU
 u=D.N8
 t=new V.qC(P.Py(null,null,null,w,u),null,null)
 t.$builtinTypeInfo=[w,u]
@@ -14403,10 +14549,9 @@
 break
 case"Isolate":z=new V.qC(P.Py(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
-z=R.Jk(z)
-x=P.L5(null,null,null,P.qU,D.af)
+x=P.L5(null,null,null,J.O,D.af)
 w=[]
-w.$builtinTypeInfo=[P.qU]
+w.$builtinTypeInfo=[J.O]
 v=[]
 v.$builtinTypeInfo=[D.e5]
 u=D.U4
@@ -14414,9 +14559,9 @@
 t.$builtinTypeInfo=[u]
 t=new Q.wn(null,null,t,null,null)
 t.$builtinTypeInfo=[u]
-u=P.L5(null,null,null,P.qU,P.CP)
+u=P.L5(null,null,null,J.O,J.Pp)
 u=R.Jk(u)
-s=new D.bv(z,!1,!1,!1,!1,x,new D.tL(w,v,null,null,20,0),null,t,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.bv(z,null,!1,!1,!0,x,new D.tL(w,v,null,null,20,0),null,t,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Library":z=D.U4
 x=[]
@@ -14454,8 +14599,8 @@
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-z=P.KN
-w=P.KN
+z=J.bU
+w=J.bU
 v=new V.qC(P.Py(null,null,null,z,w),null,null)
 v.$builtinTypeInfo=[z,w]
 s=new D.rj(x,v,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
@@ -14464,16 +14609,16 @@
 z.$builtinTypeInfo=[null,null]
 s=new D.SI(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
 return s},
-D5:function(a){var z
+D5:[function(a){var z
 if(a!=null){z=J.U6(a)
 z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
-return z},
-ES:function(a,b){var z=J.x(a)
+return z},"$1","SSc",2,0,null,202,[]],
+ES:[function(a,b){var z=J.x(a)
 if(!!z.$isSI)return
 if(!!z.$isqC)D.Gf(a,b)
-else if(!!z.$iswn)D.f3(a,b)},
-Gf:function(a,b){a.aN(0,new D.UZ(a,b))},
-f3:function(a,b){var z,y,x,w,v,u
+else if(!!z.$iswn)D.f3(a,b)},"$2","Ja",4,0,null,290,[],156,[]],
+Gf:[function(a,b){a.aN(0,new D.UZ(a,b))},"$2","nV",4,0,null,162,[],156,[]],
+f3:[function(a,b){var z,y,x,w,v,u
 for(z=a.ao,y=0;y<z.length;++y){x=z[y]
 w=J.x(x)
 v=!!w.$isqC
@@ -14481,29 +14626,29 @@
 else u=!1
 if(u)a.u(0,y,b.Zr(x))
 else if(!!w.$iswn)D.f3(x,b)
-else if(v)D.Gf(x,b)}},
+else if(v)D.Gf(x,b)}},"$2","PV",4,0,null,76,[],156,[]],
 af:{
 "^":"Pi;bN@,GR@",
-gXP:[function(){return this.P3},null,null,1,0,280,"owner",82],
+gXP:[function(){return this.P3},null,null,1,0,521,"owner",308],
 gzf:[function(a){var z=this.P3
-return z.gzf(z)},null,null,1,0,281,"vm",82],
+return z.gzf(z)},null,null,1,0,522,"vm",308],
 gF1:[function(a){var z=this.P3
-return z.gF1(z)},null,null,1,0,81,"isolate",82],
-gjO:[function(a){return this.KG},null,null,1,0,87,"id",82],
-gzS:[function(){return this.mQ},null,null,1,0,87,"serviceType",82],
+return z.gF1(z)},null,null,1,0,318,"isolate",308],
+gjO:[function(a){return this.KG},null,null,1,0,312,"id",308],
+gzS:[function(){return this.mQ},null,null,1,0,312,"serviceType",308],
 gPj:[function(a){var z,y
 z=this.gF1(this)
 y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,87,"link",82],
-gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,87,"hashLink",82],
-sHP:[function(a){},null,null,3,0,16,69,[],"hashLink",82],
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,312,"link",308],
+gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,312,"hashLink",308],
+sHP:[function(a){},null,null,3,0,116,99,[],"hashLink",308],
 gox:function(a){return this.kT},
 gUm:function(){return!1},
 gM8:function(){return!1},
-goc:[function(a){return this.gbN()},null,null,1,0,87,"name",82,83],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,8,27,[],"name",82],
-gzz:[function(){return this.gGR()},null,null,1,0,87,"vmName",82,83],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,8,27,[],"vmName",82],
+goc:[function(a){return this.gbN()},null,null,1,0,312,"name",308,309],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",308],
+gzz:[function(){return this.gGR()},null,null,1,0,312,"vmName",308,309],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",308],
 xW:function(a){if(this.kT)return P.Ab(this,null)
 return this.VD(0)},
 VD:function(a){var z
@@ -14524,7 +14669,7 @@
 this.bF(0,a,y)},
 $isaf:true},
 Pa:{
-"^":"Tp:283;a",
+"^":"Tp:454;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -14532,31 +14677,31 @@
 y=this.a
 if(!J.de(z,y.mQ))return D.ac(y.P3,a)
 y.eC(a)
-return y},"$1",null,2,0,null,282,[],"call"],
+return y},"$1",null,2,0,null,162,[],"call"],
 $isEH:true},
 jI:{
-"^":"Tp:22;b",
+"^":"Tp:115;b",
 $0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
 $isEH:true},
 u0g:{
 "^":"af;"},
-H6:{
+zM:{
 "^":"O1w;Li<,G2<",
-gzf:[function(a){return this},null,null,1,0,281,"vm",82],
-gF1:[function(a){return},null,null,1,0,81,"isolate",82],
+gzf:[function(a){return this},null,null,1,0,522,"vm",308],
+gF1:[function(a){return},null,null,1,0,318,"isolate",308],
 gi2:[function(){var z=this.z7
-return z.gUQ(z)},null,null,1,0,284,"isolates",82],
-gPj:[function(a){return H.d(this.KG)},null,null,1,0,87,"link",82],
-gYe:[function(a){return this.Ox},null,null,1,0,87,"version",82,83],
-sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,8,27,[],"version",82],
-gF6:[function(){return this.GY},null,null,1,0,87,"architecture",82,83],
-sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,8,27,[],"architecture",82],
-gUn:[function(){return this.Rp},null,null,1,0,285,"uptime",82,83],
-sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,286,27,[],"uptime",82],
-gC3:[function(){return this.Ts},null,null,1,0,126,"assertsEnabled",82,83],
-sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,127,27,[],"assertsEnabled",82],
-gPV:[function(){return this.Va},null,null,1,0,126,"typeChecksEnabled",82,83],
-sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,127,27,[],"typeChecksEnabled",82],
+return z.gUQ(z)},null,null,1,0,523,"isolates",308],
+gPj:[function(a){return H.d(this.KG)},null,null,1,0,312,"link",308],
+gYe:[function(a){return this.Ox},null,null,1,0,312,"version",308,309],
+sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,32,30,[],"version",308],
+gF6:[function(){return this.GY},null,null,1,0,312,"architecture",308,309],
+sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,32,30,[],"architecture",308],
+gUn:[function(){return this.Rp},null,null,1,0,524,"uptime",308,309],
+sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,525,30,[],"uptime",308],
+gC3:[function(){return this.Ts},null,null,1,0,307,"assertsEnabled",308,309],
+sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,310,30,[],"assertsEnabled",308],
+gPV:[function(){return this.Va},null,null,1,0,307,"typeChecksEnabled",308,309],
+sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,310,30,[],"typeChecksEnabled",308],
 bZ:function(a){var z,y,x,w
 z=$.rc().R4(0,a)
 if(z==null)return
@@ -14594,7 +14739,7 @@
 return this.Tn(x).ml(new D.oe(this,w))}v=this.A4.t(0,z.a)
 if(v!=null)return J.am(v)
 return this.jU(z.a).ml(new D.kk(z,this))},
-Nw:[function(a,b){return b},"$2","gS6",4,0,75],
+Nw:[function(a,b){return b},"$2","gS6",4,0,300,49,[],30,[]],
 b2:function(a){var z,y,x
 z=null
 try{y=new P.Cf(this.gS6())
@@ -14606,7 +14751,7 @@
 if(J.de(z.t(a,"type"),"ServiceError"))return P.Vu(D.ac(this,a),null,null)
 else if(J.de(z.t(a,"type"),"ServiceException"))return P.Vu(D.ac(this,a),null,null)
 return P.Ab(a,null)},
-jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.I2(this),new D.mR())},
+jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.mR(this),new D.bp())},
 bF:function(a,b,c){var z,y
 if(c)return
 this.kT=!0
@@ -14624,7 +14769,7 @@
 this.xA(z.t(b,"isolates"))},
 xA:function(a){var z,y,x,w,v,u
 z=this.z7
-y=P.L5(null,null,null,P.qU,D.bv)
+y=P.L5(null,null,null,J.O,D.bv)
 for(x=J.GP(a);x.G();){w=x.gl()
 v=J.UQ(w,"id")
 u=z.t(0,v)
@@ -14638,37 +14783,37 @@
 this.A4.u(0,"vm",this)
 var z=P.EF(["id","vm","type","@VM"],null,null)
 this.eC(R.Jk(z))},
-$isH6:true},
+$iszM:true},
 O1w:{
 "^":"u0g+Pi;",
 $isd3:true},
 MZ:{
-"^":"Tp:16;a,b",
-$1:[function(a){if(!J.x(a).$isH6)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,168,[],"call"],
+"^":"Tp:116;a,b",
+$1:[function(a){if(!J.x(a).$iszM)return
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,57,[],"call"],
 $isEH:true},
 oe:{
-"^":"Tp:16;b,c",
+"^":"Tp:116;b,c",
 $1:[function(a){var z
 if(a==null)return this.b
 z=this.c
 if(z==null)return J.am(a)
-else return a.cv(z)},"$1",null,2,0,null,10,[],"call"],
+else return a.cv(z)},"$1",null,2,0,null,16,[],"call"],
 $isEH:true},
 kk:{
-"^":"Tp:283;a,d",
+"^":"Tp:454;a,d",
 $1:[function(a){var z,y
 z=this.d
 y=D.ac(z,a)
 if(y.gUm())z.A4.to(this.a.a,new D.QZ(y))
-return y},"$1",null,2,0,null,282,[],"call"],
+return y},"$1",null,2,0,null,162,[],"call"],
 $isEH:true},
 QZ:{
-"^":"Tp:22;e",
-$0:function(){return this.e},
+"^":"Tp:115;e",
+$0:[function(){return this.e},"$0",null,0,0,null,"call"],
 $isEH:true},
 Ey:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z,y,x,w
 z=null
 try{z=this.a.b2(a)}catch(x){w=H.Ru(x)
@@ -14676,36 +14821,36 @@
 P.JS("Hit V8 bug.")
 w=P.EF(["type","ServiceException","id","","kind","DecodeException","response","This is likely a result of a known V8 bug. Although the the bug has been fixed the fix may not be in your Chrome version. For more information see dartbug.com/18385. Observatory is still functioning and you should try your action again.","message","Could not decode JSON: "+H.d(y)],null,null)
 w=R.Jk(w)
-return P.Vu(D.ac(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,190,[],"call"],
+return P.Vu(D.ac(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,423,[],"call"],
 $isEH:true},
 tm:{
-"^":"Tp:16;b",
+"^":"Tp:116;b",
 $1:[function(a){var z=this.b.G2
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,30,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,171,[],"call"],
 $isEH:true},
 Gk:{
-"^":"Tp:16;",
-$1:[function(a){return!!J.x(a).$isfJ},"$1",null,2,0,null,7,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){return!!J.x(a).$isfJ},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
-I2:{
-"^":"Tp:16;c",
+mR:{
+"^":"Tp:116;c",
 $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,90,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,324,[],"call"],
 $isEH:true},
-mR:{
-"^":"Tp:16;",
-$1:[function(a){return!!J.x(a).$ishR},"$1",null,2,0,null,7,[],"call"],
+bp:{
+"^":"Tp:116;",
+$1:[function(a){return!!J.x(a).$ishR},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Yu:{
-"^":"Tp:75;",
-$2:function(a,b){J.am(b)},
+"^":"Tp:300;",
+$2:[function(a,b){J.am(b)},"$2",null,4,0,null,526,[],16,[],"call"],
 $isEH:true},
 e5:{
-"^":"a;SP,hw<,wZ",
+"^":"a;SP,hw>,wZ",
 Bv:function(a){var z,y,x,w,v
 z=this.hw
 H.ed(z,0,a)
@@ -14748,43 +14893,43 @@
 for(z=this.hD,x=this.lI,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
 v=Array(v)
 v.fixed$length=init
-v.$builtinTypeInfo=[P.KN]
+v.$builtinTypeInfo=[J.bU]
 u=new D.e5(0,v,0)
 u.CJ()
 x.push(u)}if(typeof v!=="number")return H.s(v)
 z=Array(v)
 z.fixed$length=init
-z=new D.e5(0,H.VM(z,[P.KN]),0)
+z=new D.e5(0,H.VM(z,[J.bU]),0)
 this.yP=z
 z.Bv(y)
 return}z=this.RP
 if(typeof z!=="number")return H.s(z)
 z=Array(z)
 z.fixed$length=init
-u=new D.e5(a,H.VM(z,[P.KN]),0)
+u=new D.e5(a,H.VM(z,[J.bU]),0)
 u.nZ(y,this.yP.hw)
 this.yP.wY(0,y)
 z=this.lI
 z.push(u)
 if(z.length>this.hD)C.Nm.KI(z,0)}},
 bv:{
-"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,DC,zb,bN:KT@,GR:f5@,Er,cL,LE<-287,Cf,W1,p2,Hw,S9,yv,BC@-207,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
-gzf:[function(a){return this.P3},null,null,1,0,281,"vm",82],
-gF1:[function(a){return this},null,null,1,0,81,"isolate",82],
-ghw:[function(){return this.V3},null,null,1,0,288,"counters",82,83],
-shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,283,27,[],"counters",82],
+"^":["uz4;V3,Jr,EY,eU,zG,A4,KJ,v9,DC,zb,bN:KT@,GR:f5@,Er,cL,LE<-527,Cf,W1,p2,Hw,S9,yv,BC@-440,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+gzf:[function(a){return this.P3},null,null,1,0,522,"vm",308],
+gF1:[function(a){return this},null,null,1,0,318,"isolate",308],
+ghw:[function(a){return this.V3},null,null,1,0,453,"counters",308,309],
+shw:[function(a,b){this.V3=F.Wi(this,C.MR,this.V3,b)},null,null,3,0,454,30,[],"counters",308],
 gPj:function(a){return this.KG},
 gHP:function(){return"#/"+H.d(this.KG)},
-gko:[function(){return this.l2},null,null,1,0,126,"pausedOnStart",82,83],
-sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,127,27,[],"pausedOnStart",82],
-geB:[function(){return this.No},null,null,1,0,126,"pausedOnExit",82,83],
-seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,127,27,[],"pausedOnExit",82],
-gLd:[function(){return this.EY},null,null,1,0,126,"running",82,83],
-sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,127,27,[],"running",82],
-gaj:[function(){return this.eU},null,null,1,0,126,"idle",82,83],
-saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,127,27,[],"idle",82],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,289,290,[],"relativeLink",82],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,289,290,[],"relativeHashLink",82],
+gBP:[function(a){return this.Jr},null,null,1,0,337,"pauseEvent",308,309],
+sBP:[function(a,b){this.Jr=F.Wi(this,C.yG,this.Jr,b)},null,null,3,0,338,30,[],"pauseEvent",308],
+gLd:[function(){return this.EY},null,null,1,0,307,"running",308,309],
+sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,310,30,[],"running",308],
+gaj:[function(){return this.eU},null,null,1,0,307,"idle",308,309],
+saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,310,30,[],"idle",308],
+gMN:[function(){return this.zG},null,null,1,0,307,"loading",308,309],
+sMN:[function(a){this.zG=F.Wi(this,C.jA,this.zG,a)},null,null,3,0,310,30,[],"loading",308],
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,528,529,[],"relativeLink",308],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,528,529,[],"relativeHashLink",308],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -14802,7 +14947,7 @@
 for(z=J.GP(y);z.G();){w=z.gl()
 J.UQ(w,"code").eL(w,b,x)}},
 Ms:function(a){return this.cv("coverage").ml(this.gm6())},
-Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gm6",2,0,291,292,[]],
+Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gm6",2,0,530,531,[]],
 Zr:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -14815,33 +14960,33 @@
 cv:function(a){var z=this.A4.t(0,a)
 if(z!=null)return J.am(z)
 return this.P3.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gVc:[function(){return this.v9},null,null,1,0,221,"rootLib",82,83],
-sVc:[function(a){this.v9=F.Wi(this,C.iG,this.v9,a)},null,null,3,0,222,27,[],"rootLib",82],
-gvU:[function(){return this.DC},null,null,1,0,293,"libraries",82,83],
-svU:[function(a){this.DC=F.Wi(this,C.Ij,this.DC,a)},null,null,3,0,294,27,[],"libraries",82],
-gf4:[function(){return this.zb},null,null,1,0,288,"topFrame",82,83],
-sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,283,27,[],"topFrame",82],
-goc:[function(a){return this.KT},null,null,1,0,87,"name",82,83],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,8,27,[],"name",82],
-gzz:[function(){return this.f5},null,null,1,0,87,"vmName",82,83],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,8,27,[],"vmName",82],
-gQ9:[function(){return this.Er},null,null,1,0,87,"mainPort",82,83],
-sQ9:[function(a){this.Er=F.Wi(this,C.dH,this.Er,a)},null,null,3,0,8,27,[],"mainPort",82],
-gw2:[function(){return this.cL},null,null,1,0,295,"entry",82,83],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,296,27,[],"entry",82],
-gCi:[function(){return this.Cf},null,null,1,0,249,"newHeapUsed",82,83],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,137,27,[],"newHeapUsed",82],
-gcu:[function(){return this.W1},null,null,1,0,249,"oldHeapUsed",82,83],
-scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,137,27,[],"oldHeapUsed",82],
-gab:[function(){return this.p2},null,null,1,0,249,"newHeapCapacity",82,83],
-sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,137,27,[],"newHeapCapacity",82],
-gfi:[function(){return this.Hw},null,null,1,0,249,"oldHeapCapacity",82,83],
-sfi:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,137,27,[],"oldHeapCapacity",82],
-guT:[function(a){return this.S9},null,null,1,0,87,"fileAndLine",82,83],
+gVc:[function(){return this.v9},null,null,1,0,462,"rootLib",308,309],
+sVc:[function(a){this.v9=F.Wi(this,C.xe,this.v9,a)},null,null,3,0,463,30,[],"rootLib",308],
+gvU:[function(){return this.DC},null,null,1,0,532,"libraries",308,309],
+svU:[function(a){this.DC=F.Wi(this,C.Ij,this.DC,a)},null,null,3,0,533,30,[],"libraries",308],
+gf4:[function(){return this.zb},null,null,1,0,453,"topFrame",308,309],
+sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,454,30,[],"topFrame",308],
+goc:[function(a){return this.KT},null,null,1,0,312,"name",308,309],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",308],
+gzz:[function(){return this.f5},null,null,1,0,312,"vmName",308,309],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",308],
+gQ9:[function(){return this.Er},null,null,1,0,312,"mainPort",308,309],
+sQ9:[function(a){this.Er=F.Wi(this,C.dH,this.Er,a)},null,null,3,0,32,30,[],"mainPort",308],
+gw2:[function(){return this.cL},null,null,1,0,534,"entry",308,309],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,535,30,[],"entry",308],
+gCi:[function(){return this.Cf},null,null,1,0,487,"newHeapUsed",308,309],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,363,30,[],"newHeapUsed",308],
+gcu:[function(){return this.W1},null,null,1,0,487,"oldHeapUsed",308,309],
+scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,363,30,[],"oldHeapUsed",308],
+gab:[function(){return this.p2},null,null,1,0,487,"newHeapCapacity",308,309],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,363,30,[],"newHeapCapacity",308],
+gQBR:[function(){return this.Hw},null,null,1,0,487,"oldHeapCapacity",308,309],
+sQBR:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,363,30,[],"oldHeapCapacity",308],
+guT:[function(a){return this.S9},null,null,1,0,312,"fileAndLine",308,309],
 at:function(a,b){return this.guT(this).$1(b)},
-suT:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,8,27,[],"fileAndLine",82],
-gkc:[function(a){return this.yv},null,null,1,0,297,"error",82,83],
-skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,298,27,[],"error",82],
+suT:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",308],
+gkc:[function(a){return this.yv},null,null,1,0,536,"error",308,309],
+skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,537,30,[],"error",308],
 bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z=J.U6(b)
 y=z.t(b,"mainPort")
@@ -14852,10 +14997,11 @@
 this.f5=F.Wi(this,C.KS,this.f5,y)
 if(c)return
 this.kT=!0
+this.zG=F.Wi(this,C.jA,this.zG,!1)
 D.ES(b,this)
 if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(b))
 return}y=z.t(b,"rootLib")
-this.v9=F.Wi(this,C.iG,this.v9,y)
+this.v9=F.Wi(this,C.xe,this.v9,y)
 if(z.t(b,"entry")!=null){y=z.t(b,"entry")
 this.cL=F.Wi(this,C.tP,this.cL,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
 this.zb=F.Wi(this,C.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
@@ -14901,14 +15047,12 @@
 this.p2=F.Wi(this,C.So,this.p2,y)
 y=J.UQ(z.t(b,"heap"),"capacityOld")
 this.Hw=F.Wi(this,C.Le,this.Hw,y)
-y=z.t(b,"pausedOnStart")
-this.l2=F.Wi(this,C.NT,this.l2,y)
-y=z.t(b,"pausedOnExit")
-this.No=F.Wi(this,C.wq,this.No,y)
-y=z.t(b,"topFrame")
-y=F.Wi(this,C.X8,this.EY,y!=null)
-this.EY=y
-y=this.l2!==!0&&this.No!==!0&&y!==!0
+y=z.t(b,"pauseEvent")
+y=F.Wi(this,C.yG,this.Jr,y)
+this.Jr=y
+y=y==null&&z.t(b,"topFrame")!=null
+this.EY=F.Wi(this,C.X8,this.EY,y)
+y=this.Jr==null&&z.t(b,"topFrame")==null
 this.eU=F.Wi(this,C.q2,this.eU,y)
 y=z.t(b,"error")
 this.yv=F.Wi(this,C.YU,this.yv,y)
@@ -14956,50 +15100,50 @@
 "^":"u0g+Pi;",
 $isd3:true},
 iz:{
-"^":"Tp:16;",
-$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
+"^":"Tp:116;",
+$1:[function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
 a.Du=0
 a.fF=0
 a.mM=F.Wi(a,C.eF,a.mM,"")
 a.qH=F.Wi(a,C.uU,a.qH,"")
 J.U2(a.VS)
 J.U2(a.ci)
-J.U2(a.Oo)}},
+J.U2(a.Oo)}},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 oa:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,299,[],"call"],
+z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,538,[],"call"],
 $isEH:true},
 KQ:{
-"^":"Tp:283;a,b",
+"^":"Tp:454;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.ac(z,a)
 if(y.gUm())z.A4.to(this.b,new D.Ai(y))
-return y},"$1",null,2,0,null,282,[],"call"],
+return y},"$1",null,2,0,null,162,[],"call"],
 $isEH:true},
 Ai:{
-"^":"Tp:22;c",
-$0:function(){return this.c},
+"^":"Tp:115;c",
+$0:[function(){return this.c},"$0",null,0,0,null,"call"],
 $isEH:true},
 Qq:{
-"^":"Tp:16;a",
+"^":"Tp:116;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,300,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,539,[],"call"],
 $isEH:true},
 Yn:{
-"^":"Tp:75;",
-$2:[function(a,b){return J.oE(J.O6(a),J.O6(b))},"$2",null,4,0,null,53,[],57,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){return J.oE(J.O6(a),J.O6(b))},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 AP:{
-"^":"Tp:283;a",
+"^":"Tp:454;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.KJ
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,212,[],"call"],
+return y},"$1",null,2,0,null,202,[],"call"],
 $isEH:true},
 SI:{
 "^":"af;RF,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
@@ -15036,13 +15180,13 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 BN:[function(a){var z=this.RF
-return z.BN(z)},"$0","gDx",0,0,126],
+return z.BN(z)},"$0","gDx",0,0,307],
 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)},
-k0:[function(a){return},"$0","gqw",0,0,21],
+k0:[function(a){return},"$0","gqw",0,0,126],
 ni:[function(a){this.RF.AP=null
-return},"$0","gl1",0,0,21],
+return},"$0","gl1",0,0,126],
 gUj:function(a){var z=this.RF
 return z.gUj(z)},
 gnz:function(a){var z,y
@@ -15059,14 +15203,14 @@
 static:{"^":"VZ"}},
 pD:{
 "^":"wVq;J6,LD,jo,Ne,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
-gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
-gFA:[function(a){return this.jo},null,null,1,0,103,"exception",82,83],
-sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,105,27,[],"exception",82],
-gur:[function(){return this.Ne},null,null,1,0,103,"stacktrace",82,83],
-sur:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,105,27,[],"stacktrace",82],
+gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
+gG1:[function(a){return this.LD},null,null,1,0,312,"message",308,309],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",308],
+gFA:[function(a){return this.jo},null,null,1,0,337,"exception",308,309],
+sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,338,30,[],"exception",308],
+gK7:[function(){return this.Ne},null,null,1,0,337,"stacktrace",308,309],
+sK7:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,338,30,[],"stacktrace",308],
 bF:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"kind")
@@ -15087,10 +15231,10 @@
 $isd3:true},
 fJ:{
 "^":"dZL;J6,LD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
-gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
+gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
+gG1:[function(a){return this.LD},null,null,1,0,312,"message",308,309],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",308],
 bF:function(a,b,c){var z,y
 this.kT=!0
 z=J.U6(b)
@@ -15108,12 +15252,12 @@
 $isd3:true},
 hR:{
 "^":"w8F;J6,LD,IV,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
-gG1:[function(a){return this.LD},null,null,1,0,87,"message",82,83],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,8,27,[],"message",82],
-gvJ:[function(a){return this.IV},null,null,1,0,22,"response",82,83],
-svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,16,27,[],"response",82],
+gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
+gG1:[function(a){return this.LD},null,null,1,0,312,"message",308,309],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",308],
+gvJ:[function(a){return this.IV},null,null,1,0,115,"response",308,309],
+svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,116,30,[],"response",308],
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
@@ -15131,9 +15275,9 @@
 "^":"af+Pi;",
 $isd3:true},
 U4:{
-"^":["V4b;dj,JJ<-29,XR<-29,DD>-29,Z3<-29,mu<-29,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null],
-gO3:[function(a){return this.dj},null,null,1,0,87,"url",82,83],
-sO3:[function(a,b){this.dj=F.Wi(this,C.Fh,this.dj,b)},null,null,3,0,8,27,[],"url",82],
+"^":["V4b;dj,JJ<-85,XR<-85,DD>-85,Z3<-85,mu<-85,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null],
+gO3:[function(a){return this.dj},null,null,1,0,312,"url",308,309],
+sO3:[function(a,b){this.dj=F.Wi(this,C.Fh,this.dj,b)},null,null,3,0,32,30,[],"url",308],
 gUm:function(){return!0},
 gM8:function(){return!1},
 bF:function(a,b,c){var z,y,x,w
@@ -15178,22 +15322,22 @@
 "^":"af+Pi;",
 $isd3:true},
 c2:{
-"^":["a;Rd<-93,a4>-125",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd<-326,a4>-305",function(){return[C.Nw]},function(){return[C.Nw]}],
 $isc2:true},
 rj:{
-"^":["Zqa;Sw>-29,u9<-29,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,87,"kind",82,83],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,8,27,[],"kind",82],
-gVB:[function(){return this.wJ},null,null,1,0,249,"firstTokenPos",82,83],
+"^":["Zqa;Sw>-85,u9<-85,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
+gVB:[function(){return this.wJ},null,null,1,0,487,"firstTokenPos",308,309],
 sVB:[function(a){var z=this.wJ
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Gd,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.wJ=a},null,null,3,0,137,27,[],"firstTokenPos",82],
-gug:[function(){return this.lx},null,null,1,0,249,"lastTokenPos",82,83],
+this.nq(this,z)}this.wJ=a},null,null,3,0,363,30,[],"firstTokenPos",308],
+gug:[function(){return this.lx},null,null,1,0,487,"lastTokenPos",308,309],
 sug:[function(a){var z=this.lx
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.kA,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.lx=a},null,null,3,0,137,27,[],"lastTokenPos",82],
+this.nq(this,z)}this.lx=a},null,null,3,0,363,30,[],"lastTokenPos",308],
 gUm:function(){return!0},
 gM8:function(){return!0},
 rK:function(a){return J.UQ(this.Sw,J.xH(a,1))},
@@ -15276,21 +15420,21 @@
 "^":"a;Yu<,Du<,fF<",
 $isN8:true},
 Z9:{
-"^":["Pi;Yu<,LR<-93,VF<-93,KO<-93,fY>-125,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
-gNl:[function(a){return this.ar},null,null,1,0,271,"script",82,83],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,272,27,[],"script",82],
-gUE:[function(){return this.MT},null,null,1,0,87,"formattedLine",82,83],
-sUE:[function(a){this.MT=F.Wi(this,C.oI,this.MT,a)},null,null,3,0,8,27,[],"formattedLine",82],
+"^":["Pi;Yu<,LR<-326,VF<-326,KO<-326,fY>-305,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
+gNl:[function(a){return this.ar},null,null,1,0,513,"script",308,309],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,514,30,[],"script",308],
+gUE:[function(){return this.MT},null,null,1,0,312,"formattedLine",308,309],
+sUE:[function(a){this.MT=F.Wi(this,C.Zt,this.MT,a)},null,null,3,0,32,30,[],"formattedLine",308],
 c9s:[function(){var z,y
 z=this.LR
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","guV",0,0,87,"formattedDeoptId",82],
+return y.bu(z)},"$0","guV",0,0,312,"formattedDeoptId",308],
 M2Y:[function(){var z,y
 z=this.VF
 y=J.x(z)
 if(y.n(z,-1))return""
-return y.bu(z)},"$0","gZO",0,0,87,"formattedTokenPos",82],
+return y.bu(z)},"$0","gZO",0,0,312,"formattedTokenPos",308],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.fX,this.ar,null)
 z=this.VF
@@ -15299,33 +15443,33 @@
 if(y==null)return
 this.ar=F.Wi(this,C.fX,this.ar,a)
 z=J.nJ(a.rK(y))
-this.MT=F.Wi(this,C.oI,this.MT,z)},
+this.MT=F.Wi(this,C.Zt,this.MT,z)},
 $isZ9:true},
 Q4:{
-"^":["Pi;Yu<-93,Fm<-125,L4<-125,dh,uH@-301,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
-gPO:[function(){return this.dh},null,null,1,0,302,"jumpTarget",82,83],
-sPO:[function(a){var z=this.dh
+"^":["Pi;Yu<-326,Fm<-305,L4<-305,dh,uH@-540,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
+gwi:[function(){return this.dh},null,null,1,0,541,"jumpTarget",308,309],
+swi:[function(a){var z=this.dh
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Qn,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.dh=a},null,null,3,0,303,27,[],"jumpTarget",82],
-gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,126,"isComment",82],
-ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,126,"hasDescriptors",82],
+this.nq(this,z)}this.dh=a},null,null,3,0,542,30,[],"jumpTarget",308],
+gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,307,"isComment",308],
+ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,307,"hasDescriptors",308],
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,87,"formattedAddress",82],
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,312,"formattedAddress",308],
 Io:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
 if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,304,305,[],"formattedInclusive",82],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,543,154,[],"formattedInclusive",308],
 HU:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,304,305,[],"formattedExclusive",82],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,543,154,[],"formattedExclusive",308],
 eQ:function(){var z,y,x,w
 y=J.uH(this.L4," ")
 x=y.length
@@ -15354,18 +15498,18 @@
 this.nq(this,z)}this.dh=u
 return}++w}P.JS("Could not find instruction at "+x.WZ(y,16))},
 $isQ4:true,
-static:{Tn:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"}}},
+static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","I9",4,0,null,118,[],119,[]]}},
 WAE:{
 "^":"a;uX",
 bu:function(a){return this.uX},
-static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:function(a){var z=J.x(a)
+static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.nj
 else if(z.n(a,"Dart"))return C.l8
 else if(z.n(a,"Collected"))return C.WA
 else if(z.n(a,"Reused"))return C.yP
 else if(z.n(a,"Tag"))return C.oA
 N.Jx("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.hS())}}},
+throw H.b(P.hS())},"$1","Ma",2,0,null,94,[]]}},
 Vi:{
 "^":"a;tT>,Av<",
 $isVi:true},
@@ -15373,28 +15517,28 @@
 "^":"a;tT>,Av<,wd>,Jv",
 $ist9:true},
 kx:{
-"^":["D3i;J6,xM,Du@-93,fF@-93,vg@-93,Mb@-93,VS<-29,ci<-29,va<-29,Oo<-29,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,306,"kind",82,83],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,307,27,[],"kind",82],
-glt:[function(){return this.xM},null,null,1,0,249,"totalSamplesInProfile",82,83],
-slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,137,27,[],"totalSamplesInProfile",82],
-gS7:[function(){return this.mM},null,null,1,0,87,"formattedInclusiveTicks",82,83],
-sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,8,27,[],"formattedInclusiveTicks",82],
-gN8:[function(){return this.qH},null,null,1,0,87,"formattedExclusiveTicks",82,83],
-sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,8,27,[],"formattedExclusiveTicks",82],
-gL1E:[function(){return this.Ni},null,null,1,0,103,"objectPool",82,83],
-sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,105,27,[],"objectPool",82],
-gMj:[function(a){return this.MO},null,null,1,0,103,"function",82,83],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,105,27,[],"function",82],
-gNl:[function(a){return this.ar},null,null,1,0,271,"script",82,83],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,272,27,[],"script",82],
-gla:[function(){return this.MH},null,null,1,0,126,"isOptimized",82,83],
-sla:[function(a){this.MH=F.Wi(this,C.FQ,this.MH,a)},null,null,3,0,127,27,[],"isOptimized",82],
+"^":["D3i;J6,xM,Du@-326,fF@-326,vg@-326,Mb@-326,VS<-85,ci<-85,va<-85,Oo<-85,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,544,"kind",308,309],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,545,30,[],"kind",308],
+glt:[function(){return this.xM},null,null,1,0,487,"totalSamplesInProfile",308,309],
+slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,363,30,[],"totalSamplesInProfile",308],
+gS7:[function(){return this.mM},null,null,1,0,312,"formattedInclusiveTicks",308,309],
+sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",308],
+gN8:[function(){return this.qH},null,null,1,0,312,"formattedExclusiveTicks",308,309],
+sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",308],
+gL1E:[function(){return this.Ni},null,null,1,0,337,"objectPool",308,309],
+sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,338,30,[],"objectPool",308],
+gMj:[function(a){return this.MO},null,null,1,0,337,"function",308,309],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,338,30,[],"function",308],
+gNl:[function(a){return this.ar},null,null,1,0,513,"script",308,309],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,514,30,[],"script",308],
+gur:[function(){return this.MH},null,null,1,0,307,"isOptimized",308,309],
+sur:[function(a){this.MH=F.Wi(this,C.FQ,this.MH,a)},null,null,3,0,310,30,[],"isOptimized",308],
 gUm:function(){return!0},
 gM8:function(){return!0},
 tx:[function(a){var z,y
 this.ar=F.Wi(this,C.fX,this.ar,a)
-for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,308,309,[]],
+for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,546,547,[]],
 QW:function(){if(this.ar!=null)return
 if(!J.de(this.J6,C.l8))return
 var z=this.MO
@@ -15439,9 +15583,10 @@
 this.vg=H.BU(z.t(b,"start"),16,null)
 this.Mb=H.BU(z.t(b,"end"),16,null)
 y=this.P3
-x=y.gF1(y).Zr(z.t(b,"function"))
+y=y.gF1(y)
+x=y.Zr(z.t(b,"function"))
 this.MO=F.Wi(this,C.nf,this.MO,x)
-y=y.gF1(y).Zr(z.t(b,"object_pool"))
+y=y.Zr(z.t(b,"object_pool"))
 this.Ni=F.Wi(this,C.xG,this.Ni,y)
 w=z.t(b,"disassembly")
 if(w!=null)this.xs(w)
@@ -15452,8 +15597,8 @@
 this.kT=!J.de(y.gB(z),0)||!J.de(this.J6,C.l8)
 z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
 this.TD=F.Wi(this,C.zS,this.TD,z)},
-gvS:[function(){return this.TD},null,null,1,0,126,"hasDisassembly",82,83],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,127,27,[],"hasDisassembly",82],
+gvS:[function(){return this.TD},null,null,1,0,307,"hasDisassembly",308,309],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,310,30,[],"hasDisassembly",308],
 xs:function(a){var z,y,x,w,v,u,t,s,r
 z=this.va
 y=J.w1(z)
@@ -15498,43 +15643,43 @@
 w+=3}},
 tg:function(a,b){J.J5(b,this.vg)
 return!1},
-gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,126,"isDartCode",82],
+gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,307,"isDartCode",308],
 $iskx:true,
-static:{Vb:function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"}}},
+static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","Mr",4,0,null,118,[],119,[]]}},
 D3i:{
 "^":"af+Pi;",
 $isd3:true},
 Em:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z,y
 z=this.a
 y=J.UQ(z.MO,"script")
 if(y==null)return
-J.SK(y).ml(z.gKn())},"$1",null,2,0,null,310,[],"call"],
+J.SK(y).ml(z.gKn())},"$1",null,2,0,null,548,[],"call"],
 $isEH:true},
 fx:{
-"^":"Tp:75;",
-$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,53,[],57,[],"call"],
+"^":"Tp:300;",
+$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,118,[],199,[],"call"],
 $isEH:true},
 UZ:{
-"^":"Tp:75;a,b",
-$2:function(a,b){var z,y
+"^":"Tp:300;a,b",
+$2:[function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
 if(y&&D.D5(b))this.a.u(0,a,this.b.Zr(b))
 else if(!!z.$iswn)D.f3(b,this.b)
-else if(y)D.Gf(b,this.b)},
+else if(y)D.Gf(b,this.b)},"$2",null,4,0,null,376,[],122,[],"call"],
 $isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
 "^":"",
 zMr:{
-"^":["V27;jA%-311,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.jA},null,null,1,0,312,"error",82,104],
-skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,313,27,[],"error",82],
+"^":["V31;jA%-549,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.jA},null,null,1,0,550,"error",308,311],
+skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,551,30,[],"error",308],
 "@":function(){return[C.uvO]},
 static:{hp:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15542,21 +15687,21 @@
 a.X0=w
 C.SX.ZL(a)
 C.SX.oX(a)
-return a},null,null,0,0,22,"new ServiceErrorViewElement$created"]}},
-"+ServiceErrorViewElement":[314],
-V27:{
+return a},null,null,0,0,115,"new ServiceErrorViewElement$created"]}},
+"+ServiceErrorViewElement":[552],
+V31:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
 "^":"",
 nk:{
-"^":["V28;Xc%-315,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFA:[function(a){return a.Xc},null,null,1,0,316,"exception",82,104],
-sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,317,27,[],"exception",82],
+"^":["V32;Xc%-553,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFA:[function(a){return a.Xc},null,null,1,0,554,"exception",308,311],
+sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,555,30,[],"exception",308],
 "@":function(){return[C.vr3]},
 static:{dS:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15564,30 +15709,30 @@
 a.X0=w
 C.Vd.ZL(a)
 C.Vd.oX(a)
-return a},null,null,0,0,22,"new ServiceExceptionViewElement$created"]}},
-"+ServiceExceptionViewElement":[318],
-V28:{
+return a},null,null,0,0,115,"new ServiceExceptionViewElement$created"]}},
+"+ServiceExceptionViewElement":[556],
+V32:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
 XK:{
-"^":"H6;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+"^":"zM;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
 z6:function(a,b){var z
 N.Jx("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
 z=this.Jf
 if(typeof z!=="string")return z.g()
-return W.Kn(J.WB(z,b),null,null).OA(new U.dT())},
+return W.It(J.WB(z,b),null,null).OA(new U.dT())},
 SC:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
 dT:{
-"^":"Tp:16;",
+"^":"Tp:116;",
 $1:[function(a){var z
 N.Jx("").hh("HttpRequest.getString failed.")
 z=J.RE(a)
 z.gN(a)
-return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,30,[],"call"],
+return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,171,[],"call"],
 $isEH:true},
 ho:{
-"^":"H6;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+"^":"zM;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
 q3:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -15597,7 +15742,7 @@
 z=this.ja
 v=z.t(0,y)
 z.Rz(0,y)
-J.Xf(v,w)},"$1","gVx",2,0,26,319,[]],
+J.Xf(v,w)},"$1","gVx",2,0,169,22,[]],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -15613,9 +15758,9 @@
 N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 ob:{
-"^":["V29;mC%-108,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gWA:[function(a){return a.mC},null,null,1,0,85,"object",82,104],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,86,27,[],"object",82],
+"^":["V33;mC%-341,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gWA:[function(a){return a.mC},null,null,1,0,320,"object",308,311],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,321,30,[],"object",308],
 hu:[function(a){var z
 switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
 J.CJ(z,a.mC)
@@ -15670,7 +15815,7 @@
 return z
 default:z=W.r3("json-view",null)
 J.wD(z,a.mC)
-return z}},"$0","gbs",0,0,320,"_constructElementForObject"],
+return z}},"$0","gbs",0,0,557,"_constructElementForObject"],
 xJ:[function(a,b){var z,y,x
 this.pj(a)
 z=a.mC
@@ -15679,12 +15824,12 @@
 x=this.hu(a)
 if(x==null){N.Jx("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,16,65,[],"objectChanged"],
+N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,116,242,[],"objectChanged"],
 "@":function(){return[C.Tl]},
-static:{zy:[function(a){var z,y,x,w
+static:{lv:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15692,40 +15837,40 @@
 a.X0=w
 C.ZO.ZL(a)
 C.ZO.oX(a)
-return a},null,null,0,0,22,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[321],
-V29:{
+return a},null,null,0,0,115,"new ServiceObjectViewElement$created"]}},
+"+ServiceObjectViewElement":[558],
+V33:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["Vfx;tY%-108,Pe%-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gnv:[function(a){return a.tY},null,null,1,0,85,"ref",82,104],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,86,27,[],"ref",82],
-gjT:[function(a){return a.Pe},null,null,1,0,126,"internal",82,104],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,127,27,[],"internal",82],
+"^":["Vfx;tY%-341,Pe%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gnv:[function(a){return a.tY},null,null,1,0,320,"ref",308,311],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,321,30,[],"ref",308],
+gjT:[function(a){return a.Pe},null,null,1,0,307,"internal",308,311],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,310,30,[],"internal",308],
 P9:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
 this.ct(a,C.KG,0,1)
-this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,26,65,[],"refChanged"],
+this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,169,242,[],"refChanged"],
 gO3:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,87,"url"],
+return z.gHP()},null,null,1,0,312,"url"],
 gOL:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,87,"serviceId"],
+return J.F8(z)},null,null,1,0,312,"serviceId"],
 gD5:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,87,"hoverText"],
+return z.gzz()},null,null,1,0,312,"hoverText"],
 goc:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,87,"name"],
-gRw:[function(a){return J.FN(this.goc(a))},null,null,1,0,126,"nameIsEmpty"],
+return J.O6(z)},null,null,1,0,312,"name"],
+gRw:[function(a){return J.FN(this.goc(a))},null,null,1,0,307,"nameIsEmpty"],
 "@":function(){return[C.JD]},
 static:{lK:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -15734,27 +15879,27 @@
 a.X0=w
 C.wU.ZL(a)
 C.wU.oX(a)
-return a},null,null,0,0,22,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[322],
+return a},null,null,0,0,115,"new ServiceRefElement$created"]}},
+"+ServiceRefElement":[559],
 Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
 "^":"",
 Uj:{
-"^":["Bc;kF%-109,IK%-125,Qt%-125,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gTq:[function(a){return a.kF},null,null,1,0,126,"checked",82,104],
-sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,127,27,[],"checked",82],
-gEu:[function(a){return a.IK},null,null,1,0,87,"checkedText",82,104],
-sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,8,27,[],"checkedText",82],
-gRY:[function(a){return a.Qt},null,null,1,0,87,"uncheckedText",82,104],
-sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,8,27,[],"uncheckedText",82],
+"^":["LPc;kF%-304,IK%-305,No%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gTq:[function(a){return a.kF},null,null,1,0,307,"checked",308,311],
+sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,310,30,[],"checked",308],
+gEu:[function(a){return a.IK},null,null,1,0,312,"checkedText",308,311],
+sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",308],
+gRY:[function(a){return a.No},null,null,1,0,312,"uncheckedText",308,311],
+sRY:[function(a,b){a.No=this.ct(a,C.WY,a.No,b)},null,null,3,0,32,30,[],"uncheckedText",308],
 RC:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,120,7,[],323,[],119,[],"change"],
+a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,350,21,[],560,[],82,[],"change"],
 "@":function(){return[C.mS]},
 static:{Al:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15762,21 +15907,21 @@
 a.X0=w
 C.fA.ZL(a)
 C.fA.oX(a)
-return a},null,null,0,0,22,"new SlidingCheckboxElement$created"]}},
-"+SlidingCheckboxElement":[324],
-Bc:{
+return a},null,null,0,0,115,"new SlidingCheckboxElement$created"]}},
+"+SlidingCheckboxElement":[561],
+LPc:{
 "^":"xc+Pi;",
 $isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 xT:{
-"^":["V30;rd%-325,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.rd},null,null,1,0,288,"frame",82,104],
-sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,283,27,[],"frame",82],
+"^":["V34;rd%-451,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.rd},null,null,1,0,453,"frame",308,311],
+sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,454,30,[],"frame",308],
 "@":function(){return[C.Xv]},
 static:{an:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15784,22 +15929,22 @@
 a.X0=w
 C.dX.ZL(a)
 C.dX.oX(a)
-return a},null,null,0,0,22,"new StackFrameElement$created"]}},
-"+StackFrameElement":[326],
-V30:{
+return a},null,null,0,0,115,"new StackFrameElement$created"]}},
+"+StackFrameElement":[562],
+V34:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 uwf:{
-"^":["V31;B3%-101,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtN:[function(a){return a.B3},null,null,1,0,103,"trace",82,104],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,105,27,[],"trace",82],
-pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+"^":["V35;B3%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtN:[function(a){return a.B3},null,null,1,0,337,"trace",308,311],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,338,30,[],"trace",308],
+pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 "@":function(){return[C.js]},
 static:{bV:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -15807,18 +15952,18 @@
 a.X0=w
 C.bg.ZL(a)
 C.bg.oX(a)
-return a},null,null,0,0,22,"new StackTraceElement$created"]}},
-"+StackTraceElement":[327],
-V31:{
+return a},null,null,0,0,115,"new StackTraceElement$created"]}},
+"+StackTraceElement":[563],
+V35:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
-IP:function(a){var z=J.x(a)
+IP:[function(a){var z=J.x(a)
 if(!!z.$isQl)return C.i3.f0(a)
 switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
 case"radio":case"select-multiple":case"select-one":return z.gi9(a)
-default:return z.gLm(a)}},
-iX:function(a,b){var z,y,x,w,v,u,t,s
+default:return z.gLm(a)}},"$1","tF",2,0,null,142,[]],
+iX:[function(a,b){var z,y,x,w,v,u,t,s
 z=M.pN(a,b)
 y=J.x(a)
 if(!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
@@ -15829,8 +15974,8 @@
 if(s==null)continue
 if(u==null)u=P.Py(null,null,null,null,null)
 u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.K6(z,u,w,t)},
-HP:function(a,b,c,d,e){var z,y,x
+return new M.K6(z,u,w,t)},"$2","Nc",4,0,null,273,[],291,[]],
+HP:[function(a,b,c,d,e){var z,y,x
 if(b==null)return
 if(b.gN2()!=null){z=b.gN2()
 M.Ky(a).wh(z)
@@ -15839,17 +15984,17 @@
 if(z.gwd(b)==null)return
 y=b.gTe()-a.childNodes.length
 for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},
-bM:function(a){var z
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"$5","K4",10,0,null,273,[],162,[],292,[],291,[],293,[]],
+bM:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
 if(!!z.$isYN||!!z.$isI0||!!z.$ishy)return a
-return},
-pN:function(a,b){var z,y
+return},"$1","ay",2,0,null,273,[]],
+pN:[function(a,b){var z,y
 z=J.x(a)
 if(!!z.$iscv)return M.F5(a,b)
 if(!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},
-F5:function(a,b){var z,y,x
+if(y!=null)return["text",y]}return},"$2","vw",4,0,null,273,[],291,[]],
+F5:[function(a,b){var z,y,x
 z={}
 z.a=null
 z.b=!1
@@ -15859,8 +16004,8 @@
 if(y==null){x=[]
 z.a=x
 y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},
-Iu:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
+y.push(M.F4("{{}}","bind",a,b))}return z.a},"$2","OT",4,0,null,142,[],291,[]],
+Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 for(z=J.U6(a),y=d!=null,x=!!J.x(b).$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
 u=z.t(a,w+1)
 t=u.gEJ()
@@ -15889,8 +16034,8 @@
 t.push(L.Sk(j,l,null))}o.wE(0)
 p=o
 s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},
-F4:function(a,b,c,d){var z,y,x,w,v,u,t,s
+if(y)d.push(i)}},"$4","NJ",6,2,null,85,298,[],273,[],292,[],293,[]],
+F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s
 z=a.length
 if(z===0)return
 for(y=d==null,x=J.U6(a),w=null,v=0;v<z;){u=x.XU(a,"{{",v)
@@ -15905,14 +16050,14 @@
 v=t+2}if(v===z)w.push("")
 z=new M.HS(w,null)
 z.Yn(w)
-return z},
-SH:function(a,b){var z,y
+return z},"$4","jF",8,0,null,94,[],12,[],273,[],291,[]],
+SH:[function(a,b){var z,y
 z=a.firstChild
 if(z==null)return
 y=new M.yp(z,a.lastChild,b)
 for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},
-Ky:function(a){var z,y,x,w
+z=z.nextSibling}},"$2","St",4,0,null,220,[],292,[]],
+Ky:[function(a){var z,y,x,w
 z=$.rw()
 z.toString
 y=H.VK(a,"expando$values")
@@ -15926,12 +16071,12 @@
 else w=!0
 x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
 z.u(0,a,x)
-return x},
-wR:function(a){var z=J.x(a)
+return x},"$1","La",2,0,null,273,[]],
+wR:[function(a){var z=J.x(a)
 if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
 else z=!0
 else z=!1
-return z},
+return z},"$1","xS",2,0,null,211,[]],
 V2:{
 "^":"TU;N1,mD,Ck",
 Z1:function(a,b,c,d){var z,y,x,w,v
@@ -15980,8 +16125,8 @@
 this.Ca.ed()
 X.TR.prototype.cO.call(this,this)}},
 DO:{
-"^":"Tp:22;",
-$0:function(){var z,y,x,w,v
+"^":"Tp:115;",
+$0:[function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
 y.st5(z,"checkbox")
@@ -15994,15 +16139,15 @@
 v=document.createEvent("MouseEvent")
 J.e2(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
 z.dispatchEvent(v)
-return x.length===1?C.mt:C.Nm.gtH(x)},
+return x.length===1?C.mt:C.Nm.gtH(x)},"$0",null,0,0,null,"call"],
 $isEH:true},
 fTP:{
-"^":"Tp:16;a",
-$1:[function(a){this.a.push(C.T1)},"$1",null,2,0,null,7,[],"call"],
+"^":"Tp:116;a",
+$1:[function(a){this.a.push(C.pi)},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ppY:{
-"^":"Tp:16;b",
-$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,7,[],"call"],
+"^":"Tp:116;b",
+$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 NP:{
 "^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
@@ -16011,8 +16156,8 @@
 J.ta(z,a==null?"":H.d(a))},
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"$1","gqf",2,0,26,7,[]]},
-Vh:{
+O.Y3()},"$1","gqf",2,0,169,21,[]]},
+jt:{
 "^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
 EC:function(a){var z=X.TR.prototype.gH.call(this)
@@ -16022,8 +16167,8 @@
 J.ta(this.xS,z)
 if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
 x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
-if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,26,7,[]],
-static:{kv:function(a){var z,y,x
+if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,169,21,[]],
+static:{kv:[function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
 z.toString
@@ -16031,10 +16176,10 @@
 return z.ev(z,new M.r0(a))}else{y=M.bM(a)
 if(y==null)return C.xD
 x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.jz(a))}}}},
+return x.ev(x,new M.jz(a))}},"$1","VE",2,0,null,142,[]]}},
 r0:{
-"^":"Tp:16;a",
-$1:function(a){var z,y
+"^":"Tp:116;a",
+$1:[function(a){var z,y
 z=this.a
 y=J.x(a)
 if(!y.n(a,z))if(!!y.$isMi)if(a.type==="radio"){y=a.name
@@ -16042,12 +16187,12 @@
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},
+return z},"$1",null,2,0,null,295,[],"call"],
 $isEH:true},
 jz:{
-"^":"Tp:16;b",
-$1:function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},
+"^":"Tp:116;b",
+$1:[function(a){var z=J.x(a)
+return!z.n(a,this.b)&&z.gMB(a)==null},"$1",null,2,0,null,295,[],"call"],
 $isEH:true},
 SA:{
 "^":"b2i;Dh,Ca,qP,ZY,xS,PB,eS,ay",
@@ -16076,18 +16221,18 @@
 y=J.x(z)
 if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"$1","gqf",2,0,26,7,[]],
+J.ta(this.xS,z)}},"$1","gqf",2,0,169,21,[]],
 $isSA:true,
-static:{qb:function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
-return typeof a==="number"&&Math.floor(a)===a?a:0}}},
+static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
+return typeof a==="number"&&Math.floor(a)===a?a:0},"$1","v7",2,0,null,30,[]]}},
 hB:{
-"^":"Tp:75;a",
+"^":"Tp:300;a",
 $2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,231,[],328,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,28,[],564,[],"call"],
 $isEH:true},
 nv:{
-"^":"Tp:16;",
-$1:function(a){return 0},
+"^":"Tp:116;",
+$1:[function(a){return 0},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 ee:{
 "^":"V2;N1,mD,Ck",
@@ -16095,7 +16240,8 @@
 Z1:function(a,b,c,d){var z,y,x
 z=J.x(b)
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
+y=this.gN1()
+J.MV(!!J.x(y).$isTU?y:this,b)
 J.Vs(this.N1).Rz(0,b)
 y=this.gCd(this)
 if(z.n(b,"value")){z=this.N1
@@ -16105,7 +16251,7 @@
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}else{z=this.N1
 x=d!=null?d:""
-x=new M.Vh(null,z,c,null,null,"checked",x)
+x=new M.jt(null,z,c,null,null,"checked",x)
 x.Og(z,"checked",c,d)
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}y.u(0,b,z)
@@ -16127,9 +16273,10 @@
 for(z=this.gCd(this),z=z.gUQ(z),z=P.F(z,!0,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!=null)J.wC(y)}this.mD=null},
 gCd:function(a){var z=this.mD
-if(z==null){z=P.L5(null,null,null,P.qU,X.TR)
+if(z==null){z=P.L5(null,null,null,J.O,X.TR)
 this.mD=z}return z},
-glN:function(){return!!J.x(this.gN1()).$isTU?this.gN1():this},
+glN:function(){var z=this.gN1()
+return!!J.x(z).$isTU?z:this},
 $isTU:true},
 yp:{
 "^":"a;rg,Ug,k8<"},
@@ -16140,7 +16287,8 @@
 if(J.de(b,"selectedindex"))b="selectedIndex"
 z=J.x(b)
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
+z=this.gN1()
+J.MV(!!J.x(z).$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
 y=this.N1
@@ -16263,7 +16411,7 @@
 return!0},
 Sy:function(){return this.wh(null)},
 $isDT:true,
-static:{"^":"mn,EW,Sf,To",Fz:function(a,b){var z,y,x
+static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
 z=J.Lh(b,a,!1)
 y=J.x(z)
 if(!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
@@ -16271,13 +16419,13 @@
 else y=!1
 if(y)return z
 for(x=J.Q8(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},TA:function(a){var z,y,x,w
+return z},"$2","Tkw",4,0,null,273,[],294,[]],TA:[function(a){var z,y,x,w
 z=J.VN(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
 if(y==null){y=z.implementation.createHTMLDocument("")
 for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},eX:function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"$1","lA",2,0,null,270,[]],eX:[function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gKV(a).insertBefore(y,a)
@@ -16291,25 +16439,25 @@
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
-break}}return y},KE:function(a,b,c){var z,y,x,w
+break}}return y},"$1","Bw",2,0,null,295,[]],KE:[function(a,b,c){var z,y,x,w
 z=J.G6(a)
 if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},GM:function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},"$3","BZ",6,0,null,270,[],295,[],296,[]],GM:[function(a){var z,y
 z=new M.OB()
 y=J.MK(a,$.cz())
 if(M.wR(a))z.$1(a)
-y.aN(y,z)},oR:function(){if($.To===!0)return
+y.aN(y,z)},"$1","DR",2,0,null,297,[]],oR:[function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
 J.c9(z,H.d($.cz())+" { display: none; }")
-document.head.appendChild(z)}}},
+document.head.appendChild(z)},"$0","Lv",0,0,null]}},
 OB:{
-"^":"Tp:26;",
-$1:function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},
+"^":"Tp:169;",
+$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},"$1",null,2,0,null,270,[],"call"],
 $isEH:true},
 lP:{
-"^":"Tp:16;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,158,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,376,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
@@ -16329,8 +16477,8 @@
 this.ud=null},
 $isTR:true},
 NW:{
-"^":"Tp:75;a,b,c,d",
-$2:function(a,b){var z,y,x,w
+"^":"Tp:300;a,b,c,d",
+$2:[function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)if(z.n(a,"if")){this.a.b=!0
 if(b==="")b="{{}}"}else if(z.n(a,"bind")||z.n(a,"repeat")){this.a.c=!0
@@ -16341,7 +16489,7 @@
 z.a=w
 z=w}else z=x
 z.push(a)
-z.push(y)}},
+z.push(y)}},"$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 HS:{
 "^":"a;EJ<,PU",
@@ -16360,7 +16508,7 @@
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"$1","gBg",2,0,329,27,[]],
+return y+H.d(z[3])},"$1","gBg",2,0,565,30,[]],
 DJ:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
@@ -16370,7 +16518,7 @@
 u=w+2
 if(u>=z.length)return H.e(z,u)
 t=z[u]
-y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,330,331,[]],
+y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,566,567,[]],
 Yn:function(a){this.PU=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
 "^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -16391,12 +16539,12 @@
 u=this.eD
 v.push(L.Sk(z,u,null))
 w.wE(0)}this.FS=w.gUj(w).yI(new M.R7(this))
-this.Az(w.gP(w))},"$0","gjM",0,0,22],
+this.Az(w.gP(w))},"$0","gjM",0,0,115],
 Az:function(a){var z,y,x,w
 z=this.xG
 this.Gb()
 y=J.x(a)
-if(!!y.$iszM){this.xG=a
+if(!!y.$isList){this.xG=a
 x=a}else if(!!y.$isQV){x=y.br(a)
 this.xG=x}else{this.xG=null
 x=null}if(x!=null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
@@ -16471,7 +16619,7 @@
 k=null}else{m=[]
 if(this.DO!=null)o=this.Mv(o)
 k=o!=null?z.a5(o,x,m):null
-l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,332,333,[]],
+l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,568,264,[]],
 uS:function(a){var z
 for(z=J.GP(a);z.G();)J.wC(z.gl())},
 Gb:function(){var z=this.IY
@@ -16488,21 +16636,21 @@
 this.FS=null}this.e9.kr=null
 this.pq=!0}},
 VU:{
-"^":"Tp:16;",
-$1:[function(a){return[a]},"$1",null,2,0,null,231,[],"call"],
+"^":"Tp:116;",
+$1:[function(a){return[a]},"$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:334;a",
+"^":"Tp:569;a",
 $1:[function(a){var z,y,x
 z=J.U6(a)
 y=z.t(a,0)
 x=z.t(a,1)
 if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"$1",null,2,0,null,331,[],"call"],
+return this.a?y:[y]},"$1",null,2,0,null,567,[],"call"],
 $isEH:true},
 R7:{
-"^":"Tp:16;b",
-$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,128,[],"call"],
+"^":"Tp:116;b",
+$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,353,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
@@ -16528,7 +16676,8 @@
 gN1:function(){return this.N1},
 Z1:function(a,b,c,d){var z,y,x
 if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-J.MV(!!J.x(this.gN1()).$isTU?this.gN1():this,b)
+z=this.gN1()
+J.MV(!!J.x(z).$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
 y=this.N1
@@ -16566,18 +16715,18 @@
 this.EC(J.Vm(this.xS))},
 $isTR:true},
 VD:{
-"^":"Tp:16;a",
+"^":"Tp:116;a",
 $1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,128,[],"call"],
+return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,353,[],"call"],
 $isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
 "^":"",
 I5:{
-"^":["xI;tY-108,Pe-109,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.Ye]},
 static:{cF:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
@@ -16586,21 +16735,21 @@
 a.X0=w
 C.V8.ZL(a)
 C.V8.oX(a)
-return a},null,null,0,0,22,"new VMRefElement$created"]}},
-"+VMRefElement":[110]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
+return a},null,null,0,0,115,"new VMRefElement$created"]}},
+"+VMRefElement":[342]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
 "^":"",
-SC:{
-"^":["V32;ID%-80,lc%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-102",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzf:[function(a){return a.ID},null,null,1,0,281,"vm",82,104],
-szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,336,27,[],"vm",82],
-gkc:[function(a){return a.lc},null,null,1,0,297,"error",82,104],
-skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,298,27,[],"error",82],
-pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,26,106,[],"refresh"],
+en:{
+"^":["V36;ID%-317,lc%-570,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzf:[function(a){return a.ID},null,null,1,0,522,"vm",308,311],
+szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,571,30,[],"vm",308],
+gkc:[function(a){return a.lc},null,null,1,0,536,"error",308,311],
+skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,537,30,[],"error",308],
+pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
 "@":function(){return[C.Hk]},
 static:{oH:[function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,P.qU,W.I0)
-x=P.qU
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SO=z
@@ -16608,28 +16757,34 @@
 a.X0=w
 C.nt.ZL(a)
 C.nt.oX(a)
-return a},null,null,0,0,22,"new VMViewElement$created"]}},
-"+VMViewElement":[337],
-V32:{
+return a},null,null,0,0,115,"new VMViewElement$created"]}},
+"+VMViewElement":[572],
+V36:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
-P.qU.$isqU=true
-P.qU.$isTx=true
-P.qU.$asTx=[P.qU]
-P.qU.$isa=true
-P.lf.$isTx=true
-P.lf.$asTx=[P.lf]
-P.lf.$isa=true
-P.KN.$isKN=true
-P.KN.$isTx=true
-P.KN.$asTx=[P.lf]
-P.KN.$isa=true
-P.CP.$isCP=true
-P.CP.$isTx=true
-P.CP.$asTx=[P.lf]
-P.CP.$isa=true
+J.O.$isString=true
+J.O.$isTx=true
+J.O.$asTx=[J.O]
+J.O.$isa=true
+J.P.$isTx=true
+J.P.$asTx=[J.P]
+J.P.$isa=true
+J.bU.$isint=true
+J.bU.$isTx=true
+J.bU.$asTx=[J.P]
+J.bU.$isTx=true
+J.bU.$asTx=[J.P]
+J.bU.$isTx=true
+J.bU.$asTx=[J.P]
+J.bU.$isa=true
+J.Pp.$isdouble=true
+J.Pp.$isTx=true
+J.Pp.$asTx=[J.P]
+J.Pp.$isTx=true
+J.Pp.$asTx=[J.P]
+J.Pp.$isa=true
 W.KV.$isKV=true
 W.KV.$isD0=true
 W.KV.$isa=true
@@ -16643,9 +16798,9 @@
 P.a6.$isTx=true
 P.a6.$asTx=[P.a6]
 P.a6.$isa=true
-P.zM.$iszM=true
-P.zM.$isQV=true
-P.zM.$isa=true
+J.Q.$isList=true
+J.Q.$isQV=true
+J.Q.$isa=true
 P.Od.$isa=true
 P.a.$isa=true
 W.cv.$iscv=true
@@ -16685,8 +16840,8 @@
 P.wv.$isa=true
 T.yj.$isyj=true
 T.yj.$isa=true
-P.a2.$isa2=true
-P.a2.$isa=true
+J.kn.$isbool=true
+J.kn.$isa=true
 W.OJ.$isea=true
 W.OJ.$isa=true
 A.XP.$isXP=true
@@ -16735,9 +16890,9 @@
 W.ea.$isa=true
 P.qh.$isqh=true
 P.qh.$isa=true
-W.Aj.$isAj=true
-W.Aj.$isea=true
-W.Aj.$isa=true
+W.Wp.$isWp=true
+W.Wp.$isea=true
+W.Wp.$isa=true
 G.DA.$isDA=true
 G.DA.$isa=true
 M.Ya.$isa=true
@@ -16845,14 +17000,14 @@
 P.QV.$isa=true
 P.nP.$isnP=true
 P.nP.$isa=true
+P.b8.$isb8=true
+P.b8.$isa=true
 P.iP.$isiP=true
 P.iP.$isTx=true
 P.iP.$asTx=[null]
 P.iP.$isa=true
 P.fIm.$isfIm=true
 P.fIm.$isa=true
-P.b8.$isb8=true
-P.b8.$isa=true
 O.Qb.$isQb=true
 O.Qb.$isa=true
 D.fJ.$isfJ=true
@@ -16891,10 +17046,10 @@
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
 return J.ks(a)}
-J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
+J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.bU.prototype
 return J.Pp.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.Jh.prototype
-if(typeof a=="boolean")return J.yEe.prototype
+if(typeof a=="boolean")return J.kn.prototype
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
@@ -16916,6 +17071,7 @@
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EY=function(a,b){return J.RE(a).od(a,b)}
 J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
+J.Eh=function(a,b){return J.Wx(a).O(a,b)}
 J.Ew=function(a){return J.RE(a).gSw(a)}
 J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
 J.F6=function(a,b){return J.RE(a).stD(a,b)}
@@ -16964,11 +17120,11 @@
 J.No=function(a,b){return J.RE(a).sR(a,b)}
 J.O2=function(a,b){return J.RE(a).Ch(a,b)}
 J.O6=function(a){return J.RE(a).goc(a)}
+J.OBt=function(a){return J.RE(a).gfg(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
 J.OS=function(a,b){return J.w1(a).tt(a,b)}
 J.Or=function(a){return J.RE(a).yx(a)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
-J.Pz=function(a,b){return J.RE(a).szZ(a,b)}
 J.Q5=function(a){return J.RE(a).gwl(a)}
 J.Q8=function(a){return J.RE(a).gp8(a)}
 J.QC=function(a){return J.w1(a).wg(a)}
@@ -17009,6 +17165,7 @@
 J.Xf=function(a,b){return J.RE(a).oo(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
 J.Y8=function(a,b,c){return J.w1(a).UZ(a,b,c)}
+J.YD=function(a){return J.RE(a).gR(a)}
 J.YP=function(a){return J.RE(a).gQ7(a)}
 J.YV=function(a){return J.RE(a).goE(a)}
 J.Yl=function(a){return J.w1(a).np(a)}
@@ -17020,11 +17177,11 @@
 J.aK=function(a,b,c){return J.U6(a).XU(a,b,c)}
 J.ak=function(a){return J.RE(a).gNF(a)}
 J.am=function(a){return J.RE(a).VD(a)}
+J.bB=function(a){return J.x(a).gbx(a)}
 J.bY=function(a,b){return J.Wx(a).Y(a,b)}
 J.bd=function(a,b){return J.RE(a).sBu(a,b)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
 J.bs=function(a){return J.RE(a).JP(a)}
-J.c1=function(a,b){return J.Wx(a).O(a,b)}
 J.c9=function(a,b){return J.RE(a).sa4(a,b)}
 J.cG=function(a){return J.RE(a).Ki(a)}
 J.cR=function(a,b){return J.Wx(a).WZ(a,b)}
@@ -17037,20 +17194,20 @@
 J.dk=function(a,b){return J.RE(a).sMj(a,b)}
 J.e2=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
 J.eI=function(a,b){return J.RE(a).bA(a,b)}
-J.eY=function(a){return J.RE(a).gR(a)}
 J.f5=function(a){return J.RE(a).gI(a)}
 J.fH=function(a,b){return J.RE(a).stT(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.fi=function(a,b){return J.RE(a).ps(a,b)}
 J.i4=function(a,b){return J.w1(a).Zv(a,b)}
+J.iF=function(a,b){return J.RE(a).szZ(a,b)}
 J.iS=function(a){return J.RE(a).gox(a)}
 J.iZ=function(a){return J.RE(a).gzZ(a)}
+J.ja=function(a,b){return J.w1(a).Vr(a,b)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
 J.kE=function(a,b){return J.U6(a).tg(a,b)}
 J.kH=function(a,b){return J.w1(a).aN(a,b)}
 J.kW=function(a,b,c){if((a.constructor==Array||H.wV(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
 return J.w1(a).u(a,b,c)}
-J.kd=function(a){return J.RE(a).gfg(a)}
 J.kl=function(a,b){return J.w1(a).ez(a,b)}
 J.kq=function(a,b){return J.RE(a).sF1(a,b)}
 J.ky=function(a,b,c){return J.RE(a).dR(a,b,c)}
@@ -17060,7 +17217,6 @@
 J.m4=function(a){return J.RE(a).gig(a)}
 J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
 return J.Wx(a).i(a,b)}
-J.nG=function(a,b){return J.RE(a).vV(a,b)}
 J.nJ=function(a){return J.RE(a).ga4(a)}
 J.oE=function(a,b){return J.Qc(a).iM(a,b)}
 J.oJ=function(a,b){return J.RE(a).srs(a,b)}
@@ -17068,13 +17224,13 @@
 J.on=function(a){return J.RE(a).gtT(a)}
 J.pO=function(a){return J.U6(a).gor(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
-J.pb=function(a,b){return J.w1(a).Vr(a,b)}
 J.pe=function(a,b){return J.RE(a).pr(a,b)}
 J.q8=function(a){return J.U6(a).gB(a)}
 J.qA=function(a){return J.w1(a).br(a)}
 J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.qK=function(a,b){return J.RE(a).aJ(a,b)}
 J.qd=function(a,b,c,d){return J.RE(a).aC(a,b,c,d)}
+J.qz=function(a){return J.RE(a).gPw(a)}
 J.r4=function(a){return J.RE(a).pj(a)}
 J.rK=function(a,b){return J.RE(a).szf(a,b)}
 J.rP=function(a,b){return J.RE(a).sTq(a,b)}
@@ -17106,6 +17262,7 @@
 J.xR=function(a){return J.RE(a).ghf(a)}
 J.xq=function(a){return J.RE(a).gUj(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
+J.yn=function(a,b){return J.RE(a).vV(a,b)}
 J.yxg=function(a){return J.RE(a).gGd(a)}
 J.z2=function(a){return J.RE(a).gG1(a)}
 J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
@@ -17113,16 +17270,17 @@
 J.zH=function(a){return J.RE(a).gt5(a)}
 J.zJ=function(a){return J.RE(a).aA(a)}
 J.zj=function(a){return J.RE(a).gvH(a)}
+C.Uy=X.hV.prototype
 C.J0=B.pz.prototype
 C.ae=A.iL.prototype
 C.oq=Q.Tg.prototype
 C.ka=Z.Jc.prototype
 C.IK=O.CN.prototype
-C.YD=F.Be.prototype
+C.ux=F.Be.prototype
 C.j8=R.i6.prototype
 C.O0=R.lw.prototype
 C.OD=F.Ir.prototype
-C.Gh=L.bf.prototype
+C.Gh=L.rm.prototype
 C.UF=R.Lt.prototype
 C.MC=D.UL.prototype
 C.LT=A.jM.prototype
@@ -17133,19 +17291,23 @@
 C.W3=W.zU.prototype
 C.cp=B.pR.prototype
 C.pU=Z.hx.prototype
+C.wQ=D.YA.prototype
+C.rC=D.Yj.prototype
 C.RR=A.Mv.prototype
 C.kS=X.E7.prototype
 C.LN=N.oO.prototype
+C.F2=D.IWF.prototype
+C.kd=D.Oz.prototype
 C.Qt=D.Stq.prototype
 C.Xe=L.qkb.prototype
 C.Nm=J.Q.prototype
 C.ON=J.Pp.prototype
-C.jn=J.imn.prototype
+C.jn=J.bU.prototype
 C.jN=J.Jh.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
 C.Yt=Z.vj.prototype
-C.ct=A.Zt.prototype
+C.ct=A.oM.prototype
 C.Z3=R.LU.prototype
 C.MG=M.KL.prototype
 C.S2=W.H9.prototype
@@ -17160,8 +17322,8 @@
 C.zb=A.XP.prototype
 C.Iv=A.xc.prototype
 C.Cc=Q.NQ.prototype
-C.HD=T.ov.prototype
-C.c0=A.kn.prototype
+C.HD=T.SM.prototype
+C.c0=A.knI.prototype
 C.cJ=U.fI.prototype
 C.SX=R.zMr.prototype
 C.Vd=D.nk.prototype
@@ -17173,30 +17335,40 @@
 C.lx=A.tz.prototype
 C.vB=J.is.prototype
 C.V8=X.I5.prototype
-C.nt=U.SC.prototype
+C.nt=U.en.prototype
 C.ol=W.u9.prototype
 C.KZ=new H.hJ()
 C.OL=new U.EZ()
 C.Gw=new H.yq()
+C.E3=new J.Q()
+C.Fm=new J.kn()
+C.yX=new J.Pp()
+C.c1=new J.bU()
+C.x0=new J.Jh()
+C.oD=new J.P()
+C.Kn=new J.O()
 C.J19=new K.ndx()
 C.IU=new P.TO()
 C.Us=new A.yL()
 C.Nw=new K.vly()
 C.Wj=new P.JF()
 C.xd=new A.Mh()
-C.vT=new P.mg()
+C.OY=new P.mg()
 C.NU=new P.R8()
-C.v8=new P.nU()
+C.v8=new P.AHi()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.nj=new D.WAE("Native")
 C.yP=new D.WAE("Reused")
 C.oA=new D.WAE("Tag")
+C.F9=new A.V3("action-link")
 C.vr3=new A.V3("service-exception-view")
+C.Ux=new A.V3("isolate-location")
 C.Br=new A.V3("observatory-element")
 C.dA=new A.V3("heap-profile")
 C.I3=new A.V3("script-view")
 C.XG=new A.V3("nav-refresh")
+C.Bd=new A.V3("isolate-counter-chart")
 C.E6=new A.V3("field-ref")
 C.aM=new A.V3("isolate-summary")
 C.Is=new A.V3("response-viewer")
@@ -17215,11 +17387,12 @@
 C.Hk=new A.V3("vm-view")
 C.Oyb=new A.V3("library-view")
 C.H3=new A.V3("code-ref")
-C.hr=new A.V3("top-nav-menu")
+C.NT=new A.V3("top-nav-menu")
 C.js=new A.V3("stack-trace")
 C.Ur=new A.V3("script-ref")
 C.tSc=new A.V3("class-ref")
-C.PT=new A.V3("breakpoint-list")
+C.Po=new A.V3("isolate-shared-summary")
+C.jy=new A.V3("breakpoint-list")
 C.VW=new A.V3("instance-ref")
 C.Ye=new A.V3("vm-ref")
 C.Gu=new A.V3("collapsible-content")
@@ -17227,10 +17400,11 @@
 C.kR=new A.V3("observatory-application")
 C.uvO=new A.V3("service-error-view")
 C.Qz=new A.V3("eval-box")
-C.oD=new A.V3("isolate-nav-menu")
-C.iF=new A.V3("class-nav-menu")
+C.zaS=new A.V3("isolate-nav-menu")
+C.qJ=new A.V3("class-nav-menu")
 C.uW=new A.V3("error-view")
 C.u7=new A.V3("nav-menu")
+C.Xuf=new A.V3("isolate-run-state")
 C.KH=new A.V3("json-view")
 C.j6=new A.V3("isolate-ref")
 C.o3=new A.V3("function-ref")
@@ -17239,17 +17413,17 @@
 C.JD=new A.V3("service-ref")
 C.nW=new A.V3("nav-bar")
 C.DKS=new A.V3("curly-block")
-C.be=new A.V3("instance-view")
+C.qlk=new A.V3("instance-view")
 C.ny=new P.a6(0)
-C.mt=H.VM(new W.e0("change"),[W.ea])
-C.T1=H.VM(new W.e0("click"),[W.Aj])
-C.MD=H.VM(new W.e0("error"),[W.ew])
-C.PP=H.VM(new W.e0("hashchange"),[W.ea])
-C.i3=H.VM(new W.e0("input"),[W.ea])
-C.fK=H.VM(new W.e0("load"),[W.ew])
-C.Ns=H.VM(new W.e0("message"),[W.cx])
-C.DK=H.VM(new W.e0("mousedown"),[W.Aj])
-C.W2=H.VM(new W.e0("mousemove"),[W.Aj])
+C.mt=H.VM(new W.UC("change"),[W.ea])
+C.pi=H.VM(new W.UC("click"),[W.Wp])
+C.MD=H.VM(new W.UC("error"),[W.ew])
+C.PP=H.VM(new W.UC("hashchange"),[W.ea])
+C.i3=H.VM(new W.UC("input"),[W.ea])
+C.fK=H.VM(new W.UC("load"),[W.ew])
+C.Ns=H.VM(new W.UC("message"),[W.cx])
+C.DK=H.VM(new W.UC("mousedown"),[W.Wp])
+C.W2=H.VM(new W.UC("mousemove"),[W.Wp])
 C.Mc=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -17402,7 +17576,7 @@
 C.Me=H.VM(I.makeConstantList([]),[P.Ms])
 C.dn=H.VM(I.makeConstantList([]),[P.tg])
 C.hU=H.VM(I.makeConstantList([]),[P.X9])
-C.iH=H.VM(I.makeConstantList([]),[P.KN])
+C.iH=H.VM(I.makeConstantList([]),[J.bU])
 C.xD=I.makeConstantList([])
 C.Qy=I.makeConstantList(["in","this"])
 C.Ym=I.makeConstantList(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
@@ -17414,8 +17588,8 @@
 C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.jH)
 C.uS=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
-C.p5=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
+C.a5k=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
+C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.a5k)
 C.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
 C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
 C.CM=new H.LPe(0,{},C.xD)
@@ -17462,7 +17636,7 @@
 C.WG=new H.GD("formattedCollections")
 C.uU=new H.GD("formattedExclusiveTicks")
 C.eF=new H.GD("formattedInclusiveTicks")
-C.oI=new H.GD("formattedLine")
+C.Zt=new H.GD("formattedLine")
 C.ST=new H.GD("formattedTotalCollectionTime")
 C.QH=new H.GD("fragmentation")
 C.rE=new H.GD("frame")
@@ -17473,7 +17647,7 @@
 C.D2=new H.GD("hasParent")
 C.Ia=new H.GD("hashLinkWorkaround")
 C.lb=new H.GD("hideTagsChecked")
-C.du=new H.GD("hitStyle")
+C.wq=new H.GD("hitStyle")
 C.bA=new H.GD("hoverText")
 C.AZ=new H.GD("dart.core.String")
 C.Di=new H.GD("iconClass")
@@ -17496,6 +17670,7 @@
 C.eh=new H.GD("lineMode")
 C.Cv=new H.GD("lines")
 C.dB=new H.GD("link")
+C.jA=new H.GD("loading")
 C.dH=new H.GD("mainPort")
 C.p3=new H.GD("map")
 C.t6=new H.GD("mapAsString")
@@ -17512,8 +17687,7 @@
 C.Le=new H.GD("oldHeapCapacity")
 C.SW=new H.GD("oldHeapUsed")
 C.ZU=new H.GD("pad")
-C.wq=new H.GD("pausedOnExit")
-C.NT=new H.GD("pausedOnStart")
+C.yG=new H.GD("pauseEvent")
 C.Kl=new H.GD("pos")
 C.vb=new H.GD("profile")
 C.zc=new H.GD("qualified")
@@ -17524,7 +17698,7 @@
 C.mE=new H.GD("response")
 C.UY=new H.GD("result")
 C.Aa=new H.GD("results")
-C.iG=new H.GD("rootLib")
+C.xe=new H.GD("rootLib")
 C.X8=new H.GD("running")
 C.ok=new H.GD("dart.core.Null")
 C.md=new H.GD("dart.core.double")
@@ -17554,78 +17728,95 @@
 C.KS=new H.GD("vmName")
 C.v6=new H.GD("void")
 C.n8=H.uV('qC')
-C.WP=new H.bB(C.n8,"K",0)
+C.WP=new H.QT(C.n8,"K",0)
 C.SL=H.uV('Ae')
-C.xC=new H.bB(C.SL,"V",0)
+C.xC=new H.QT(C.SL,"V",0)
 C.QJ=H.uV('xh')
-C.wW=new H.bB(C.QJ,"T",0)
+C.wW=new H.QT(C.QJ,"T",0)
 C.Gsc=H.uV('wn')
-C.io=new H.bB(C.Gsc,"E",0)
-C.nz=new H.bB(C.n8,"V",0)
-C.RP=H.uV('hx')
-C.I7=H.uV('bf')
+C.io=new H.QT(C.Gsc,"E",0)
+C.nz=new H.QT(C.n8,"V",0)
+C.k5t=H.uV('hx')
+C.KSy=H.uV('Yj')
 C.q0S=H.uV('Dg')
 C.z6Y=H.uV('Tg')
+C.xFi=H.uV('rm')
+C.eY=H.uV('n6')
 C.J9=H.uV('zMr')
+C.Vh=H.uV('Pz')
 C.zq=H.uV('Qa')
-C.tf=H.uV('Zt')
 C.qfw=H.uV('qW')
+C.z7=H.uV('YA')
 C.GTO=H.uV('F1')
-C.wc=H.uV('kn')
 C.nY=H.uV('a')
 C.Yc=H.uV('iP')
-C.Pt=H.uV('ov')
 C.jRs=H.uV('Be')
 C.Ow=H.uV('oO')
-C.xF=H.uV('NQ')
-C.Xb=H.uV('pz')
+C.PT=H.uV('I2')
+C.p8F=H.uV('NQ')
+C.xLI=H.uV('pz')
 C.xz=H.uV('Stq')
+C.T1=H.uV('Wy')
 C.aj=H.uV('fI')
 C.Kh=H.uV('I5')
+C.lg=H.uV('hV')
+C.la=H.uV('ZX')
 C.G4=H.uV('CN')
-C.O4=H.uV('CP')
-C.yw=H.uV('KN')
+C.O4=H.uV('double')
+C.yw=H.uV('int')
 C.b7=H.uV('uwf')
 C.RcY=H.uV('aQ')
 C.KJ=H.uV('mk')
+C.ST4=H.uV('en')
 C.X6M=H.uV('jM')
+C.yiu=H.uV('knI')
 C.dUi=H.uV('Uj')
 C.U9=H.uV('UL')
+C.iG=H.uV('yc')
 C.HI=H.uV('Pg')
 C.ab=H.uV('xI')
+C.lk=H.uV('mJ')
 C.lpG=H.uV('LU')
+C.EG=H.uV('Oz')
 C.Ch=H.uV('KL')
+C.kbo=H.uV('SM')
+C.jV=H.uV('rF')
 C.OdR=H.uV('pL')
 C.cj=H.uV('E7')
-C.eB=H.uV('F1i')
+C.UNa=H.uV('F1i')
 C.wE=H.uV('vj')
 C.yB=H.uV('Mv')
 C.JW=H.uV('Ww')
 C.qo=H.uV('jY')
 C.l49=H.uV('uL')
 C.yQ=H.uV('EH')
+C.Im=H.uV('X6')
 C.FU=H.uV('lw')
+C.p5=H.uV('oM')
+C.nG=H.uV('zt')
 C.px=H.uV('tz')
 C.epC=H.uV('Jc')
-C.Xd=H.uV('b0B')
+C.eB=H.uV('IWF')
+C.JA3=H.uV('b0B')
 C.PF=H.uV('nk')
-C.Db=H.uV('qU')
-C.BP=H.uV('qkb')
+C.Db=H.uV('String')
 C.Tu=H.uV('xc')
+C.jwA=H.uV('qkb')
 C.bh=H.uV('i6')
 C.Bm=H.uV('XP')
-C.wDw=H.uV('SC')
 C.hg=H.uV('hd')
 C.Fv=H.uV('ob')
 C.Wza=H.uV('pR')
 C.leN=H.uV('Lt')
-C.HL=H.uV('a2')
-C.Qf=H.uV('L9')
+C.HL=H.uV('bool')
+C.Qf=H.uV('Null')
 C.HH=H.uV('dynamic')
 C.vVv=H.uV('iL')
 C.Gp=H.uV('cw')
 C.ri=H.uV('yy')
 C.X0=H.uV('Ir')
+C.CS=H.uV('vm')
+C.hN=H.uV('oI')
 C.R4R=H.uV('xT')
 C.xM=new P.z0(!1)
 C.hi=H.VM(new W.bO(W.pq()),[W.OJ])
@@ -17633,7 +17824,7 @@
 $.te="$cachedFunction"
 $.eb="$cachedInvocation"
 $.OK=0
-$.mJ=null
+$.bf=null
 $.P4=null
 $.Jl=!1
 $.NF=null
@@ -17661,14 +17852,14 @@
 $.uP=!0
 $.VZ="objects/"
 $.To=null
-$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","Ft","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","P9","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xe","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gI","gID","gIF","gIK","gIO","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gMz","gN","gNF","gNG","gNT","gNW","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPl","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gRw","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZf","ga1","ga3","ga4","gai","gbP","gbY","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","giX","gib","gig","gik","git","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goM","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqW","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","gu6","guD","guT","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rL","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDD","sDe","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sID","sIF","sIK","sIO","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sMz","sN","sNF","sNG","sNT","sNW","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPl","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sa1","sa3","sa4","sai","sbP","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","siX","sib","sig","sik","sit","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soM","soY","soc","sox","soy","sp8","spD","sph","sqO","sqW","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","su6","suD","suT","suw","svH","svJ","svt","swd","sx","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vD","vQ","vV","w","wB","wE","wL","wY","wg","x3","xJ","xU","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
-$.Au=[C.RP,Z.hx,{created:Z.Co},C.I7,L.bf,{created:L.Rp},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.J9,R.zMr,{created:R.hp},C.zq,A.Qa,{created:A.JR},C.tf,A.Zt,{created:A.IV},C.qfw,U.qW,{created:U.Wz},C.GTO,A.F1,{created:A.aD},C.wc,A.kn,{created:A.Th},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.xF,Q.NQ,{created:Q.Zo},C.Xb,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.X6M,A.jM,{created:A.Sy},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.eB,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Xd,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.wDw,U.SC,{created:U.oH},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
+$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","Ft","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","P9","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xe","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","ak","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE1","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gHu","gI","gID","gIF","gIK","gIO","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gKW","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gMz","gN","gNF","gNG","gNT","gNW","gNl","gNo","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gR","gRA","gRH","gRY","gRn","gRu","gRw","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gYr","gZf","ga1","ga3","ga4","gai","gbP","gbY","gbx","gcC","gdB","gdG","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","gfi","ghU","ghX","ghf","ghi","gho","ghw","gi9","giC","giF","giO","giX","gib","gig","gik","git","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goM","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqW","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","gu6","guD","guT","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxU","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","nY","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pp","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rL","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDD","sDe","sE1","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sHu","sID","sIF","sIK","sIO","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sKW","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sMz","sN","sNF","sNG","sNT","sNW","sNl","sNo","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sYr","sa1","sa3","sa4","sai","sbP","sbY","scC","sdB","sdG","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","sfi","shU","shX","shf","shi","sho","shw","siC","siF","siX","sib","sig","sik","sit","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soM","soY","soc","sox","soy","sp8","spD","sph","sqO","sqW","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","su6","suD","suT","suw","svH","svJ","svt","swd","sx","sxU","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vD","vQ","vV","w","wB","wE","wL","wY","wg","x3","xJ","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
+$.Au=[C.k5t,Z.hx,{created:Z.Co},C.KSy,D.Yj,{created:D.b2},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.J9,R.zMr,{created:R.hp},C.zq,A.Qa,{created:A.JR},C.qfw,U.qW,{created:U.Wz},C.z7,D.YA,{created:D.BP},C.GTO,A.F1,{created:A.aD},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.p8F,Q.NQ,{created:Q.Zo},C.xLI,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.lg,X.hV,{created:X.zy},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.EG,D.Oz,{created:D.RP},C.Ch,M.KL,{created:M.Ro},C.kbo,T.SM,{created:T.T5},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.UNa,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.p5,A.oM,{created:A.IV},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.eB,D.IWF,{created:D.dm},C.JA3,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.Tu,A.xc,{created:A.G7},C.jwA,L.qkb,{created:L.uD},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.lv},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
 I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
 I.$lazy($,"globalWindow","cO","C5",function(){return $.jk().window})
 I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
 I.$lazy($,"globalPostMessageDefined","Da","JU",function(){return $.jk().postMessage!==void 0})
 I.$lazy($,"thisScript","Kb","Ak",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[P.KN])})
+I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[J.bU])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.LX(H.S7({toString:function(){return"$receiver$"}}))})
 I.$lazy($,"notClosurePattern","k1","OI",function(){return H.LX(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
 I.$lazy($,"nullCallPattern","Re","PH",function(){return H.LX(H.S7(null))})
@@ -17683,7 +17874,7 @@
 I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.LX(function(){try{(void 0).$method$}catch(z){return z.message}}())})
 I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().$0()})
 I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
-I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
+I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
 I.$lazy($,"_dynamicType","QG","P8",function(){return new H.EE(C.nN)})
 I.$lazy($,"_voidType","Q3","oj",function(){return new H.EE(C.v6)})
 I.$lazy($,"librariesByName","Ct","vK",function(){return H.dF()})
@@ -17701,21 +17892,21 @@
 I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(a){this.o=a}})
 I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
 I.$lazy($,"_pageSeparationColor","RD","eK",function(){return[0,0,0,255]})
-I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(P.qU,N.TJ)})
+I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(J.O,N.TJ)})
 I.$lazy($,"_logger","G3","iU",function(){return N.Jx("Observable.dirtyCheck")})
 I.$lazy($,"objectType","XV","aA",function(){return P.re(C.nY)})
 I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.Md().$0()})
-I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR("\\s",H.v4("\\s",!1,!0,!1),null,null)})
+I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR(H.v4("\\s",!1,!0,!1),null,null)})
 I.$lazy($,"_logger","y7","aT",function(){return N.Jx("observe.PathObserver")})
-I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
-I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,P.qU,A.XP)})
-I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,P.qU,[P.zM,A.XP])})
-I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,P.qU,A.XP)})
+I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,J.O,P.uq)})
+I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,J.O,A.XP)})
+I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,J.O,[J.Q,A.XP])})
+I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,J.O,A.XP)})
 I.$lazy($,"_objectType","p0","H8",function(){return P.re(C.nY)})
 I.$lazy($,"_sheetLog","Fa","vM",function(){return N.Jx("polymer.stylesheet")})
 I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w12().$0()})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,P.qU,P.a)
+I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR(H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,J.O,P.a)
 z.FV(0,C.eu)
 return new A.HJ(z)})
 I.$lazy($,"_ready","tS","mC",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
@@ -17733,8 +17924,8 @@
 I.$lazy($,"_logger","m0","eH",function(){return N.Jx("polymer_expressions")})
 I.$lazy($,"_BINARY_OPERATORS","Af","Ra",function(){return P.EF(["+",new K.Uf(),"-",new K.wJY(),"*",new K.zOQ(),"/",new K.W6o(),"==",new K.MdQ(),"!=",new K.YJG(),">",new K.DOe(),">=",new K.lPa(),"<",new K.Ufa(),"<=",new K.Raa(),"||",new K.w0(),"&&",new K.w4(),"|",new K.w5()],null,null)})
 I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return P.EF(["+",new K.w7(),"-",new K.w10(),"!",new K.w11()],null,null)})
-I.$lazy($,"_currentIsolateMatcher","tV","PY",function(){return new H.VR("isolates/\\d+",H.v4("isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"_currentIsolateMatcher","tV","PY",function(){return new H.VR(H.v4("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR(H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.DO().$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
@@ -17742,7 +17933,7 @@
 I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
 
 init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"sender","e",{func:"pL",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"Dv",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"ny"},{func:"pB",ret:P.vr,args:[P.a]},"reflectee",{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.MN]},,"error","stackTrace",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent","zone",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},"f",{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},{func:"Ib",ret:P.a2,args:[null,null]},{func:"bX",ret:P.KN,args:[null]},"a",{func:"uJ",ret:P.a,args:[null]},"object",{func:"P2",ret:P.KN,args:[P.Tx,P.Tx]},"b",{func:"E0",ret:P.a2,args:[P.a,P.a]},{func:"Gm",ret:P.KN,args:[P.a]},{func:"K4",ret:P.KN,args:[P.qU],named:{onError:{func:"Tl",ret:P.KN,args:[P.qU]},radix:P.KN}},{func:"Tf",ret:P.qU,args:[W.D0]},"receiver",{func:"jn",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o","v",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"iterable","index","invocation",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"hF",args:[null,P.qU]},G.dZ,D.H6,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:P.qU},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event","obj",P.KN,[P.zM,G.Y2],[P.zM,P.qU],{func:"r5",ret:[P.zM,P.KN]},{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"wI",args:[P.KN,P.KN]},D.SI,[P.Z0,P.qU,W.cv],{func:"Eg",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.pv,D.af,P.a2,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},"target",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,"c",H.Tp,P.qU,{func:"Uf",ret:P.a2},{func:"zk",args:[P.a2]},"r",R.Vct,{func:"ZT",void:true,args:[null,null,null]},R.LP,{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"i",{func:"VG",ret:P.Ms,args:[P.KN]},{func:"Z5",args:[P.KN]},{func:"UC",ret:P.X9,args:[P.KN]},{func:"ag",args:[P.qU,P.qU]},"data",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","element",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each",{func:"Yz",ret:P.a2,args:[P.jp]},{func:"Tl",ret:P.KN,args:[P.qU]},{func:"Zh",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Dt",ret:P.KN,args:[P.KN]},{func:"GF",ret:P.KN,args:[null,null]},"byteString",{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"xhr","k",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[P.qU]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[P.qU]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[P.qU]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Aj]},L.WZq,"result",R.Nr,A.pva,U.rs,{func:"fO",ret:P.qU,args:[D.SI]},"function",N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:P.KN,args:[[P.QV,P.KN]]},"color",{func:"S1",void:true,args:[P.KN,P.qU,[P.QV,P.KN]]},"classId",{func:"D8",void:true,args:[null,P.KN]},"classList","freeClassId",{func:"XK",ret:[P.QV,P.KN],args:[P.KN]},{func:"D9",ret:P.qU,args:[[P.hL,P.KN]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,P.KN]]},{func:"j4",void:true,args:[P.KN]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:P.a2,args:[P.Z0]},{func:"Xb",args:[P.Z0,P.KN]},{func:"Na",ret:P.qU,args:[P.a2]},"newSpace",K.V4,{func:"iR",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[P.qU]}]},{func:"uj",ret:P.QV,args:[{func:"qt",ret:P.QV,args:[P.qU]}]},{func:"pw",void:true,args:[P.a2,null]},"expand",Z.V9,D.t9,P.CP,G.XN,{func:"nzZ",ret:P.qU,args:[G.Y2]},X.V10,"m",D.bv,D.V11,P.tU,L.Lr,L.V12,"tagProfile",Z.V13,D.U4,{func:"ax",ret:D.U4},{func:"SN",args:[D.U4]},M.V14,"rec",{func:"IM",args:[N.HV]},A.V15,A.V16,A.V17,A.V18,A.V19,"x",A.V20,A.V21,A.V22,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V23,{func:"Z8",void:true,args:[P.qU,null,null]},{func:"Pz",ret:P.qU,args:[P.CP]},"time",{func:"vI",ret:P.qU,args:[P.Z0]},"frame",{func:"h6",ret:P.a2,args:[P.qU]},"type",A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"kG",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:P.KN},{func:"Lc",ret:P.a2,args:[P.a]},{func:"DF",void:true,args:[P.a]},"records",{func:"ZD",args:[[P.zM,G.DA]]},{func:"oe",args:[[P.zM,T.yj]]},{func:"rj",void:true,args:[P.qU,P.qU]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"model","node",{func:"K7",void:true,args:[[P.zM,T.yj]]},"def",{func:"Zu",args:[P.qU,null,null]},{func:"pp",ret:U.zX,args:[U.hw,U.hw]},3,{func:"Nt",args:[U.hw]},"s",Q.V24,D.rj,[P.zM,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[P.zM,D.c2]},{func:"mRV",args:[[P.zM,D.c2]]},{func:"Yg",ret:P.qU,args:[D.c2]},"line",T.V25,A.x4,U.V26,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.H6},"map",{func:"JC",args:[V.qC]},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:P.CP},{func:"mV",args:[P.CP]},[P.Z0,P.qU,P.CP],{func:"c7",ret:V.qC},{func:"zs",ret:P.qU,args:[P.qU]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"EIX",ret:[Q.wn,D.U4]},{func:"P5",args:[[Q.wn,D.U4]]},{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[P.zM,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:P.qU,args:[D.kx]},"code",{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V27,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V28,"msg",{func:"nR",ret:Z.uL},U.V29,Q.Vfx,"details",Q.Bc,V.qC,K.V30,X.V31,"y",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.zM,P.a]]},"values",{func:"PzC",void:true,args:[[P.zM,G.DA]]},"splices",{func:"UxH",args:[P.zM]},D.pD,{func:"Af",args:[D.H6]},U.V32,];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","charCode","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isSuperCall","stubName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"ny"},{func:"Dv",args:[null]},"_","a","total","pad",{func:"Pt",ret:J.O,args:[J.bU]},"v","time","bytes",{func:"RJ",ret:J.O,args:[null]},{func:"kl",void:true},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","fields","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map",{func:"n9",void:true,args:[{func:"kl",void:true}]},"callback","errorHandler","zone","listeners","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,J.O]},"line",{func:"kx",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bX",ret:J.bU,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","indent",{func:"P2",ret:J.bU,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"Gm",ret:J.bU,args:[P.a]},{func:"K4",ret:J.bU,args:[J.O],named:{onError:{func:"Tl",ret:J.bU,args:[J.O]},radix:J.bU}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","length","createProxy","mustCopy","nativeImageData","imageData","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","val",{func:"bh",args:[null,null]},{func:"Za",args:[J.O,null]},"parameter",{func:"hF",args:[null,J.O]},J.kn,J.O,[P.Z0,J.O,W.cv],{func:"Uf",ret:J.kn},C.Nw,C.J19,{func:"zk",args:[J.kn]},C.Us,{func:"I0",ret:J.O},{func:"ZT",void:true,args:[null,null,null]},X.LP,H.Tp,G.dZ,D.zM,{func:"Wy",ret:D.bv},{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event",J.bU,[J.Q,G.Y2],[J.Q,J.O],{func:"r5",ret:[J.Q,J.bU]},{func:"qE",ret:J.O,args:[J.bU,J.bU]},"row","column",{func:"wI",args:[J.bU,J.bU]},"i","j",D.SI,{func:"Eg",ret:D.SI},{func:"Q5",args:[D.SI]},"done",B.pv,D.af,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},"dummy",Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,"r",R.Vct,R.Nr,"library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"typeArgument","tv",{func:"VG",ret:P.Ms,args:[J.bU]},{func:"Z5",args:[J.bU]},{func:"UC",ret:P.X9,args:[J.bU]},"reflectiveName",{func:"ag",args:[J.O,J.O]},{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each","k",{func:"Yz",ret:J.kn,args:[P.jp]},"matched",{func:"Tl",ret:J.bU,args:[J.O]},{func:"Zh",ret:J.Pp,args:[J.O]},"ch",{func:"cd",ret:J.kn,args:[J.bU]},{func:"Dt",ret:J.bU,args:[J.bU]},"digit","part",{func:"GF",ret:J.bU,args:[null,null]},"byteString",{func:"HE",ret:J.bU,args:[J.bU,J.bU]},"byte","buffer","xhr","header","prevValue",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.WZq,R.Bc,A.pva,U.rs,{func:"fO",ret:J.O,args:[D.SI]},N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.bU,args:[[P.QV,J.bU]]},"color",{func:"S1",void:true,args:[J.bU,J.O,[P.QV,J.bU]]},"classId",{func:"D8",void:true,args:[null,J.bU]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.bU],args:[J.bU]},{func:"D9",ret:J.O,args:[[P.hL,J.bU]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,J.bU]]},{func:"j4",void:true,args:[J.bU]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.bU]},{func:"Yi",ret:J.O,args:[J.kn]},"newSpace",K.V4,{func:"iR",args:[J.bU,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[J.O]}]},{func:"uj",ret:P.QV,args:[{func:"qt",ret:P.QV,args:[J.O]}]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V9,D.t9,J.Pp,G.XN,{func:"nzZ",ret:J.O,args:[G.Y2]},X.V10,D.bv,D.V11,{func:"KD",ret:P.b8,args:[null]},D.V12,D.V13,D.V14,V.qC,D.vT,{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},D.V15,P.tU,L.Lr,L.V16,"tagProfile",Z.V17,D.U4,{func:"ax",ret:D.U4},{func:"SN",args:[D.U4]},M.V18,"rec",{func:"IM",args:[N.HV]},A.V19,A.V20,A.V21,A.V22,A.V23,A.V24,A.V25,A.V26,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V27,{func:"Z8",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.Pp]},{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"kG",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:J.bU},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"ZD",args:[[J.Q,G.DA]]},{func:"oe",args:[[J.Q,T.yj]]},"onName","eventType",{func:"rj",void:true,args:[J.O,J.O]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"pair","p",{func:"YT",void:true,args:[[J.Q,T.yj]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"PO",ret:U.zX,args:[U.hw,U.hw]},"h","item",3,{func:"Qc",args:[U.hw]},Q.V28,D.rj,[J.Q,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[J.Q,D.c2]},{func:"mRV",args:[[J.Q,D.c2]]},{func:"Yg",ret:J.O,args:[D.c2]},T.V29,A.x4,U.V30,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:J.Pp},{func:"mV",args:[J.Pp]},"isolateId",[P.Z0,J.O,J.Pp],{func:"zs",ret:J.O,args:[J.O]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"EIX",ret:[Q.wn,D.U4]},{func:"P5",args:[[Q.wn,D.U4]]},{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[J.Q,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V31,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V32,{func:"nR",ret:Z.uL},U.V33,Q.Vfx,"details",Q.LPc,K.V34,X.V35,"y",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"UxH",args:[J.Q]},D.pD,{func:"Af",args:[D.zM]},U.V36,];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html
index c31adc5..03550ef 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
 <html>
 <head>
+  <link rel="import" href="src/elements/action_link.html">
   <link rel="import" href="src/elements/breakpoint_list.html">
   <link rel="import" href="src/elements/class_ref.html">
   <link rel="import" href="src/elements/class_view.html">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html
new file mode 100644
index 0000000..7c1974f
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html
@@ -0,0 +1,26 @@
+<head>
+  <link rel="import" href="instance_ref.html">
+</head>
+<polymer-element name="action-link">
+  <template>
+    <style>
+      .idle {
+        color: #0489c3;
+        cursor: pointer;
+      }
+      .busy {
+        color: #aaa;
+        cursor: wait;
+      }
+    </style>
+
+    <template if="{{ busy }}">
+      <span class="busy">[{{ label }}]</span>
+    </template>
+    <template if="{{ !busy }}">
+      <span class="idle"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+    </template>
+
+  </template>
+  <script type="application/dart" src="action_link.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css
index 3245eb2..06f2c11 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css
@@ -142,7 +142,7 @@
   flex-basis: 33.3333%;
 }
 
-.flex-item-fixed-6-12 {
+.flex-item-fixed-6-12, .flex-item-50-percent {
   flex-grow: 0;
   flex-shrink: 0;
   flex-basis: 50%;
@@ -167,6 +167,54 @@
   flex-basis: 100%;
 }
 
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
 .well {
   min-height: 20px;
   padding: 19px;
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
index ef4edba..e19fbe4 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
@@ -1,4 +1,5 @@
 <head>
+  <link rel="import" href="action_link.html">
   <link rel="import" href="function_ref.html">
   <link rel="import" href="isolate_ref.html">
   <link rel="import" href="observatory_element.html">
@@ -8,63 +9,173 @@
 <polymer-element name="isolate-summary" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
-    <style>
-      .counters {
-        display: flex;
-        flex-direction: row;
-        justify-content: center;
-      }
-      .counter {
-        margin: 10px;
-      }
-    </style>
     <div class="flex-row">
-      <div class="flex-item-fixed-1-12"><img src="../../../../packages/observatory/src/elements/img/isolate_icon.png"></div>
-      <div class="flex-item-fixed-1-12">{{ isolate.mainPort }}</div>
-      <div class="flex-item-fixed-4-12">
-        <div class="flex-row">
-          <isolate-ref ref="{{ isolate }}"></isolate-ref>
-        </div>
-        <div class="flex-row">
-          <small>
-            (<a href="{{ isolate.rootLib.hashLink }}">library</a>)
-            (<a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>)
-            (<a href="{{ isolate.relativeHashLink('profile') }}">profile</a>)
-          </small>
-        </div>
+      <div class="flex-item-10-percent">
+        <img src="../../../../packages/observatory/src/elements/img/isolate_icon.png">
       </div>
-
-      <div class="flex-item-fixed-2-12">
-        <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
-          {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
-        </a>
-        ( <a href="{{ isolate.relativeHashLink('heapmap') }}">map</a> )
+      <div class="flex-item-10-percent">
+        <isolate-ref ref="{{ isolate }}"></isolate-ref>
       </div>
-      <div class="flex-item-fixed-2-12">
-        <template if="{{ isolate.topFrame == null }}">
-          idle
-        </template>
-        <template if="{{ isolate.topFrame != null }}">
-          run
-        </template>
-        ( <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a> )
+      <div class="flex-item-20-percent">
+        <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
+      </div>
+      <div class="flex-item-50-percent">
+        <isolate-location isolate="{{ isolate }}"></isolate-location>
+      </div>
+      <div class="flex-item-10-percent">
       </div>
     </div>
 
-    <div class="counters">
-      <template repeat="{{ key in isolate.counters.keys }}">
-        <div class="counter">{{ key }} ({{ isolate.counters[key] }})</div>
-      </template>
+    <div class="flex-row">
+      <div class="flex-item-20-percent"></div>
+      <div class="flex-item-60-percent">
+        <hr>
+      </div>
+      <div class="flex-item-20-percent"></div>
     </div>
 
-    <template if="{{ isolate.topFrame != null }}">
-      <script-inset script="{{ isolate.topFrame['script'] }}"
-                    pos="{{ isolate.topFrame['tokenPos'] }}">
-        <function-ref ref="{{ isolate.topFrame['function'] }}"></function-ref>
-        (<script-ref ref="{{ isolate.topFrame['script'] }}"
-                     pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
-      </script-inset>
+    <isolate-shared-summary isolate="{{ isolate }}"></isolate-shared-summary>
+
+  </template>
+</polymer-element>
+
+<polymer-element name="isolate-run-state" extends="observatory-element">
+  <template>
+    <template if="{{ isolate.pauseEvent != null }}">
+      <strong>paused</strong>
+      <action-link callback="{{ resume }}" label="resume"></action-link>
+    </template>
+
+    <template if="{{ isolate.running }}">
+      <strong>running</strong>
+      <action-link callback="{{ pause }}" label="pause"></action-link>
+    </template>
+
+    <template if="{{ isolate.idle }}">
+      <strong>idle</strong>
+    </template>
+
+    <template if="{{ isolate.loading }}">
+      <strong>loading...</strong>
     </template>
   </template>
-  <script type="application/dart" src="isolate_summary.dart"></script>
 </polymer-element>
+
+<polymer-element name="isolate-location" extends="observatory-element">
+  <template>
+    <template if="{{ isolate.pauseEvent != null }}">
+      <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateCreated' }}">
+        at isolate start
+      </template>
+      <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateShutdown' }}">
+        at isolate exit
+      </template>
+      <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateInterrupted' }}">
+        at
+        <function-ref ref="{{ isolate.topFrame['function'] }}">
+        </function-ref>
+        (<script-ref ref="{{ isolate.topFrame['script'] }}"
+                     pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+      </template>
+      <template if="{{ isolate.pauseEvent['eventType'] == 'BreakpointReached' }}">
+        at breakpoint {{ isolate.pauseEvent['breakpoint']['id'] }}
+        <function-ref ref="{{ isolate.topFrame['function'] }}">
+        </function-ref>
+        (<script-ref ref="{{ isolate.topFrame['script'] }}"
+                         pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+      </template>
+    </template>
+
+    <template if="{{ isolate.running }}">
+      at
+      <function-ref ref="{{ isolate.topFrame['function'] }}">
+      </function-ref>
+      (<script-ref ref="{{ isolate.topFrame['script'] }}"
+                   pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+    </template>
+
+  </template>
+</polymer-element>
+
+<polymer-element name="isolate-shared-summary" extends="observatory-element">
+  <template>
+    <style>
+      .errorBox {
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: pre;
+      }
+    </style>
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <template if="{{ isolate.error != null }}">
+      <div class="content-centered">
+        <pre class="errorBox">{{ isolate.error.message }}</pre>
+        <br>
+      </div>
+    </template>
+    <div class="flex-row">
+      <div class="flex-item-10-percent">
+      </div>
+      <div class="flex-item-40-percent">
+        <isolate-counter-chart counters="{{ isolate.counters }}"></isolate-counter-chart>
+      </div>
+      <div class="flex-item-40-percent">
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberName">new heap</div>
+              <div class="memberValue">
+                {{ isolate.newHeapUsed | formatSize }}
+                of
+                {{ isolate.newHeapCapacity | formatSize }}
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberName">old heap</div>
+              <div class="memberValue">
+                {{ isolate.oldHeapUsed | formatSize }}
+                of
+                {{ isolate.oldHeapCapacity | formatSize }}
+              </div>
+            </div>
+          </div>
+          <br>
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+            </div>
+          </div>
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+              </div>
+            </div>
+          </div>
+      </div>
+      <div class="flex-item-10-percent">
+      </div>
+    </div>
+  </template>
+</polymer-element>
+
+<polymer-element name="isolate-counter-chart" extends="observatory-element">
+  <template>
+    <div id="counterPieChart" style="height: 200px"></div>
+  </template>
+</polymer-element>
+
+<script type="application/dart" src="isolate_summary.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
index 44bc2f8..e829a4c 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
@@ -1,7 +1,9 @@
 <head>
+  <link rel="import" href="action_link.html">
   <link rel="import" href="curly_block.html">
   <link rel="import" href="eval_box.html">
   <link rel="import" href="function_ref.html">
+  <link rel="import" href="isolate_summary.html">
   <link rel="import" href="library_ref.html">
   <link rel="import" href="nav_bar.html">
   <link rel="import" href="observatory_element.html">
@@ -30,87 +32,49 @@
 
     <div class="content">
       <h1>isolate '{{ isolate.name }}'</h1>
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberName">status</div>
-          <div class="memberValue">
-            <template if="{{ isolate.pausedOnStart }}">
-              <strong style="color:darkred;">paused</strong> @ isolate start
-              <span style="padding-left:20px;">
-                [<a on-click="{{ resume }}">resume</a>]
-              </span>
-            </template>
-
-            <template if="{{ isolate.pausedOnExit }}">
-              <strong style="color:darkred;">paused</strong> @ isolate exit
-              <span style="padding-left:20px;">
-                [<a on-click="{{ resume }}">resume</a>]
-              </span>
-            </template>
-
-            <template if="{{ isolate.running }}">
-              <strong>running</strong>
-              @
-              <function-ref ref="{{ isolate.topFrame['function'] }}">
-              </function-ref>
-              (<script-ref ref="{{ isolate.topFrame['script'] }}"
-                           pos="{{ isolate.topFrame['tokenPos'] }}">
-              </script-ref>)
-            </template>
-
-            <template if="{{ isolate.idle }}">
-              <strong>idle</strong>
-            </template>
-          </div>
-        </div>
-      </div>
     </div>
 
-    <template if="{{ isolate.error != null }}">
-      <div class="content">
-        <h1>Error</h1>
-        <div class="memberList">
-          <div class="memberItem">
-            <div class="memberName">message</div>
-            <div class="memberValue">
-              <pre>{{ isolate.error.message }}</pre>
-            </div>
-          </div>
-          <div class="memberItem">
-            <template if="{{ isolate.error.exception != null }}">
-              <div class="memberName">exception</div>
-              <div class="memberValue">
-                <instance-ref ref="{{ isolate.error.exception }}"></instance-ref>
-              </div>
-            </template>
-          </div>
-          <div class="memberItem">
-            <template if="{{ isolate.error.stacktrace != null }}">
-            <div class="memberName">stacktrace</div>
-            <div class="memberValue">
-              <instance-ref ref="{{ isolate.error.stacktrace }}"></instance-ref>
-            </div>
-            </template>
-          </div>
-        </div>
+    <br>
+    <div class="flex-row">
+      <div class="flex-item-10-percent">
       </div>
-      <hr>
-    </template>
-
+      <div class="flex-item-20-percent">
+        <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
+      </div>
+      <div class="flex-item-60-percent">
+        <isolate-location isolate="{{ isolate }}"></isolate-location>
+      </div>
+      <div class="flex-item-10-percent">
+      </div>
+    </div>
     <br>
 
     <template if="{{ isolate.topFrame != null }}">
+      <br>
       <script-inset script="{{ isolate.topFrame['script'] }}"
                     pos="{{ isolate.topFrame['tokenPos'] }}">
       </script-inset>
     </template>
 
+    <div class="flex-row">
+      <div class="flex-item-20-percent"></div>
+      <div class="flex-item-60-percent"><hr></div>
+      <div class="flex-item-20-percent"></div>
+    </div>
+
     <br>
 
+    <isolate-shared-summary isolate="{{ isolate }}"></isolate-shared-summary>
+
+    <div class="flex-row">
+      <div class="flex-item-20-percent"></div>
+      <div class="flex-item-60-percent"><hr></div>
+      <div class="flex-item-20-percent"></div>
+    </div>
+
     <div class="content-centered">
       <div class="flex-row">
-
-        <div class="flex-item-fixed-6-12">
+        <div class="flex-item-50-percent">
           <div class="memberList">
             <div class="memberItem">
               <div class="memberName">root library</div>
@@ -127,65 +91,20 @@
               </template>
             </div>
             <div class="memberItem">
-              <div class="memberName">id</div>
+              <div class="memberName">isolate id</div>
               <div class="memberValue">{{ isolate.mainPort }}</div>
             </div>
-            <br>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
-
-              </div>
+          </div>
+        </div>
+        <div class="flex-item-50-percent">
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
             </div>
           </div>
         </div>
-
-        <div class="flex-item-fixed-6-12">
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberName">new heap</div>
-              <div class="memberValue">
-                {{ isolate.newHeapUsed | formatSize }}
-                of
-                {{ isolate.newHeapCapacity | formatSize }}
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberName">old heap</div>
-              <div class="memberValue">
-                {{ isolate.oldHeapUsed | formatSize }}
-                of
-                {{ isolate.oldHeapCapacity | formatSize }}
-              </div>
-            </div>
-          </div>
-          <br>
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
-              </div>
-            </div>
-          </div>
-        </div>
-
-      </div> <!-- flex row -->
-    </div> <!-- content -->
+      </div>
+    </div>
 
     <hr>
 
@@ -207,13 +126,6 @@
     <hr>
 
     <div class="content">
-      <div class="memberValue">Isolate execution</div>
-      <template repeat="{{ key in isolate.counters.keys }}">
-        <div class="memberValue">{{ key }} ({{ isolate.counters[key] }})</div>
-      </template>
-    </div>
-
-    <div class="content">
       <div id="tagProfileChart" class="miniProfileChart" style="height: 600px"></div>
     </div>
 
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
index 3817c7f..34d7461 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
@@ -80,7 +80,8 @@
       }
     </style>
 
-    <li class="menu"><a href="{{ link }}">{{ anchor }}</a>
+    <li class="menu">
+      <a href="{{ link }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
     <template if="{{ !last }}">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
index 2c2c64a..bc0d5d1 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
@@ -5,6 +5,7 @@
 </head>
 <polymer-element name="script-view" extends="observatory-element">
 <template>
+  <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
diff --git a/runtime/bin/vmservice/client/lib/elements.dart b/runtime/bin/vmservice/client/lib/elements.dart
index 9b77a35..aeee600 100644
--- a/runtime/bin/vmservice/client/lib/elements.dart
+++ b/runtime/bin/vmservice/client/lib/elements.dart
@@ -1,6 +1,7 @@
 library observatory_elements;
 
 // Export elements.
+export 'package:observatory/src/elements/action_link.dart';
 export 'package:observatory/src/elements/breakpoint_list.dart';
 export 'package:observatory/src/elements/class_ref.dart';
 export 'package:observatory/src/elements/class_view.dart';
diff --git a/runtime/bin/vmservice/client/lib/elements.html b/runtime/bin/vmservice/client/lib/elements.html
index c31adc5..03550ef 100644
--- a/runtime/bin/vmservice/client/lib/elements.html
+++ b/runtime/bin/vmservice/client/lib/elements.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
 <html>
 <head>
+  <link rel="import" href="src/elements/action_link.html">
   <link rel="import" href="src/elements/breakpoint_list.html">
   <link rel="import" href="src/elements/class_ref.html">
   <link rel="import" href="src/elements/class_view.html">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/action_link.dart b/runtime/bin/vmservice/client/lib/src/elements/action_link.dart
new file mode 100644
index 0000000..2a1dc93
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/action_link.dart
@@ -0,0 +1,31 @@
+// 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 action_link_element;
+
+import 'package:observatory/service.dart';
+import 'package:polymer/polymer.dart';
+
+@CustomTag('action-link')
+class ActionLinkElement extends PolymerElement {
+  ActionLinkElement.created() : super.created();
+
+  @observable bool busy = false;
+  @published var callback = null;
+  @published String label = 'action';
+
+  void doAction(var a, var b, var c) {
+    if (busy) {
+      return;
+    }
+    if (callback != null) {
+      busy = true;
+      // TODO(turnidge): Track down why adding a dummy argument makes
+      // this work but having a no-argument callback doesn't.
+      callback(null).whenComplete(() {
+          busy = false;
+        });
+    }
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/action_link.html b/runtime/bin/vmservice/client/lib/src/elements/action_link.html
new file mode 100644
index 0000000..7c1974f
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/action_link.html
@@ -0,0 +1,26 @@
+<head>
+  <link rel="import" href="instance_ref.html">
+</head>
+<polymer-element name="action-link">
+  <template>
+    <style>
+      .idle {
+        color: #0489c3;
+        cursor: pointer;
+      }
+      .busy {
+        color: #aaa;
+        cursor: wait;
+      }
+    </style>
+
+    <template if="{{ busy }}">
+      <span class="busy">[{{ label }}]</span>
+    </template>
+    <template if="{{ !busy }}">
+      <span class="idle"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+    </template>
+
+  </template>
+  <script type="application/dart" src="action_link.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/css/shared.css b/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
index 3245eb2..06f2c11 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
+++ b/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
@@ -142,7 +142,7 @@
   flex-basis: 33.3333%;
 }
 
-.flex-item-fixed-6-12 {
+.flex-item-fixed-6-12, .flex-item-50-percent {
   flex-grow: 0;
   flex-shrink: 0;
   flex-basis: 50%;
@@ -167,6 +167,54 @@
   flex-basis: 100%;
 }
 
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
 .well {
   min-height: 20px;
   padding: 19px;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
index 8980ae8..9626735 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
@@ -255,4 +255,4 @@
     Map heap = profile['heaps'][space];
     return '${Utils.formatSeconds(heap['time'])} secs';
   }
-}
\ No newline at end of file
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
index 56baabf..7054ba1 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
@@ -4,12 +4,104 @@
 
 library isolate_summary_element;
 
-import 'package:observatory/service.dart';
-import 'package:polymer/polymer.dart';
+import 'dart:async';
+import 'dart:html';
 import 'observatory_element.dart';
+import 'package:observatory/app.dart';
+import 'package:observatory/service.dart';
+import 'package:logging/logging.dart';
+import 'package:polymer/polymer.dart';
 
 @CustomTag('isolate-summary')
 class IsolateSummaryElement extends ObservatoryElement {
   IsolateSummaryElement.created() : super.created();
+
   @published Isolate isolate;
 }
+
+@CustomTag('isolate-run-state')
+class IsolateRunStateElement extends ObservatoryElement {
+  IsolateRunStateElement.created() : super.created();
+
+  @published Isolate isolate;
+
+  Future pause(_) {
+    return isolate.get("debug/pause").then((result) {
+        // TODO(turnidge): Instead of asserting here, handle errors
+        // properly.
+        assert(result.serviceType == 'Success');
+        return isolate.reload();
+      });
+  }
+
+  Future resume(_) {
+    return isolate.get("debug/resume").then((result) {
+        // TODO(turnidge): Instead of asserting here, handle errors
+        // properly.
+        assert(result.serviceType == 'Success');
+        return isolate.reload();
+      });
+  }
+}
+
+@CustomTag('isolate-location')
+class IsolateLocationElement extends ObservatoryElement {
+  IsolateLocationElement.created() : super.created();
+
+  @published Isolate isolate;
+}
+
+@CustomTag('isolate-shared-summary')
+class IsolateSharedSummaryElement extends ObservatoryElement {
+  IsolateSharedSummaryElement.created() : super.created();
+
+  @published Isolate isolate;
+}
+
+class CounterChart {
+  var _table = new DataTable();
+  var _chart;
+
+  void update(Map counters) {
+    if (_table.columns == 0) {
+      // Initialize.
+      _table.addColumn('string', 'Name');
+      _table.addColumn('number', 'Value');
+    }
+    _table.clearRows();
+    for (var key in counters.keys) {
+      var value = double.parse(counters[key].split('%')[0]);
+      _table.addRow([key, value]);
+    }
+  }
+
+  void draw(var element) {
+    if (_chart == null) {
+      assert(element != null);
+      _chart = new Chart('PieChart', element);
+    }
+    _chart.draw(_table);
+  }
+}
+
+@CustomTag('isolate-counter-chart')
+class IsolateCounterChartElement extends ObservatoryElement {
+  IsolateCounterChartElement.created() : super.created();
+
+  @published ObservableMap counters;
+  CounterChart chart = new CounterChart();
+
+  void countersChanged(oldValue) {
+    if (counters == null) {
+      return;
+    }
+    chart.update(counters);
+    var element = shadowRoot.querySelector('#counterPieChart');
+    if (element != null) {
+      chart.draw(element);
+    }
+  }
+}
+
+
+
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
index c58b43f..b1cebac 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
@@ -1,4 +1,5 @@
 <head>
+  <link rel="import" href="action_link.html">
   <link rel="import" href="function_ref.html">
   <link rel="import" href="isolate_ref.html">
   <link rel="import" href="observatory_element.html">
@@ -8,63 +9,173 @@
 <polymer-element name="isolate-summary" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
-    <style>
-      .counters {
-        display: flex;
-        flex-direction: row;
-        justify-content: center;
-      }
-      .counter {
-        margin: 10px;
-      }
-    </style>
     <div class="flex-row">
-      <div class="flex-item-fixed-1-12"><img src="packages/observatory/src/elements/img/isolate_icon.png"></div>
-      <div class="flex-item-fixed-1-12">{{ isolate.mainPort }}</div>
-      <div class="flex-item-fixed-4-12">
-        <div class="flex-row">
-          <isolate-ref ref="{{ isolate }}"></isolate-ref>
-        </div>
-        <div class="flex-row">
-          <small>
-            (<a href="{{ isolate.rootLib.hashLink }}">library</a>)
-            (<a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>)
-            (<a href="{{ isolate.relativeHashLink('profile') }}">profile</a>)
-          </small>
-        </div>
+      <div class="flex-item-10-percent">
+        <img src="packages/observatory/src/elements/img/isolate_icon.png">
       </div>
-
-      <div class="flex-item-fixed-2-12">
-        <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
-          {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
-        </a>
-        ( <a href="{{ isolate.relativeHashLink('heapmap') }}">map</a> )
+      <div class="flex-item-10-percent">
+        <isolate-ref ref="{{ isolate }}"></isolate-ref>
       </div>
-      <div class="flex-item-fixed-2-12">
-        <template if="{{ isolate.topFrame == null }}">
-          idle
-        </template>
-        <template if="{{ isolate.topFrame != null }}">
-          run
-        </template>
-        ( <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a> )
+      <div class="flex-item-20-percent">
+        <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
+      </div>
+      <div class="flex-item-50-percent">
+        <isolate-location isolate="{{ isolate }}"></isolate-location>
+      </div>
+      <div class="flex-item-10-percent">
       </div>
     </div>
 
-    <div class="counters">
-      <template repeat="{{ key in isolate.counters.keys }}">
-        <div class="counter">{{ key }} ({{ isolate.counters[key] }})</div>
-      </template>
+    <div class="flex-row">
+      <div class="flex-item-20-percent"></div>
+      <div class="flex-item-60-percent">
+        <hr>
+      </div>
+      <div class="flex-item-20-percent"></div>
     </div>
 
-    <template if="{{ isolate.topFrame != null }}">
-      <script-inset script="{{ isolate.topFrame['script'] }}"
-                    pos="{{ isolate.topFrame['tokenPos'] }}">
-        <function-ref ref="{{ isolate.topFrame['function'] }}"></function-ref>
-        (<script-ref ref="{{ isolate.topFrame['script'] }}"
-                     pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
-      </script-inset>
+    <isolate-shared-summary isolate="{{ isolate }}"></isolate-shared-summary>
+
+  </template>
+</polymer-element>
+
+<polymer-element name="isolate-run-state" extends="observatory-element">
+  <template>
+    <template if="{{ isolate.pauseEvent != null }}">
+      <strong>paused</strong>
+      <action-link callback="{{ resume }}" label="resume"></action-link>
+    </template>
+
+    <template if="{{ isolate.running }}">
+      <strong>running</strong>
+      <action-link callback="{{ pause }}" label="pause"></action-link>
+    </template>
+
+    <template if="{{ isolate.idle }}">
+      <strong>idle</strong>
+    </template>
+
+    <template if="{{ isolate.loading }}">
+      <strong>loading...</strong>
     </template>
   </template>
-  <script type="application/dart" src="isolate_summary.dart"></script>
 </polymer-element>
+
+<polymer-element name="isolate-location" extends="observatory-element">
+  <template>
+    <template if="{{ isolate.pauseEvent != null }}">
+      <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateCreated' }}">
+        at isolate start
+      </template>
+      <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateShutdown' }}">
+        at isolate exit
+      </template>
+      <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateInterrupted' }}">
+        at
+        <function-ref ref="{{ isolate.topFrame['function'] }}">
+        </function-ref>
+        (<script-ref ref="{{ isolate.topFrame['script'] }}"
+                     pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+      </template>
+      <template if="{{ isolate.pauseEvent['eventType'] == 'BreakpointReached' }}">
+        at breakpoint {{ isolate.pauseEvent['breakpoint']['id'] }}
+        <function-ref ref="{{ isolate.topFrame['function'] }}">
+        </function-ref>
+        (<script-ref ref="{{ isolate.topFrame['script'] }}"
+                         pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+      </template>
+    </template>
+
+    <template if="{{ isolate.running }}">
+      at
+      <function-ref ref="{{ isolate.topFrame['function'] }}">
+      </function-ref>
+      (<script-ref ref="{{ isolate.topFrame['script'] }}"
+                   pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+    </template>
+
+  </template>
+</polymer-element>
+
+<polymer-element name="isolate-shared-summary" extends="observatory-element">
+  <template>
+    <style>
+      .errorBox {
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: pre;
+      }
+    </style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <template if="{{ isolate.error != null }}">
+      <div class="content-centered">
+        <pre class="errorBox">{{ isolate.error.message }}</pre>
+        <br>
+      </div>
+    </template>
+    <div class="flex-row">
+      <div class="flex-item-10-percent">
+      </div>
+      <div class="flex-item-40-percent">
+        <isolate-counter-chart counters="{{ isolate.counters }}"></isolate-counter-chart>
+      </div>
+      <div class="flex-item-40-percent">
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberName">new heap</div>
+              <div class="memberValue">
+                {{ isolate.newHeapUsed | formatSize }}
+                of
+                {{ isolate.newHeapCapacity | formatSize }}
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberName">old heap</div>
+              <div class="memberValue">
+                {{ isolate.oldHeapUsed | formatSize }}
+                of
+                {{ isolate.oldHeapCapacity | formatSize }}
+              </div>
+            </div>
+          </div>
+          <br>
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+            </div>
+          </div>
+          <div class="memberList">
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+              </div>
+            </div>
+            <div class="memberItem">
+              <div class="memberValue">
+                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+              </div>
+            </div>
+          </div>
+      </div>
+      <div class="flex-item-10-percent">
+      </div>
+    </div>
+  </template>
+</polymer-element>
+
+<polymer-element name="isolate-counter-chart" extends="observatory-element">
+  <template>
+    <div id="counterPieChart" style="height: 200px"></div>
+  </template>
+</polymer-element>
+
+<script type="application/dart" src="isolate_summary.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
index 2c6b121..582c9ee 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
@@ -121,12 +121,21 @@
     isolate.reload().whenComplete(done);
   }
 
-  void resume(var a, var b, var c) {
-    isolate.get("resume").then((result) {
-      // TODO(turnidge): Instead of asserting here, handling errors
-      // properly.
-      assert(result.serviceType == 'Success');
-      isolate.reload();
-    });
+  Future pause(_) {
+    return isolate.get("debug/pause").then((result) {
+        // TODO(turnidge): Instead of asserting here, handle errors
+        // properly.
+        assert(result.serviceType == 'Success');
+        return isolate.reload();
+      });
+  }
+
+  Future resume(_) {
+    return isolate.get("resume").then((result) {
+        // TODO(turnidge): Instead of asserting here, handle errors
+        // properly.
+        assert(result.serviceType == 'Success');
+        return isolate.reload();
+      });
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
index 91e573b..eda9c16 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
@@ -1,7 +1,9 @@
 <head>
+  <link rel="import" href="action_link.html">
   <link rel="import" href="curly_block.html">
   <link rel="import" href="eval_box.html">
   <link rel="import" href="function_ref.html">
+  <link rel="import" href="isolate_summary.html">
   <link rel="import" href="library_ref.html">
   <link rel="import" href="nav_bar.html">
   <link rel="import" href="observatory_element.html">
@@ -30,87 +32,49 @@
 
     <div class="content">
       <h1>isolate '{{ isolate.name }}'</h1>
-      <div class="memberList">
-        <div class="memberItem">
-          <div class="memberName">status</div>
-          <div class="memberValue">
-            <template if="{{ isolate.pausedOnStart }}">
-              <strong style="color:darkred;">paused</strong> @ isolate start
-              <span style="padding-left:20px;">
-                [<a on-click="{{ resume }}">resume</a>]
-              </span>
-            </template>
-
-            <template if="{{ isolate.pausedOnExit }}">
-              <strong style="color:darkred;">paused</strong> @ isolate exit
-              <span style="padding-left:20px;">
-                [<a on-click="{{ resume }}">resume</a>]
-              </span>
-            </template>
-
-            <template if="{{ isolate.running }}">
-              <strong>running</strong>
-              @
-              <function-ref ref="{{ isolate.topFrame['function'] }}">
-              </function-ref>
-              (<script-ref ref="{{ isolate.topFrame['script'] }}"
-                           pos="{{ isolate.topFrame['tokenPos'] }}">
-              </script-ref>)
-            </template>
-
-            <template if="{{ isolate.idle }}">
-              <strong>idle</strong>
-            </template>
-          </div>
-        </div>
-      </div>
     </div>
 
-    <template if="{{ isolate.error != null }}">
-      <div class="content">
-        <h1>Error</h1>
-        <div class="memberList">
-          <div class="memberItem">
-            <div class="memberName">message</div>
-            <div class="memberValue">
-              <pre>{{ isolate.error.message }}</pre>
-            </div>
-          </div>
-          <div class="memberItem">
-            <template if="{{ isolate.error.exception != null }}">
-              <div class="memberName">exception</div>
-              <div class="memberValue">
-                <instance-ref ref="{{ isolate.error.exception }}"></instance-ref>
-              </div>
-            </template>
-          </div>
-          <div class="memberItem">
-            <template if="{{ isolate.error.stacktrace != null }}">
-            <div class="memberName">stacktrace</div>
-            <div class="memberValue">
-              <instance-ref ref="{{ isolate.error.stacktrace }}"></instance-ref>
-            </div>
-            </template>
-          </div>
-        </div>
+    <br>
+    <div class="flex-row">
+      <div class="flex-item-10-percent">
       </div>
-      <hr>
-    </template>
-
+      <div class="flex-item-20-percent">
+        <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
+      </div>
+      <div class="flex-item-60-percent">
+        <isolate-location isolate="{{ isolate }}"></isolate-location>
+      </div>
+      <div class="flex-item-10-percent">
+      </div>
+    </div>
     <br>
 
     <template if="{{ isolate.topFrame != null }}">
+      <br>
       <script-inset script="{{ isolate.topFrame['script'] }}"
                     pos="{{ isolate.topFrame['tokenPos'] }}">
       </script-inset>
     </template>
 
+    <div class="flex-row">
+      <div class="flex-item-20-percent"></div>
+      <div class="flex-item-60-percent"><hr></div>
+      <div class="flex-item-20-percent"></div>
+    </div>
+
     <br>
 
+    <isolate-shared-summary isolate="{{ isolate }}"></isolate-shared-summary>
+
+    <div class="flex-row">
+      <div class="flex-item-20-percent"></div>
+      <div class="flex-item-60-percent"><hr></div>
+      <div class="flex-item-20-percent"></div>
+    </div>
+
     <div class="content-centered">
       <div class="flex-row">
-
-        <div class="flex-item-fixed-6-12">
+        <div class="flex-item-50-percent">
           <div class="memberList">
             <div class="memberItem">
               <div class="memberName">root library</div>
@@ -127,65 +91,20 @@
               </template>
             </div>
             <div class="memberItem">
-              <div class="memberName">id</div>
+              <div class="memberName">isolate id</div>
               <div class="memberValue">{{ isolate.mainPort }}</div>
             </div>
-            <br>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
-
-              </div>
+          </div>
+        </div>
+        <div class="flex-item-50-percent">
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
             </div>
           </div>
         </div>
-
-        <div class="flex-item-fixed-6-12">
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberName">new heap</div>
-              <div class="memberValue">
-                {{ isolate.newHeapUsed | formatSize }}
-                of
-                {{ isolate.newHeapCapacity | formatSize }}
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberName">old heap</div>
-              <div class="memberValue">
-                {{ isolate.oldHeapUsed | formatSize }}
-                of
-                {{ isolate.oldHeapCapacity | formatSize }}
-              </div>
-            </div>
-          </div>
-          <br>
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
-              </div>
-            </div>
-          </div>
-        </div>
-
-      </div> <!-- flex row -->
-    </div> <!-- content -->
+      </div>
+    </div>
 
     <hr>
 
@@ -207,13 +126,6 @@
     <hr>
 
     <div class="content">
-      <div class="memberValue">Isolate execution</div>
-      <template repeat="{{ key in isolate.counters.keys }}">
-        <div class="memberValue">{{ key }} ({{ isolate.counters[key] }})</div>
-      </template>
-    </div>
-
-    <div class="content">
       <div id="tagProfileChart" class="miniProfileChart" style="height: 600px"></div>
     </div>
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
index dc7391c..94af49f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
@@ -80,7 +80,8 @@
       }
     </style>
 
-    <li class="menu"><a href="{{ link }}">{{ anchor }}</a>
+    <li class="menu">
+      <a href="{{ link }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
     <template if="{{ !last }}">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart b/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart
index f2a54ba..da79352 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart
@@ -64,13 +64,15 @@
     notifyPropertyChange(#lines, 0, 1);
     lines.clear();
     var startLineNumber = script.tokenToLine(pos);
-    if (endPos == null) {
-      lines.add(script.lines[startLineNumber - 1]);
-    } else {
-      var endLineNumber = script.tokenToLine(endPos);
-      assert(endLineNumber != null);
-      for (var i = startLineNumber; i <= endLineNumber; i++) {
-        lines.add(script.lines[i - 1]);
+    if (startLineNumber != null) {
+      if (endPos == null) {  
+        lines.add(script.lines[startLineNumber - 1]);
+      } else {
+        var endLineNumber = script.tokenToLine(endPos);
+        assert(endLineNumber != null);
+        for (var i = startLineNumber; i <= endLineNumber; i++) {
+          lines.add(script.lines[i - 1]);
+        }
       }
     }
   }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_view.html b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
index 2c2c64a..9d5685a1 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
@@ -5,6 +5,7 @@
 </head>
 <polymer-element name="script-view" extends="observatory-element">
 <template>
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index 0a8e54d..fc34a83 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -37,6 +37,8 @@
   /// Has this object been fully loaded?
   bool get loaded => _loaded;
   bool _loaded = false;
+  // TODO(turnidge): Make loaded observable and get rid of loading
+  // from Isolate.
 
   /// Is this object cacheable?  That is, is it impossible for the [id]
   /// of this object to change?
@@ -487,15 +489,17 @@
 class Isolate extends ServiceObjectOwner {
   @reflectable VM get vm => owner;
   @reflectable Isolate get isolate => this;
-  @observable ObservableMap counters = toObservable(new ObservableMap());
+  @observable ObservableMap counters = new ObservableMap();
 
   String get link => _id;
   String get hashLink => '#/$_id';
 
-  @observable bool pausedOnStart = false;
-  @observable bool pausedOnExit = false;
+  @observable ServiceMap pauseEvent = null;
+  bool get _isPaused => pauseEvent != null;
+
   @observable bool running = false;
   @observable bool idle = false;
+  @observable bool loading = true;
 
   Map<String,ServiceObject> _cache = new Map<String,ServiceObject>();
   final TagProfile tagProfile = new TagProfile(20);
@@ -637,6 +641,7 @@
       return;
     }
     _loaded = true;
+    loading = false;
     _upgradeCollection(map, isolate);
     if (map['rootLib'] == null ||
         map['timers'] == null ||
@@ -695,10 +700,9 @@
     oldHeapCapacity = map['heap']['capacityOld'];
 
     // Isolate status
-    pausedOnStart = map['pausedOnStart'];
-    pausedOnExit = map['pausedOnExit'];
-    running = map['topFrame'] != null;
-    idle = !pausedOnStart && !pausedOnExit && !running;
+    pauseEvent = map['pauseEvent'];
+    running = (!_isPaused && map['topFrame'] != null);
+    idle = (!_isPaused && map['topFrame'] == null);
     error = map['error'];
 
     libraries.clear();
diff --git a/runtime/bin/vmservice_impl.cc b/runtime/bin/vmservice_impl.cc
index 148e8c7..5268a89 100644
--- a/runtime/bin/vmservice_impl.cc
+++ b/runtime/bin/vmservice_impl.cc
@@ -94,7 +94,7 @@
     return r;
   }
   // Start processing messages in a new thread.
-  dart::Thread::Start(ThreadMain, NULL);
+  dart::Thread::Start(ThreadMain, static_cast<uword>(NULL));
   return true;
 }
 
diff --git a/runtime/lib/errors_patch.dart b/runtime/lib/errors_patch.dart
index 5a117c7..520c9a9 100644
--- a/runtime/lib/errors_patch.dart
+++ b/runtime/lib/errors_patch.dart
@@ -334,3 +334,11 @@
   _JavascriptIntegerOverflowError(this._value);
   String toString() => "Javascript Integer Overflow: $_value";
 }
+
+class _JavascriptCompatibilityError extends Error {
+  final String _msg;
+
+  _JavascriptCompatibilityError(this._msg);
+  String toString() => "Javascript Compatibility Error: $_msg";
+}
+
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index ed5551a..18da67a 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -19,23 +19,14 @@
     // (with a length that has been increased, but without a new element).
     if (index is! int) throw new ArgumentError(index);
     this.length++;
-    Lists.copy(this,
-                index,
-                this,
-                index + 1,
-                oldLength - index);
+    Lists.copy(this, index, this, index + 1, oldLength - index);
     this[index] = element;
   }
 
   T removeAt(int index) {
-    if (index is! int) throw new ArgumentError(index);
-    T result = this[index];
+    var result = this[index];
     int newLength = this.length - 1;
-    Lists.copy(this,
-                index + 1,
-                this,
-                index,
-                newLength - index);
+    Lists.copy(this, index + 1, this, index, newLength - index);
     this.length = newLength;
     return result;
   }
@@ -96,11 +87,7 @@
 
   void removeRange(int start, int end) {
     Lists.indicesCheck(this, start, end);
-    Lists.copy(this,
-                end,
-                this,
-                start,
-                this.length - end);
+    Lists.copy(this, end, this, start, this.length - end);
     this.length = this.length - (end - start);
   }
 
diff --git a/runtime/lib/math_patch.dart b/runtime/lib/math_patch.dart
index 29e8014..45eb5ef 100644
--- a/runtime/lib/math_patch.dart
+++ b/runtime/lib/math_patch.dart
@@ -19,6 +19,11 @@
   if (exponent == 0.0) {
     return 1.0;  // ECMA-262 15.8.2.13
   }
+  // Speed up simple cases.
+  if (exponent == 1.0) return base;
+  if (exponent == 2.0) return base * base;
+  if (exponent == 3.0) return base * base * base;
+  
   if (base == 1.0) return 1.0;
 
   if (base.isNaN || exponent.isNaN) {
diff --git a/runtime/lib/mirrors_patch.dart b/runtime/lib/mirrors_patch.dart
index 12cbd56..1534e79 100644
--- a/runtime/lib/mirrors_patch.dart
+++ b/runtime/lib/mirrors_patch.dart
@@ -36,6 +36,20 @@
 }
 
 patch class MirrorSystem {
+  /* patch */ LibraryMirror findLibrary(Symbol libraryName) {
+    var candidates =
+        libraries.values.where((lib) => lib.simpleName == libraryName);
+    if (candidates.length == 1) {
+      return candidates.single;
+    }
+    if (candidates.length > 1) {
+      var uris = candidates.map((lib) => lib.uri.toString()).toList();
+      throw new Exception("There are multiple libraries named "
+                          "'${getName(libraryName)}': $uris");
+    }
+    throw new Exception("There is no library named '${getName(libraryName)}'");
+  }
+
   /* patch */ static String getName(Symbol symbol) {
     String string = _symbol_dev.Symbol.getName(symbol);
 
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index 6da79b2..7b139fe 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -5,6 +5,7 @@
 #include "vm/bootstrap_natives.h"
 
 #include "lib/invocation_mirror.h"
+#include "vm/code_patcher.h"
 #include "vm/exceptions.h"
 #include "vm/heap.h"
 #include "vm/native_entry.h"
@@ -16,6 +17,7 @@
 
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, trace_type_checks);
+DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
 
 DEFINE_NATIVE_ENTRY(Object_equals, 1) {
@@ -109,6 +111,56 @@
 }
 
 
+static void JSWarning(const char* msg) {
+  DartFrameIterator iterator;
+  iterator.NextFrame();  // Skip native call.
+  StackFrame* caller_frame = iterator.NextFrame();
+  ASSERT(caller_frame != NULL);
+  const Code& caller_code = Code::Handle(caller_frame->LookupDartCode());
+  ASSERT(!caller_code.IsNull());
+  const uword caller_pc = caller_frame->pc();
+  // Assume an instance call.
+  ICData& ic_data = ICData::Handle();
+  CodePatcher::GetInstanceCallAt(caller_pc, caller_code, &ic_data);
+  ASSERT(!ic_data.IsNull());
+  // Report warning only if not already reported at this location.
+  if (!ic_data.IssuedJSWarning()) {
+    ic_data.SetIssuedJSWarning();
+    Exceptions::JSWarning(caller_frame, "%s", msg);
+  }
+}
+
+
+static void WarnOnJSIntegralNumTypeTest(
+    const Instance& instance,
+    const TypeArguments& instantiator_type_arguments,
+    const AbstractType& type) {
+  const bool instance_is_int = instance.IsInteger();
+  const bool instance_is_double = instance.IsDouble();
+  if (!(instance_is_int || instance_is_double)) {
+    return;
+  }
+  AbstractType& instantiated_type = AbstractType::Handle(type.raw());
+  if (!type.IsInstantiated()) {
+    instantiated_type = type.InstantiateFrom(instantiator_type_arguments, NULL);
+  }
+  if (instance_is_double) {
+    if (instantiated_type.IsIntType()) {
+      const double value = Double::Cast(instance).value();
+      if (floor(value) == value) {
+        JSWarning("integral value of type 'double' is also considered to be "
+                  "of type 'int'");
+      }
+    }
+  } else {
+    ASSERT(instance_is_int);
+    if (instantiated_type.IsDoubleType()) {
+      JSWarning("integer value is also considered to be of type 'double'");
+    }
+  }
+}
+
+
 DEFINE_NATIVE_ENTRY(Object_instanceOf, 5) {
   const Instance& instance = Instance::CheckedHandle(arguments->NativeArgAt(0));
   // Instantiator at position 1 is not used. It is passed along so that the call
@@ -122,6 +174,12 @@
   ASSERT(type.IsFinalized());
   ASSERT(!type.IsMalformed());
   ASSERT(!type.IsMalbounded());
+
+  // Check for javascript compatibility.
+  if (FLAG_warn_on_javascript_compatibility) {
+    WarnOnJSIntegralNumTypeTest(instance, instantiator_type_arguments, type);
+  }
+
   Error& bound_error = Error::Handle();
   const bool is_instance_of = instance.IsInstanceOf(type,
                                                     instantiator_type_arguments,
@@ -170,6 +228,12 @@
   if (instance.IsNull()) {
     return instance.raw();
   }
+
+  // Check for javascript compatibility.
+  if (FLAG_warn_on_javascript_compatibility) {
+    WarnOnJSIntegralNumTypeTest(instance, instantiator_type_arguments, type);
+  }
+
   const bool is_instance_of = instance.IsInstanceOf(type,
                                                     instantiator_type_arguments,
                                                     &bound_error);
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index 53c59d1..393d398 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -2329,12 +2329,10 @@
     return _abs();
   }
   Float32x4 _abs() native "Float32x4_abs";
-  Float32x4 clamp(Float32x4 lowerLimit,
-                         Float32x4 upperLimit) {
+  Float32x4 clamp(Float32x4 lowerLimit, Float32x4 upperLimit) {
     return _clamp(lowerLimit, upperLimit);
   }
-  Float32x4 _clamp(Float32x4 lowerLimit,
-                          Float32x4 upperLimit)
+  Float32x4 _clamp(Float32x4 lowerLimit, Float32x4 upperLimit)
       native "Float32x4_clamp";
   double get x native "Float32x4_getX";
   double get y native "Float32x4_getY";
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index d4aadf6..b88bad2 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -16,9 +16,6 @@
 # Flaky on buildbot. Issue 5133 and 10409.
 cc/Sleep: Pass, Fail
 
-[ $mode == debug ]
-cc/PrintJSON: Crash  # Issue 18652
-
 [ $arch == x64 ]
 cc/IsolateInterrupt: Skip
 
@@ -78,9 +75,6 @@
 [ $arch == mips && $mode == debug ]
 cc/FindCodeObject: Skip # Takes more than 8 minutes. dartbug.com/17440.
 
-[ $arch == simarm64 ]
-dart/*: Skip
-
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 dart/mirrored_compilation_error_test: Skip # Can't pass needed VM flag
 
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index 61e0328..d712f98 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -555,6 +555,9 @@
                     Condition cond) {
   ASSERT(regs != 0);
   EmitMultiMemOp(cond, am, true, base, regs);
+  if (TargetCPUFeatures::arm_version() == ARMv5TE) {
+    nop();
+  }
 }
 
 
@@ -612,6 +615,7 @@
 
 
 void Assembler::vmovsr(SRegister sn, Register rt, Condition cond) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sn != kNoSRegister);
   ASSERT(rt != kNoRegister);
   ASSERT(rt != SP);
@@ -627,6 +631,7 @@
 
 
 void Assembler::vmovrs(Register rt, SRegister sn, Condition cond) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sn != kNoSRegister);
   ASSERT(rt != kNoRegister);
   ASSERT(rt != SP);
@@ -643,6 +648,7 @@
 
 void Assembler::vmovsrr(SRegister sm, Register rt, Register rt2,
                         Condition cond) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sm != kNoSRegister);
   ASSERT(sm != S31);
   ASSERT(rt != kNoRegister);
@@ -664,6 +670,7 @@
 
 void Assembler::vmovrrs(Register rt, Register rt2, SRegister sm,
                         Condition cond) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sm != kNoSRegister);
   ASSERT(sm != S31);
   ASSERT(rt != kNoRegister);
@@ -686,6 +693,7 @@
 
 void Assembler::vmovdrr(DRegister dm, Register rt, Register rt2,
                         Condition cond) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(dm != kNoDRegister);
   ASSERT(rt != kNoRegister);
   ASSERT(rt != SP);
@@ -706,6 +714,7 @@
 
 void Assembler::vmovrrd(Register rt, Register rt2, DRegister dm,
                         Condition cond) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(dm != kNoDRegister);
   ASSERT(rt != kNoRegister);
   ASSERT(rt != SP);
@@ -726,6 +735,7 @@
 
 
 void Assembler::vldrs(SRegister sd, Address ad, Condition cond) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sd != kNoSRegister);
   ASSERT(cond != kNoCondition);
   int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
@@ -738,6 +748,7 @@
 
 
 void Assembler::vstrs(SRegister sd, Address ad, Condition cond) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(static_cast<Register>(ad.encoding_ & (0xf << kRnShift)) != PC);
   ASSERT(sd != kNoSRegister);
   ASSERT(cond != kNoCondition);
@@ -751,6 +762,7 @@
 
 
 void Assembler::vldrd(DRegister dd, Address ad, Condition cond) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(dd != kNoDRegister);
   ASSERT(cond != kNoCondition);
   int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
@@ -763,6 +775,7 @@
 
 
 void Assembler::vstrd(DRegister dd, Address ad, Condition cond) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(static_cast<Register>(ad.encoding_ & (0xf << kRnShift)) != PC);
   ASSERT(dd != kNoDRegister);
   ASSERT(cond != kNoCondition);
@@ -780,6 +793,7 @@
                                 Register base,
                                 SRegister start,
                                 uint32_t count) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(base != kNoRegister);
   ASSERT(cond != kNoCondition);
   ASSERT(start != kNoSRegister);
@@ -803,10 +817,12 @@
                                 Register base,
                                 DRegister start,
                                 int32_t count) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(base != kNoRegister);
   ASSERT(cond != kNoCondition);
   ASSERT(start != kNoDRegister);
   ASSERT(static_cast<int32_t>(start) + count <= kNumberOfDRegisters);
+  const int armv5te = TargetCPUFeatures::arm_version() == ARMv5TE ? 1 : 0;
 
   int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
                      B27 | B26 | B11 | B9 | B8 |
@@ -815,7 +831,7 @@
                      (static_cast<int32_t>(base) << kRnShift) |
                      ((static_cast<int32_t>(start) & 0x10) ? D : 0) |
                      ((static_cast<int32_t>(start) & 0xf) << 12) |
-                     (count << 1);
+                     (count << 1) | armv5te;
   Emit(encoding);
 }
 
@@ -856,6 +872,7 @@
 
 void Assembler::EmitVFPsss(Condition cond, int32_t opcode,
                            SRegister sd, SRegister sn, SRegister sm) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sd != kNoSRegister);
   ASSERT(sn != kNoSRegister);
   ASSERT(sm != kNoSRegister);
@@ -874,6 +891,7 @@
 
 void Assembler::EmitVFPddd(Condition cond, int32_t opcode,
                            DRegister dd, DRegister dn, DRegister dm) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(dd != kNoDRegister);
   ASSERT(dn != kNoDRegister);
   ASSERT(dm != kNoDRegister);
@@ -1039,6 +1057,7 @@
 
 void Assembler::EmitVFPsd(Condition cond, int32_t opcode,
                           SRegister sd, DRegister dm) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sd != kNoSRegister);
   ASSERT(dm != kNoDRegister);
   ASSERT(cond != kNoCondition);
@@ -1054,6 +1073,7 @@
 
 void Assembler::EmitVFPds(Condition cond, int32_t opcode,
                           DRegister dd, SRegister sm) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(dd != kNoDRegister);
   ASSERT(sm != kNoSRegister);
   ASSERT(cond != kNoCondition);
@@ -1138,6 +1158,7 @@
 
 
 void Assembler::vmstat(Condition cond) {  // VMRS APSR_nzcv, FPSCR
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(cond != kNoCondition);
   int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
                      B27 | B26 | B25 | B23 | B22 | B21 | B20 | B16 |
@@ -1175,6 +1196,7 @@
 
 void Assembler::EmitSIMDqqq(int32_t opcode, OperandSize size,
                             QRegister qd, QRegister qn, QRegister qm) {
+  ASSERT(TargetCPUFeatures::neon_supported());
   int sz = ShiftOfOperandSize(size);
   int32_t encoding =
       (static_cast<int32_t>(kSpecialCondition) << kConditionShift) |
@@ -1192,6 +1214,7 @@
 
 void Assembler::EmitSIMDddd(int32_t opcode, OperandSize size,
                             DRegister dd, DRegister dn, DRegister dm) {
+  ASSERT(TargetCPUFeatures::neon_supported());
   int sz = ShiftOfOperandSize(size);
   int32_t encoding =
       (static_cast<int32_t>(kSpecialCondition) << kConditionShift) |
@@ -1724,10 +1747,11 @@
   PatchFarBranch() {}
 
   void Process(const MemoryRegion& region, intptr_t position) {
-    if (TargetCPUFeatures::arm_version() == ARMv6) {
+    const ARMVersion version = TargetCPUFeatures::arm_version();
+    if ((version == ARMv5TE) || (version == ARMv6)) {
       ProcessARMv6(region, position);
     } else {
-      ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+      ASSERT(version == ARMv7);
       ProcessARMv7(region, position);
     }
   }
@@ -1987,10 +2011,11 @@
 
 
 void Assembler::Bind(Label* label) {
-  if (TargetCPUFeatures::arm_version() == ARMv6) {
+  const ARMVersion version = TargetCPUFeatures::arm_version();
+  if ((version == ARMv5TE) || (version == ARMv6)) {
     BindARMv6(label);
   } else {
-    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    ASSERT(version == ARMv7);
     BindARMv7(label);
   }
 }
@@ -2228,14 +2253,6 @@
 }
 
 
-void Assembler::BranchLinkStore(const ExternalLabel* label, Address ad) {
-  // TODO(regis): Revisit this code sequence.
-  LoadImmediate(IP, label->address());  // Target address is never patched.
-  str(PC, ad);
-  blx(IP);  // Use blx instruction so that the return branch prediction works.
-}
-
-
 void Assembler::BranchLinkOffset(Register base, int32_t offset) {
   ASSERT(base != PC);
   ASSERT(base != IP);
@@ -2246,7 +2263,8 @@
 
 void Assembler::LoadPatchableImmediate(
     Register rd, int32_t value, Condition cond) {
-  if (TargetCPUFeatures::arm_version() == ARMv6) {
+  const ARMVersion version = TargetCPUFeatures::arm_version();
+  if ((version == ARMv5TE) || (version == ARMv6)) {
     // This sequence is patched in a few places, and should remain fixed.
     const uint32_t byte0 = (value & 0x000000ff);
     const uint32_t byte1 = (value & 0x0000ff00) >> 8;
@@ -2257,7 +2275,7 @@
     orr(rd, rd, ShifterOperand(12, byte1), cond);
     orr(rd, rd, ShifterOperand(byte0), cond);
   } else {
-    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    ASSERT(version == ARMv7);
     const uint16_t value_low = Utils::Low16Bits(value);
     const uint16_t value_high = Utils::High16Bits(value);
     movw(rd, value_low, cond);
@@ -2268,10 +2286,11 @@
 
 void Assembler::LoadDecodableImmediate(
     Register rd, int32_t value, Condition cond) {
-  if (TargetCPUFeatures::arm_version() == ARMv6) {
+  const ARMVersion version = TargetCPUFeatures::arm_version();
+  if ((version == ARMv5TE) || (version == ARMv6)) {
     LoadPatchableImmediate(rd, value, cond);
   } else {
-    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    ASSERT(version == ARMv7);
     movw(rd, Utils::Low16Bits(value), cond);
     const uint16_t value_high = Utils::High16Bits(value);
     if (value_high != 0) {
@@ -2305,7 +2324,6 @@
                                double value,
                                Register scratch,
                                Condition cond) {
-  // TODO(regis): Revisit this code sequence.
   ASSERT(scratch != PC);
   ASSERT(scratch != IP);
   if (!vmovd(dd, value, cond)) {
@@ -2467,6 +2485,82 @@
 }
 
 
+void Assembler::CopyDoubleField(
+    Register dst, Register src, Register tmp1, Register tmp2, DRegister dtmp) {
+  if (TargetCPUFeatures::vfp_supported()) {
+    LoadDFromOffset(dtmp, src, Double::value_offset() - kHeapObjectTag);
+    StoreDToOffset(dtmp, dst, Double::value_offset() - kHeapObjectTag);
+  } else {
+    LoadFromOffset(kWord, tmp1, src,
+        Double::value_offset() - kHeapObjectTag);
+    LoadFromOffset(kWord, tmp2, src,
+        Double::value_offset() + kWordSize - kHeapObjectTag);
+    StoreToOffset(kWord, tmp1, dst,
+        Double::value_offset() - kHeapObjectTag);
+    StoreToOffset(kWord, tmp2, dst,
+        Double::value_offset() + kWordSize - kHeapObjectTag);
+  }
+}
+
+
+void Assembler::CopyFloat32x4Field(
+    Register dst, Register src, Register tmp1, Register tmp2, DRegister dtmp) {
+  if (TargetCPUFeatures::neon_supported()) {
+    LoadMultipleDFromOffset(dtmp, 2, src,
+        Float32x4::value_offset() - kHeapObjectTag);
+    StoreMultipleDToOffset(dtmp, 2, dst,
+        Float32x4::value_offset() - kHeapObjectTag);
+  } else {
+    LoadFromOffset(kWord, tmp1, src,
+        (Float32x4::value_offset() + 0 * kWordSize) - kHeapObjectTag);
+    LoadFromOffset(kWord, tmp2, src,
+        (Float32x4::value_offset() + 1 * kWordSize) - kHeapObjectTag);
+    StoreToOffset(kWord, tmp1, dst,
+        (Float32x4::value_offset() + 0 * kWordSize) - kHeapObjectTag);
+    StoreToOffset(kWord, tmp2, dst,
+        (Float32x4::value_offset() + 1 * kWordSize) - kHeapObjectTag);
+
+    LoadFromOffset(kWord, tmp1, src,
+        (Float32x4::value_offset() + 2 * kWordSize) - kHeapObjectTag);
+    LoadFromOffset(kWord, tmp2, src,
+        (Float32x4::value_offset() + 3 * kWordSize) - kHeapObjectTag);
+    StoreToOffset(kWord, tmp1, dst,
+        (Float32x4::value_offset() + 2 * kWordSize) - kHeapObjectTag);
+    StoreToOffset(kWord, tmp2, dst,
+        (Float32x4::value_offset() + 3 * kWordSize) - kHeapObjectTag);
+  }
+}
+
+
+void Assembler::CopyFloat64x2Field(
+    Register dst, Register src, Register tmp1, Register tmp2, DRegister dtmp) {
+  if (TargetCPUFeatures::neon_supported()) {
+    LoadMultipleDFromOffset(dtmp, 2, src,
+        Float64x2::value_offset() - kHeapObjectTag);
+    StoreMultipleDToOffset(dtmp, 2, dst,
+        Float64x2::value_offset() - kHeapObjectTag);
+  } else {
+    LoadFromOffset(kWord, tmp1, src,
+        (Float64x2::value_offset() + 0 * kWordSize) - kHeapObjectTag);
+    LoadFromOffset(kWord, tmp2, src,
+        (Float64x2::value_offset() + 1 * kWordSize) - kHeapObjectTag);
+    StoreToOffset(kWord, tmp1, dst,
+        (Float64x2::value_offset() + 0 * kWordSize) - kHeapObjectTag);
+    StoreToOffset(kWord, tmp2, dst,
+        (Float64x2::value_offset() + 1 * kWordSize) - kHeapObjectTag);
+
+    LoadFromOffset(kWord, tmp1, src,
+        (Float64x2::value_offset() + 2 * kWordSize) - kHeapObjectTag);
+    LoadFromOffset(kWord, tmp2, src,
+        (Float64x2::value_offset() + 3 * kWordSize) - kHeapObjectTag);
+    StoreToOffset(kWord, tmp1, dst,
+        (Float64x2::value_offset() + 2 * kWordSize) - kHeapObjectTag);
+    StoreToOffset(kWord, tmp2, dst,
+        (Float64x2::value_offset() + 3 * kWordSize) - kHeapObjectTag);
+  }
+}
+
+
 void Assembler::AddImmediate(Register rd, int32_t value, Condition cond) {
   AddImmediate(rd, rd, value, cond);
 }
@@ -2508,8 +2602,10 @@
                                     Condition cond) {
   ShifterOperand shifter_op;
   if (ShifterOperand::CanHold(value, &shifter_op)) {
+    // Handles value == kMinInt32.
     adds(rd, rn, shifter_op, cond);
   } else if (ShifterOperand::CanHold(-value, &shifter_op)) {
+    ASSERT(value != kMinInt32);  // Would cause erroneous overflow detection.
     subs(rd, rn, shifter_op, cond);
   } else {
     ASSERT(rn != IP);
@@ -2517,6 +2613,7 @@
       mvn(IP, shifter_op, cond);
       adds(rd, rn, ShifterOperand(IP), cond);
     } else if (ShifterOperand::CanHold(~(-value), &shifter_op)) {
+      ASSERT(value != kMinInt32);  // Would cause erroneous overflow detection.
       mvn(IP, shifter_op, cond);
       subs(rd, rn, ShifterOperand(IP), cond);
     } else {
@@ -2527,24 +2624,27 @@
 }
 
 
-void Assembler::AddImmediateWithCarry(Register rd, Register rn, int32_t value,
-                                     Condition cond) {
+void Assembler::SubImmediateSetFlags(Register rd, Register rn, int32_t value,
+                                    Condition cond) {
   ShifterOperand shifter_op;
   if (ShifterOperand::CanHold(value, &shifter_op)) {
-    adc(rd, rn, shifter_op, cond);
-  } else if (ShifterOperand::CanHold(-value - 1, &shifter_op)) {
-    sbc(rd, rn, shifter_op, cond);
+    // Handles value == kMinInt32.
+    subs(rd, rn, shifter_op, cond);
+  } else if (ShifterOperand::CanHold(-value, &shifter_op)) {
+    ASSERT(value != kMinInt32);  // Would cause erroneous overflow detection.
+    adds(rd, rn, shifter_op, cond);
   } else {
     ASSERT(rn != IP);
     if (ShifterOperand::CanHold(~value, &shifter_op)) {
       mvn(IP, shifter_op, cond);
-      adc(rd, rn, ShifterOperand(IP), cond);
-    } else if (ShifterOperand::CanHold(~(-value - 1), &shifter_op)) {
+      subs(rd, rn, ShifterOperand(IP), cond);
+    } else if (ShifterOperand::CanHold(~(-value), &shifter_op)) {
+      ASSERT(value != kMinInt32);  // Would cause erroneous overflow detection.
       mvn(IP, shifter_op, cond);
-      sbc(rd, rn, ShifterOperand(IP), cond);
+      adds(rd, rn, ShifterOperand(IP), cond);
     } else {
       LoadDecodableImmediate(IP, value, cond);
-      adc(rd, rn, ShifterOperand(IP), cond);
+      subs(rd, rn, ShifterOperand(IP), cond);
     }
   }
 }
@@ -2711,14 +2811,16 @@
   EnterFrame(kDartVolatileCpuRegs | (1 << FP) | (1 << LR), 0);
 
   // Preserve all volatile FPU registers.
-  DRegister firstv = EvenDRegisterOf(kDartFirstVolatileFpuReg);
-  DRegister lastv = OddDRegisterOf(kDartLastVolatileFpuReg);
-  if ((lastv - firstv + 1) >= 16) {
-    DRegister mid = static_cast<DRegister>(firstv + 16);
-    vstmd(DB_W, SP, mid, lastv - mid + 1);
-    vstmd(DB_W, SP, firstv, 16);
-  } else {
-    vstmd(DB_W, SP, firstv, lastv - firstv + 1);
+  if (TargetCPUFeatures::vfp_supported()) {
+    DRegister firstv = EvenDRegisterOf(kDartFirstVolatileFpuReg);
+    DRegister lastv = OddDRegisterOf(kDartLastVolatileFpuReg);
+    if ((lastv - firstv + 1) >= 16) {
+      DRegister mid = static_cast<DRegister>(firstv + 16);
+      vstmd(DB_W, SP, mid, lastv - mid + 1);
+      vstmd(DB_W, SP, firstv, 16);
+    } else {
+      vstmd(DB_W, SP, firstv, lastv - firstv + 1);
+    }
   }
 
   ReserveAlignedFrameSpace(frame_space);
@@ -2729,20 +2831,25 @@
   // SP might have been modified to reserve space for arguments
   // and ensure proper alignment of the stack frame.
   // We need to restore it before restoring registers.
+  const intptr_t kPushedFpuRegisterSize =
+      TargetCPUFeatures::vfp_supported() ?
+      kDartVolatileFpuRegCount * kFpuRegisterSize : 0;
+
   const intptr_t kPushedRegistersSize =
-      kDartVolatileCpuRegCount * kWordSize +
-      kDartVolatileFpuRegCount * kFpuRegisterSize;
+      kDartVolatileCpuRegCount * kWordSize + kPushedFpuRegisterSize;
   AddImmediate(SP, FP, -kPushedRegistersSize);
 
   // Restore all volatile FPU registers.
-  DRegister firstv = EvenDRegisterOf(kDartFirstVolatileFpuReg);
-  DRegister lastv = OddDRegisterOf(kDartLastVolatileFpuReg);
-  if ((lastv - firstv + 1) >= 16) {
-    DRegister mid = static_cast<DRegister>(firstv + 16);
-    vldmd(IA_W, SP, firstv, 16);
-    vldmd(IA_W, SP, mid, lastv - mid + 1);
-  } else {
-    vldmd(IA_W, SP, firstv, lastv - firstv + 1);
+  if (TargetCPUFeatures::vfp_supported()) {
+    DRegister firstv = EvenDRegisterOf(kDartFirstVolatileFpuReg);
+    DRegister lastv = OddDRegisterOf(kDartLastVolatileFpuReg);
+    if ((lastv - firstv + 1) >= 16) {
+      DRegister mid = static_cast<DRegister>(firstv + 16);
+      vldmd(IA_W, SP, firstv, 16);
+      vldmd(IA_W, SP, mid, lastv - mid + 1);
+    } else {
+      vldmd(IA_W, SP, firstv, lastv - firstv + 1);
+    }
   }
 
   // Restore volatile CPU registers.
@@ -3021,7 +3128,7 @@
 
 static const char* fpu_reg_names[kNumberOfFpuRegisters] = {
   "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
-#ifdef VFPv3_D32
+#if defined(VFPv3_D32)
   "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
 #endif
 };
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index 2440465..607754b 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -561,10 +561,6 @@
   // Branch and link to an entry address. Call sequence can be patched.
   void BranchLinkPatchable(const ExternalLabel* label);
 
-  // Branch and link to entry after storing return address at ad.
-  // Call sequence is never patched.
-  void BranchLinkStore(const ExternalLabel* label, Address ad);
-
   // Branch and link to [base + offset]. Call sequence is never patched.
   void BranchLinkOffset(Register base, int32_t offset);
 
@@ -574,9 +570,8 @@
                     Condition cond = AL);
   void AddImmediateSetFlags(Register rd, Register rn, int32_t value,
                             Condition cond = AL);
-  void AddImmediateWithCarry(Register rd, Register rn, int32_t value,
-                             Condition cond = AL);
-
+  void SubImmediateSetFlags(Register rd, Register rn, int32_t value,
+                            Condition cond = AL);
   void AndImmediate(Register rd, Register rs, int32_t imm, Condition cond = AL);
 
   // Test rn and immediate. May clobber IP.
@@ -672,6 +667,13 @@
                               Register base,
                               int32_t offset);
 
+  void CopyDoubleField(Register dst, Register src,
+                       Register tmp1, Register tmp2, DRegister dtmp);
+  void CopyFloat32x4Field(Register dst, Register src,
+                          Register tmp1, Register tmp2, DRegister dtmp);
+  void CopyFloat64x2Field(Register dst, Register src,
+                          Register tmp1, Register tmp2, DRegister dtmp);
+
   void Push(Register rd, Condition cond = AL);
   void Pop(Register rd, Condition cond = AL);
 
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index aeaa13b..090d6a7 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -20,6 +20,7 @@
 
 namespace dart {
 
+DEFINE_FLAG(bool, use_far_branches, false, "Always use far branches");
 DEFINE_FLAG(bool, print_stop_message, false, "Print stop message.");
 DECLARE_FLAG(bool, inline_alloc);
 
@@ -123,18 +124,81 @@
 }
 
 
-// TODO(zra): Support for far branches. Requires loading large immediates.
 void Assembler::Bind(Label* label) {
   ASSERT(!label->IsBound());
-  intptr_t bound_pc = buffer_.Size();
+  const intptr_t bound_pc = buffer_.Size();
 
   while (label->IsLinked()) {
     const int64_t position = label->Position();
     const int64_t dest = bound_pc - position;
-    const int32_t next = buffer_.Load<int32_t>(position);
-    const int32_t encoded = EncodeImm19BranchOffset(dest, next);
-    buffer_.Store<int32_t>(position, encoded);
-    label->position_ = DecodeImm19BranchOffset(next);
+    if (use_far_branches() && !CanEncodeImm19BranchOffset(dest)) {
+      // Far branches are enabled, and we can't encode the branch offset in
+      // 19 bits.
+
+      // Grab the guarding branch instruction.
+      const int32_t guard_branch =
+          buffer_.Load<int32_t>(position + 0 * Instr::kInstrSize);
+
+      // Grab the far branch instruction.
+      const int32_t far_branch =
+          buffer_.Load<int32_t>(position + 1 * Instr::kInstrSize);
+
+      const Condition c = DecodeImm19BranchCondition(guard_branch);
+
+      // Grab the link to the next branch.
+      const int32_t next = DecodeImm26BranchOffset(far_branch);
+
+      // dest is the offset is from the guarding branch instruction.
+      // Correct it to be from the following instruction.
+      const int64_t offset = dest - Instr::kInstrSize;
+
+      // Encode the branch.
+      const int32_t encoded_branch =
+          EncodeImm26BranchOffset(offset, far_branch);
+
+      // If the guard branch is conditioned on NV, replace it with a nop.
+      if (c == NV) {
+        buffer_.Store<int32_t>(position + 0 * Instr::kInstrSize,
+                               Instr::kNopInstruction);
+      }
+
+      // Write the far branch into the buffer and link to the next branch.
+      buffer_.Store<int32_t>(position + 1 * Instr::kInstrSize, encoded_branch);
+      label->position_ = next;
+    } else if (use_far_branches() && CanEncodeImm19BranchOffset(dest)) {
+      // We assembled a far branch, but we don't need it. Replace it with a near
+      // branch.
+
+      // Grab the guarding branch instruction.
+      const int32_t guard_branch =
+          buffer_.Load<int32_t>(position + 0 * Instr::kInstrSize);
+
+      // Grab the far branch instruction.
+      const int32_t far_branch =
+          buffer_.Load<int32_t>(position + 1 * Instr::kInstrSize);
+
+      // Grab the link to the next branch.
+      const int32_t next = DecodeImm26BranchOffset(far_branch);
+
+      // Re-target the guarding branch and flip the conditional sense.
+      int32_t encoded_guard_branch =
+          EncodeImm19BranchOffset(dest, guard_branch);
+      const Condition c = DecodeImm19BranchCondition(encoded_guard_branch);
+      encoded_guard_branch = EncodeImm19BranchCondition(
+          InvertCondition(c), encoded_guard_branch);
+
+      // Write back the re-encoded instructions. The far branch becomes a nop.
+      buffer_.Store<int32_t>(
+          position + 0 * Instr::kInstrSize, encoded_guard_branch);
+      buffer_.Store<int32_t>(
+          position + 1 * Instr::kInstrSize, Instr::kNopInstruction);
+      label->position_ = next;
+    } else {
+      const int32_t next = buffer_.Load<int32_t>(position);
+      const int32_t encoded = EncodeImm19BranchOffset(dest, next);
+      buffer_.Store<int32_t>(position, encoded);
+      label->position_ = DecodeImm19BranchOffset(next);
+    }
   }
   label->BindTo(bound_pc);
 }
@@ -299,11 +363,20 @@
   sub(pp, pp, Operand(kHeapObjectTag));
 }
 
+
 void Assembler::LoadWordFromPoolOffset(Register dst, Register pp,
                                        uint32_t offset) {
   ASSERT(dst != pp);
+  Operand op;
+  const uint32_t upper20 = offset & 0xfffff000;
   if (Address::CanHoldOffset(offset)) {
     ldr(dst, Address(pp, offset));
+  } else if (Operand::CanHold(upper20, kXRegSizeInBits, &op) ==
+             Operand::Immediate) {
+    const uint32_t lower12 = offset & 0x00000fff;
+    ASSERT(Address::CanHoldOffset(lower12));
+    add(dst, pp, op);
+    ldr(dst, Address(dst, lower12));
   } else {
     const uint16_t offset_low = Utils::Low16Bits(offset);
     const uint16_t offset_high = Utils::High16Bits(offset);
@@ -316,6 +389,21 @@
 }
 
 
+void Assembler::LoadWordFromPoolOffsetFixed(Register dst, Register pp,
+                                            uint32_t offset) {
+  ASSERT(dst != pp);
+  Operand op;
+  const uint32_t upper20 = offset & 0xfffff000;
+  const uint32_t lower12 = offset & 0x00000fff;
+  const Operand::OperandType ot =
+      Operand::CanHold(upper20, kXRegSizeInBits, &op);
+  ASSERT(ot == Operand::Immediate);
+  ASSERT(Address::CanHoldOffset(lower12));
+  add(dst, pp, op);
+  ldr(dst, Address(dst, lower12));
+}
+
+
 intptr_t Assembler::FindExternalLabel(const ExternalLabel* label,
                                       Patchability patchable) {
   // The object pool cannot be used in the vm isolate.
@@ -402,6 +490,9 @@
 bool Assembler::CanLoadImmediateFromPool(int64_t imm, Register pp) {
   return !Utils::IsInt(32, imm) &&
          (pp != kNoPP) &&
+         // We *could* put constants in the pool in a VM isolate, but it is
+         // simpler to maintain the invariant that the object pool is not used
+         // in the VM isolate.
          (Isolate::Current() != Dart::vm_isolate());
 }
 
@@ -410,9 +501,24 @@
                                   const ExternalLabel* label,
                                   Patchability patchable,
                                   Register pp) {
+  const int64_t target = static_cast<int64_t>(label->address());
+  if (CanLoadImmediateFromPool(target, pp)) {
+    const int32_t offset =
+        Array::element_offset(FindExternalLabel(label, patchable));
+    LoadWordFromPoolOffset(dst, pp, offset);
+  } else {
+    LoadImmediate(dst, target, kNoPP);
+  }
+}
+
+
+void Assembler::LoadExternalLabelFixed(Register dst,
+                                       const ExternalLabel* label,
+                                       Patchability patchable,
+                                       Register pp) {
   const int32_t offset =
       Array::element_offset(FindExternalLabel(label, patchable));
-  LoadWordFromPoolOffset(dst, pp, offset);
+  LoadWordFromPoolOffsetFixed(dst, pp, offset);
 }
 
 
@@ -578,6 +684,12 @@
 void Assembler::AddImmediate(
     Register dest, Register rn, int64_t imm, Register pp) {
   Operand op;
+  if (imm == 0) {
+    if (dest != rn) {
+      mov(dest, rn);
+    }
+    return;
+  }
   if (Operand::CanHold(imm, kXRegSizeInBits, &op) == Operand::Immediate) {
     add(dest, rn, op);
   } else if (Operand::CanHold(-imm, kXRegSizeInBits, &op) ==
@@ -596,9 +708,11 @@
     Register dest, Register rn, int64_t imm, Register pp) {
   Operand op;
   if (Operand::CanHold(imm, kXRegSizeInBits, &op) == Operand::Immediate) {
+    // Handles imm == kMinInt64.
     adds(dest, rn, op);
   } else if (Operand::CanHold(-imm, kXRegSizeInBits, &op) ==
              Operand::Immediate) {
+    ASSERT(imm != kMinInt64);  // Would cause erroneous overflow detection.
     subs(dest, rn, op);
   } else {
     // TODO(zra): Try adding top 12 bits, then bottom 12 bits.
@@ -609,6 +723,25 @@
 }
 
 
+void Assembler::SubImmediateSetFlags(
+    Register dest, Register rn, int64_t imm, Register pp) {
+  Operand op;
+  if (Operand::CanHold(imm, kXRegSizeInBits, &op) == Operand::Immediate) {
+    // Handles imm == kMinInt64.
+    subs(dest, rn, op);
+  } else if (Operand::CanHold(-imm, kXRegSizeInBits, &op) ==
+             Operand::Immediate) {
+    ASSERT(imm != kMinInt64);  // Would cause erroneous overflow detection.
+    adds(dest, rn, op);
+  } else {
+    // TODO(zra): Try subtracting top 12 bits, then bottom 12 bits.
+    ASSERT(rn != TMP2);
+    LoadImmediate(TMP2, imm, pp);
+    subs(dest, rn, Operand(TMP2));
+  }
+}
+
+
 void Assembler::AndImmediate(
     Register rd, Register rn, int64_t imm, Register pp) {
   Operand imm_op;
@@ -672,56 +805,78 @@
 
 
 void Assembler::LoadFromOffset(
-    Register dest, Register base, int32_t offset, OperandSize sz) {
+    Register dest, Register base, int32_t offset, Register pp, OperandSize sz) {
   if (Address::CanHoldOffset(offset, Address::Offset, sz)) {
     ldr(dest, Address(base, offset, Address::Offset, sz), sz);
   } else {
     ASSERT(base != TMP2);
-    // Since offset is 32-bits, it won't be loaded from the pool.
-    AddImmediate(TMP2, base, offset, kNoPP);
+    AddImmediate(TMP2, base, offset, pp);
     ldr(dest, Address(TMP2), sz);
   }
 }
 
 
-void Assembler::LoadDFromOffset(VRegister dest, Register base, int32_t offset) {
+void Assembler::LoadDFromOffset(
+    VRegister dest, Register base, int32_t offset, Register pp) {
   if (Address::CanHoldOffset(offset, Address::Offset, kDWord)) {
     fldrd(dest, Address(base, offset, Address::Offset, kDWord));
   } else {
     ASSERT(base != TMP2);
-    // Since offset is 32-bits, it won't be loaded from the pool.
-    AddImmediate(TMP2, base, offset, kNoPP);
+    AddImmediate(TMP2, base, offset, pp);
     fldrd(dest, Address(TMP2));
   }
 }
 
 
+void Assembler::LoadQFromOffset(
+    VRegister dest, Register base, int32_t offset, Register pp) {
+  if (Address::CanHoldOffset(offset, Address::Offset, kQWord)) {
+    fldrq(dest, Address(base, offset, Address::Offset, kQWord));
+  } else {
+    ASSERT(base != TMP2);
+    AddImmediate(TMP2, base, offset, pp);
+    fldrq(dest, Address(TMP2));
+  }
+}
+
+
 void Assembler::StoreToOffset(
-    Register src, Register base, int32_t offset, OperandSize sz) {
+    Register src, Register base, int32_t offset, Register pp, OperandSize sz) {
   ASSERT(base != TMP2);
   if (Address::CanHoldOffset(offset, Address::Offset, sz)) {
     str(src, Address(base, offset, Address::Offset, sz), sz);
   } else {
     ASSERT(src != TMP2);
-    // Since offset is 32-bits, it won't be loaded from the pool.
-    AddImmediate(TMP2, base, offset, kNoPP);
+    AddImmediate(TMP2, base, offset, pp);
     str(src, Address(TMP2), sz);
   }
 }
 
 
-void Assembler::StoreDToOffset(VRegister src, Register base, int32_t offset) {
+void Assembler::StoreDToOffset(
+    VRegister src, Register base, int32_t offset, Register pp) {
   if (Address::CanHoldOffset(offset, Address::Offset, kDWord)) {
     fstrd(src, Address(base, offset, Address::Offset, kDWord));
   } else {
     ASSERT(base != TMP2);
-    // Since offset is 32-bits, it won't be loaded from the pool.
-    AddImmediate(TMP2, base, offset, kNoPP);
+    AddImmediate(TMP2, base, offset, pp);
     fstrd(src, Address(TMP2));
   }
 }
 
 
+void Assembler::StoreQToOffset(
+    VRegister src, Register base, int32_t offset, Register pp) {
+  if (Address::CanHoldOffset(offset, Address::Offset, kQWord)) {
+    fstrq(src, Address(base, offset, Address::Offset, kQWord));
+  } else {
+    ASSERT(base != TMP2);
+    AddImmediate(TMP2, base, offset, pp);
+    fstrq(src, Address(TMP2));
+  }
+}
+
+
 // Store into object.
 // Preserves object and value registers.
 void Assembler::StoreIntoObjectFilterNoSmi(Register object,
@@ -754,6 +909,21 @@
 }
 
 
+void Assembler::StoreIntoObjectOffset(Register object,
+                                      int32_t offset,
+                                      Register value,
+                                      Register pp,
+                                      bool can_value_be_smi) {
+  if (Address::CanHoldOffset(offset - kHeapObjectTag)) {
+    StoreIntoObject(
+        object, FieldAddress(object, offset), value, can_value_be_smi);
+  } else {
+    AddImmediate(TMP, object, offset - kHeapObjectTag, pp);
+    StoreIntoObject(object, Address(TMP), value, can_value_be_smi);
+  }
+}
+
+
 void Assembler::StoreIntoObject(Register object,
                                 const Address& dest,
                                 Register value,
@@ -799,48 +969,74 @@
 }
 
 
+void Assembler::StoreIntoObjectOffsetNoBarrier(Register object,
+                                               int32_t offset,
+                                               Register value,
+                                               Register pp) {
+  if (Address::CanHoldOffset(offset - kHeapObjectTag)) {
+    StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value);
+  } else {
+    AddImmediate(TMP, object, offset - kHeapObjectTag, pp);
+    StoreIntoObjectNoBarrier(object, Address(TMP), value);
+  }
+}
+
+
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
                                          const Object& value) {
   ASSERT(value.IsSmi() || value.InVMHeap() ||
          (value.IsOld() && value.IsNotTemporaryScopedHandle()));
   // No store buffer update.
-  LoadObject(TMP, value, PP);
-  str(TMP, dest);
+  LoadObject(TMP2, value, PP);
+  str(TMP2, dest);
 }
 
 
-void Assembler::LoadClassId(Register result, Register object) {
+void Assembler::StoreIntoObjectOffsetNoBarrier(Register object,
+                                               int32_t offset,
+                                               const Object& value,
+                                               Register pp) {
+  if (Address::CanHoldOffset(offset - kHeapObjectTag)) {
+    StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value);
+  } else {
+    AddImmediate(TMP, object, offset - kHeapObjectTag, pp);
+    StoreIntoObjectNoBarrier(object, Address(TMP), value);
+  }
+}
+
+
+void Assembler::LoadClassId(Register result, Register object, Register pp) {
   ASSERT(RawObject::kClassIdTagPos == 16);
   ASSERT(RawObject::kClassIdTagSize == 16);
   const intptr_t class_id_offset = Object::tags_offset() +
       RawObject::kClassIdTagPos / kBitsPerByte;
-  LoadFromOffset(result, object, class_id_offset - kHeapObjectTag,
+  LoadFromOffset(result, object, class_id_offset - kHeapObjectTag, pp,
                  kUnsignedHalfword);
 }
 
 
-void Assembler::LoadClassById(Register result, Register class_id) {
+void Assembler::LoadClassById(Register result, Register class_id, Register pp) {
   ASSERT(result != class_id);
-  LoadFieldFromOffset(result, CTX, Context::isolate_offset());
+  LoadFieldFromOffset(result, CTX, Context::isolate_offset(), pp);
   const intptr_t table_offset_in_isolate =
       Isolate::class_table_offset() + ClassTable::table_offset();
-  LoadFromOffset(result, result, table_offset_in_isolate);
+  LoadFromOffset(result, result, table_offset_in_isolate, pp);
   ldr(result, Address(result, class_id, UXTX, Address::Scaled));
 }
 
 
-void Assembler::LoadClass(Register result, Register object) {
+void Assembler::LoadClass(Register result, Register object, Register pp) {
   ASSERT(object != TMP);
-  LoadClassId(TMP, object);
-  LoadClassById(result, TMP);
+  LoadClassId(TMP, object, pp);
+  LoadClassById(result, TMP, pp);
 }
 
 
-void Assembler::CompareClassId(Register object,
-                               intptr_t class_id) {
-  LoadClassId(TMP, object);
-  CompareImmediate(TMP, class_id, PP);
+void Assembler::CompareClassId(
+    Register object, intptr_t class_id, Register pp) {
+  LoadClassId(TMP, object, pp);
+  CompareImmediate(TMP, class_id, pp);
 }
 
 
@@ -848,7 +1044,9 @@
 void Assembler::ReserveAlignedFrameSpace(intptr_t frame_space) {
   // Reserve space for arguments and align frame before entering
   // the C++ world.
-  AddImmediate(SP, SP, -frame_space, kNoPP);
+  if (frame_space != 0) {
+    AddImmediate(SP, SP, -frame_space, kNoPP);
+  }
   if (OS::ActivationFrameAlignment() > 1) {
     mov(TMP, SP);  // SP can't be register operand of andi.
     andi(TMP, TMP, ~(OS::ActivationFrameAlignment() - 1));
@@ -922,7 +1120,7 @@
   Comment("EnterOsrFrame");
   adr(TMP, -CodeSize());
 
-  StoreToOffset(TMP, FP, kPcMarkerSlotFromFp * kWordSize);
+  StoreToOffset(TMP, FP, kPcMarkerSlotFromFp * kWordSize, kNoPP);
 
   // Setup pool pointer for this dart function.
   if (new_pp == kNoPP) {
@@ -939,7 +1137,7 @@
 
 void Assembler::LeaveDartFrame() {
   // Restore and untag PP.
-  LoadFromOffset(PP, FP, kSavedCallerPpSlotFromFp * kWordSize);
+  LoadFromOffset(PP, FP, kSavedCallerPpSlotFromFp * kWordSize, kNoPP);
   sub(PP, PP, Operand(kHeapObjectTag));
   LeaveFrame();
 }
@@ -1022,7 +1220,7 @@
 
 void Assembler::LeaveStubFrame() {
   // Restore and untag PP.
-  LoadFromOffset(PP, FP, kSavedCallerPpSlotFromFp * kWordSize);
+  LoadFromOffset(PP, FP, kSavedCallerPpSlotFromFp * kWordSize, kNoPP);
   sub(PP, PP, Operand(kHeapObjectTag));
   LeaveFrame();
 }
@@ -1151,7 +1349,7 @@
     ASSERT(cls.id() != kIllegalCid);
     tags = RawObject::ClassIdTag::update(cls.id(), tags);
     LoadImmediate(TMP, tags, pp);
-    StoreFieldToOffset(TMP, instance_reg, Object::tags_offset());
+    StoreFieldToOffset(TMP, instance_reg, Object::tags_offset(), pp);
   } else {
     b(failure);
   }
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index 17b317e..10cfef3 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -13,6 +13,7 @@
 #include "platform/utils.h"
 #include "vm/constants_arm64.h"
 #include "vm/hash_map.h"
+#include "vm/longjump.h"
 #include "vm/object.h"
 #include "vm/simulator.h"
 
@@ -472,6 +473,9 @@
   void and_(Register rd, Register rn, Operand o) {
     EmitLogicalShiftOp(AND, rd, rn, o, kDoubleWord);
   }
+  void andw_(Register rd, Register rn, Operand o) {
+    EmitLogicalShiftOp(AND, rd, rn, o, kWord);
+  }
   void bic(Register rd, Register rn, Operand o) {
     EmitLogicalShiftOp(BIC, rd, rn, o, kDoubleWord);
   }
@@ -484,6 +488,9 @@
   void eor(Register rd, Register rn, Operand o) {
     EmitLogicalShiftOp(EOR, rd, rn, o, kDoubleWord);
   }
+  void eorw(Register rd, Register rn, Operand o) {
+    EmitLogicalShiftOp(EOR, rd, rn, o, kWord);
+  }
   void eon(Register rd, Register rn, Operand o) {
     EmitLogicalShiftOp(EON, rd, rn, o, kDoubleWord);
   }
@@ -549,7 +556,11 @@
       ASSERT(((a.type() != Address::PreIndex) &&
               (a.type() != Address::PostIndex)) ||
              (rt != a.base()));
-      EmitLoadStoreReg(LDR, rt, a, sz);
+      if (IsSignedOperand(sz)) {
+        EmitLoadStoreReg(LDRS, rt, a, sz);
+      } else {
+        EmitLoadStoreReg(LDR, rt, a, sz);
+      }
     }
   }
   void str(Register rt, Address a, OperandSize sz = kDoubleWord) {
@@ -597,7 +608,13 @@
     EmitBranch(BCOND, cond, label);
   }
 
-  // TODO(zra): branch and link with imm26 offset.
+  void b(int32_t offset) {
+    EmitUnconditionalBranchOp(B, offset);
+  }
+  void bl(int32_t offset) {
+    EmitUnconditionalBranchOp(BL, offset);
+  }
+
   // TODO(zra): cbz, cbnz.
 
   // Branch, link, return.
@@ -658,18 +675,49 @@
   void fmovdd(VRegister vd, VRegister vn) {
     EmitFPOneSourceOp(FMOVDD, vd, vn);
   }
+  void fabsd(VRegister vd, VRegister vn) {
+    EmitFPOneSourceOp(FABSD, vd, vn);
+  }
+  void fnegd(VRegister vd, VRegister vn) {
+    EmitFPOneSourceOp(FNEGD, vd, vn);
+  }
+  void fsqrtd(VRegister vd, VRegister vn) {
+    EmitFPOneSourceOp(FSQRTD, vd, vn);
+  }
+  void fcvtsd(VRegister vd, VRegister vn) {
+    EmitFPOneSourceOp(FCVTSD, vd, vn);
+  }
+  void fcvtds(VRegister vd, VRegister vn) {
+    EmitFPOneSourceOp(FCVTDS, vd, vn);
+  }
+  void fldrq(VRegister vt, Address a) {
+    ASSERT(a.type() != Address::PCOffset);
+    EmitLoadStoreReg(FLDRQ, static_cast<Register>(vt), a, kByte);
+  }
+  void fstrq(VRegister vt, Address a) {
+    ASSERT(a.type() != Address::PCOffset);
+    EmitLoadStoreReg(FSTRQ, static_cast<Register>(vt), a, kByte);
+  }
   void fldrd(VRegister vt, Address a) {
     ASSERT(a.type() != Address::PCOffset);
-    EmitLoadStoreReg(FLDR, static_cast<Register>(vt), a, kDoubleWord);
+    EmitLoadStoreReg(FLDR, static_cast<Register>(vt), a, kDWord);
   }
   void fstrd(VRegister vt, Address a) {
     ASSERT(a.type() != Address::PCOffset);
-    EmitLoadStoreReg(FSTR, static_cast<Register>(vt), a, kDoubleWord);
+    EmitLoadStoreReg(FSTR, static_cast<Register>(vt), a, kDWord);
+  }
+  void fldrs(VRegister vt, Address a) {
+    ASSERT(a.type() != Address::PCOffset);
+    EmitLoadStoreReg(FLDR, static_cast<Register>(vt), a, kSWord);
+  }
+  void fstrs(VRegister vt, Address a) {
+    ASSERT(a.type() != Address::PCOffset);
+    EmitLoadStoreReg(FSTR, static_cast<Register>(vt), a, kSWord);
   }
   void fcmpd(VRegister vn, VRegister vm) {
     EmitFPCompareOp(FCMPD, vn, vm);
   }
-  void fcmpzd(VRegister vn) {
+  void fcmpdz(VRegister vn) {
     EmitFPCompareOp(FCMPZD, vn, V0);
   }
   void fmuld(VRegister vd, VRegister vn, VRegister vm) {
@@ -738,9 +786,16 @@
   void Lsl(Register rd, Register rn, int shift) {
     add(rd, ZR, Operand(rn, LSL, shift));
   }
+  void Lslw(Register rd, Register rn, int shift) {
+    addw(rd, ZR, Operand(rn, LSL, shift));
+  }
   void Lsr(Register rd, Register rn, int shift) {
     add(rd, ZR, Operand(rn, LSR, shift));
   }
+  void Lsrw(Register rd, Register rn, int shift) {
+    ASSERT((shift >= 0) && (shift < 32));
+    addw(rd, ZR, Operand(rn, LSR, shift));
+  }
   void Asr(Register rd, Register rn, int shift) {
     add(rd, ZR, Operand(rn, ASR, shift));
   }
@@ -753,34 +808,27 @@
   }
 
   // Branching to ExternalLabels.
-  void BranchPatchable(const ExternalLabel* label, Register pp) {
-    LoadExternalLabel(TMP, label, kPatchable, pp);
-    br(TMP);
-  }
-
   void Branch(const ExternalLabel* label, Register pp) {
     LoadExternalLabel(TMP, label, kNotPatchable, pp);
     br(TMP);
   }
 
   // Fixed length branch to label.
-  void BranchFixed(const ExternalLabel* label) {
+  void BranchPatchable(const ExternalLabel* label) {
+    // TODO(zra): Use LoadExternalLabelFixed if possible.
     LoadImmediateFixed(TMP, label->address());
     br(TMP);
   }
 
   void BranchLink(const ExternalLabel* label, Register pp) {
-    if (Isolate::Current() == Dart::vm_isolate()) {
-      LoadImmediate(TMP, label->address(), kNoPP);
-      blr(TMP);
-    } else {
-      LoadExternalLabel(TMP, label, kNotPatchable, pp);
-      blr(TMP);
-    }
+    LoadExternalLabel(TMP, label, kNotPatchable, pp);
+    blr(TMP);
   }
 
+  // BranchLinkPatchable must be a fixed-length sequence so we can patch it
+  // with the debugger.
   void BranchLinkPatchable(const ExternalLabel* label) {
-    LoadExternalLabel(TMP, label, kPatchable, PP);
+    LoadExternalLabelFixed(TMP, label, kPatchable, PP);
     blr(TMP);
   }
 
@@ -791,6 +839,8 @@
   void AddImmediate(Register dest, Register rn, int64_t imm, Register pp);
   void AddImmediateSetFlags(
       Register dest, Register rn, int64_t imm, Register pp);
+  void SubImmediateSetFlags(
+      Register dest, Register rn, int64_t imm, Register pp);
   void AndImmediate(Register rd, Register rn, int64_t imm, Register pp);
   void OrImmediate(Register rd, Register rn, int64_t imm, Register pp);
   void XorImmediate(Register rd, Register rn, int64_t imm, Register pp);
@@ -798,23 +848,41 @@
   void CompareImmediate(Register rn, int64_t imm, Register pp);
 
   void LoadFromOffset(Register dest, Register base, int32_t offset,
-                      OperandSize sz = kDoubleWord);
-  void LoadFieldFromOffset(Register dest, Register base, int32_t offset) {
-    LoadFromOffset(dest, base, offset - kHeapObjectTag);
+                      Register pp, OperandSize sz = kDoubleWord);
+  void LoadFieldFromOffset(
+      Register dest, Register base, int32_t offset, Register pp) {
+    LoadFromOffset(dest, base, offset - kHeapObjectTag, pp);
   }
-  void LoadDFromOffset(VRegister dest, Register base, int32_t offset);
-  void LoadDFieldFromOffset(VRegister dest, Register base, int32_t offset) {
-    LoadDFromOffset(dest, base, offset - kHeapObjectTag);
+  void LoadDFromOffset(
+      VRegister dest, Register base, int32_t offset, Register pp);
+  void LoadDFieldFromOffset(
+      VRegister dest, Register base, int32_t offset, Register pp) {
+    LoadDFromOffset(dest, base, offset - kHeapObjectTag, pp);
+  }
+  void LoadQFromOffset(
+      VRegister dest, Register base, int32_t offset, Register pp);
+  void LoadQFieldFromOffset(
+      VRegister dest, Register base, int32_t offset, Register pp) {
+    LoadQFromOffset(dest, base, offset - kHeapObjectTag, pp);
   }
 
   void StoreToOffset(Register src, Register base, int32_t offset,
-                     OperandSize sz = kDoubleWord);
-  void StoreFieldToOffset(Register src, Register base, int32_t offset) {
-    StoreToOffset(src, base, offset - kHeapObjectTag);
+                     Register pp, OperandSize sz = kDoubleWord);
+  void StoreFieldToOffset(
+      Register src, Register base, int32_t offset, Register pp) {
+    StoreToOffset(src, base, offset - kHeapObjectTag, pp);
   }
-  void StoreDToOffset(VRegister src, Register base, int32_t offset);
-  void StoreDFieldToOffset(VRegister src, Register base, int32_t offset) {
-    StoreDToOffset(src, base, offset - kHeapObjectTag);
+  void StoreDToOffset(
+      VRegister src, Register base, int32_t offset, Register pp);
+  void StoreDFieldToOffset(
+      VRegister src, Register base, int32_t offset, Register pp) {
+    StoreDToOffset(src, base, offset - kHeapObjectTag, pp);
+  }
+  void StoreQToOffset(
+      VRegister src, Register base, int32_t offset, Register pp);
+  void StoreQFieldToOffset(
+      VRegister src, Register base, int32_t offset, Register pp) {
+    StoreQToOffset(src, base, offset - kHeapObjectTag, pp);
   }
 
   // Storing into an object.
@@ -822,12 +890,25 @@
                        const Address& dest,
                        Register value,
                        bool can_value_be_smi = true);
+  void StoreIntoObjectOffset(Register object,
+                             int32_t offset,
+                             Register value,
+                             Register pp,
+                             bool can_value_be_smi = true);
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
                                 Register value);
+  void StoreIntoObjectOffsetNoBarrier(Register object,
+                                      int32_t offset,
+                                      Register value,
+                                      Register pp);
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
                                 const Object& value);
+  void StoreIntoObjectOffsetNoBarrier(Register object,
+                                      int32_t offset,
+                                      const Object& value,
+                                      Register pp);
 
   // Object pool, loading from pool, etc.
   void LoadPoolPointer(Register pp);
@@ -841,6 +922,7 @@
   };
 
   void LoadWordFromPoolOffset(Register dst, Register pp, uint32_t offset);
+  void LoadWordFromPoolOffsetFixed(Register dst, Register pp, uint32_t offset);
   intptr_t FindExternalLabel(const ExternalLabel* label,
                              Patchability patchable);
   intptr_t FindObject(const Object& obj, Patchability patchable);
@@ -849,6 +931,10 @@
   bool CanLoadImmediateFromPool(int64_t imm, Register pp);
   void LoadExternalLabel(Register dst, const ExternalLabel* label,
                          Patchability patchable, Register pp);
+  void LoadExternalLabelFixed(Register dst,
+                              const ExternalLabel* label,
+                              Patchability patchable,
+                              Register pp);
   void LoadObject(Register dst, const Object& obj, Register pp);
   void LoadDecodableImmediate(Register reg, int64_t imm, Register pp);
   void LoadImmediateFixed(Register reg, int64_t imm);
@@ -861,10 +947,10 @@
   }
   void CompareObject(Register reg, const Object& object, Register pp);
 
-  void LoadClassId(Register result, Register object);
-  void LoadClassById(Register result, Register class_id);
-  void LoadClass(Register result, Register object);
-  void CompareClassId(Register object, intptr_t class_id);
+  void LoadClassId(Register result, Register object, Register pp);
+  void LoadClassById(Register result, Register class_id, Register pp);
+  void LoadClass(Register result, Register object, Register pp);
+  void CompareClassId(Register object, intptr_t class_id, Register pp);
 
   void EnterFrame(intptr_t frame_size);
   void LeaveFrame();
@@ -1057,6 +1143,11 @@
   }
 
   int32_t EncodeImm19BranchOffset(int64_t imm, int32_t instr) {
+    if (!CanEncodeImm19BranchOffset(imm)) {
+      ASSERT(!use_far_branches());
+      Isolate::Current()->long_jump_base()->Jump(
+          1, Object::branch_offset_error());
+    }
     const int32_t imm32 = static_cast<int32_t>(imm);
     const int32_t off = (((imm32 >> 2) << kImm19Shift) & kImm19Mask);
     return (instr & ~kImm19Mask) | off;
@@ -1067,6 +1158,26 @@
     return static_cast<int64_t>(off);
   }
 
+  Condition DecodeImm19BranchCondition(int32_t instr) {
+    return static_cast<Condition>((instr & kCondMask) >> kCondShift);
+  }
+
+  int32_t EncodeImm19BranchCondition(Condition cond, int32_t instr) {
+    const int32_t c_imm = static_cast<int32_t>(cond);
+    return (instr & ~kCondMask) | (c_imm << kCondShift);
+  }
+
+  int32_t EncodeImm26BranchOffset(int64_t imm, int32_t instr) {
+    const int32_t imm32 = static_cast<int32_t>(imm);
+    const int32_t off = (((imm32 >> 2) << kImm26Shift) & kImm26Mask);
+    return (instr & ~kImm26Mask) | off;
+  }
+
+  int64_t DecodeImm26BranchOffset(int32_t instr) {
+    const int32_t off = (((instr & kImm26Mask) >> kImm26Shift) << 6) >> 4;
+    return static_cast<int64_t>(off);
+  }
+
   void EmitCompareAndBranch(CompareAndBranchOp op, Register rt, int64_t imm,
                             OperandSize sz) {
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
@@ -1092,25 +1203,49 @@
     Emit(encoding);
   }
 
+  void EmitFarConditionalBranch(ConditionalBranchOp op,
+                                Condition cond,
+                                int64_t offset) {
+    EmitConditionalBranch(op, InvertCondition(cond), 2 * Instr::kInstrSize);
+    b(offset);
+  }
+
   bool CanEncodeImm19BranchOffset(int64_t offset) {
     ASSERT(Utils::IsAligned(offset, 4));
     return Utils::IsInt(21, offset);
   }
 
-  // TODO(zra): Implement far branches. Requires loading large immediates.
   void EmitBranch(ConditionalBranchOp op, Condition cond, Label* label) {
     if (label->IsBound()) {
       const int64_t dest = label->Position() - buffer_.Size();
-      ASSERT(CanEncodeImm19BranchOffset(dest));
-      EmitConditionalBranch(op, cond, dest);
+      if (use_far_branches() && !CanEncodeImm19BranchOffset(dest)) {
+        EmitFarConditionalBranch(op, cond, dest);
+      } else {
+        EmitConditionalBranch(op, cond, dest);
+      }
     } else {
       const int64_t position = buffer_.Size();
-      ASSERT(CanEncodeImm19BranchOffset(position));
-      EmitConditionalBranch(op, cond, label->position_);
+      if (use_far_branches()) {
+        EmitFarConditionalBranch(op, cond, label->position_);
+      } else {
+        EmitConditionalBranch(op, cond, label->position_);
+      }
       label->LinkTo(position);
     }
   }
 
+  bool CanEncodeImm26BranchOffset(int64_t offset) {
+    ASSERT(Utils::IsAligned(offset, 4));
+    return Utils::IsInt(26, offset);
+  }
+
+  void EmitUnconditionalBranchOp(UnconditionalBranchOp op, int64_t offset) {
+    ASSERT(CanEncodeImm26BranchOffset(offset));
+    const int32_t off = (offset >> 2) << kImm26Shift;
+    const int32_t encoding = op | off;
+    Emit(encoding);
+  }
+
   void EmitUnconditionalBranchRegOp(UnconditionalBranchRegOp op, Register rn) {
     ASSERT((rn != SP) && (rn != R31));
     const Register crn = ConcreteRegister(rn);
@@ -1143,7 +1278,7 @@
     const Register crt = ConcreteRegister(rt);
     const int32_t size = Log2OperandSizeBytes(sz);
     const int32_t encoding =
-        op | (size << kSzShift) |
+        op | ((size & 0x3) << kSzShift) |
         (static_cast<int32_t>(crt) << kRtShift) |
         a.encoding();
     Emit(encoding);
diff --git a/runtime/vm/assembler_arm64_test.cc b/runtime/vm/assembler_arm64_test.cc
index 9544852..6dca831 100644
--- a/runtime/vm/assembler_arm64_test.cc
+++ b/runtime/vm/assembler_arm64_test.cc
@@ -392,6 +392,21 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(LoadSigned32Bit, assembler) {
+  __ LoadImmediate(R1, 0xffffffff, kNoPP);
+  __ str(R1, Address(SP, -4, Address::PreIndex, kWord), kWord);
+  __ ldr(R0, Address(SP), kWord);
+  __ ldr(R1, Address(SP, 4, Address::PostIndex, kWord), kWord);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
 // Logical register operations.
 ASSEMBLER_TEST_GENERATE(AndRegs, assembler) {
   __ movz(R1, 43, 0);
@@ -808,7 +823,7 @@
   __ LoadDImmediate(V0, 235.0, kNoPP);
   __ LoadDImmediate(V1, 233.0, kNoPP);
 
-  __ fcmpzd(V1);
+  __ fcmpdz(V1);
   __ b(&l, GT);
   __ LoadDImmediate(V0, 0.0, kNoPP);
   __ ret();
@@ -1551,6 +1566,45 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(FldrsFstrsPrePostIndex, assembler) {
+  __ LoadDImmediate(V1, 42.0, kNoPP);
+  __ fcvtsd(V2, V1);
+  __ fstrs(V2, Address(SP, -1*kWordSize, Address::PreIndex));
+  __ fldrs(V3, Address(SP, 1*kWordSize, Address::PostIndex));
+  __ fcvtds(V0, V3);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FldrsFstrsPrePostIndex, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FldrqFstrqPrePostIndex, assembler) {
+  __ LoadDImmediate(V1, 21.0, kNoPP);
+  __ LoadDImmediate(V2, 21.0, kNoPP);
+  __ LoadImmediate(R1, 42, kNoPP);
+  __ Push(R1);
+  __ PushDouble(V1);
+  __ PushDouble(V2);
+  __ fldrq(V3, Address(SP, 2 * kWordSize, Address::PostIndex));
+  __ Pop(R0);
+  __ fstrq(V3, Address(SP, -2 * kWordSize, Address::PreIndex));
+  __ PopDouble(V0);
+  __ PopDouble(V1);
+  __ faddd(V0, V0, V1);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FldrqFstrqPrePostIndex, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
 ASSEMBLER_TEST_GENERATE(Fcvtzds, assembler) {
   __ LoadDImmediate(V0, 42.0, kNoPP);
   __ fcvtzds(R0, V0);
@@ -1577,6 +1631,71 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(FabsdPos, assembler) {
+  __ LoadDImmediate(V1, 42.0, kNoPP);
+  __ fabsd(V0, V1);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FabsdPos, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FabsdNeg, assembler) {
+  __ LoadDImmediate(V1, -42.0, kNoPP);
+  __ fabsd(V0, V1);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FabsdNeg, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FnegdPos, assembler) {
+  __ LoadDImmediate(V1, 42.0, kNoPP);
+  __ fnegd(V0, V1);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FnegdPos, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(-42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(FnegdNeg, assembler) {
+  __ LoadDImmediate(V1, -42.0, kNoPP);
+  __ fnegd(V0, V1);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(FnegdNeg, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Fsqrtd, assembler) {
+  __ LoadDImmediate(V1, 64.0, kNoPP);
+  __ fsqrtd(V0, V1);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Fsqrtd, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(8.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
 ASSEMBLER_TEST_GENERATE(Fmuld, assembler) {
   __ LoadDImmediate(V1, 84.0, kNoPP);
   __ LoadDImmediate(V2, 0.5, kNoPP);
diff --git a/runtime/vm/assembler_arm_test.cc b/runtime/vm/assembler_arm_test.cc
index 6eff131..6973e27 100644
--- a/runtime/vm/assembler_arm_test.cc
+++ b/runtime/vm/assembler_arm_test.cc
@@ -98,17 +98,21 @@
 
 
 ASSEMBLER_TEST_GENERATE(Vmov, assembler) {
-  __ mov(R3, ShifterOperand(43));
-  __ mov(R1, ShifterOperand(41));
-  __ vmovsrr(S1, R1, R3);  // S1:S2 = 41:43
-  __ vmovs(S0, S2);  // S0 = S2, S0:S1 == 43:41
-  __ vmovd(D2, D0);  // D2 = D0, S4:S5 == 43:41
-  __ vmovrs(R3, S5);  // R3 = S5, R3 == 41
-  __ vmovrrs(R1, R2, S4);  // R1:R2 = S4:S5, R1:R2 == 43:41
-  __ vmovdrr(D3, R3, R2);  // D3 = R3:R2, S6:S7 == 41:41
-  __ vmovsr(S7, R1);  // S7 = R1, S6:S7 == 41:43
-  __ vmovrrd(R0, R1, D3);  // R0:R1 = D3, R0:R1 == 41:43
-  __ sub(R0, R1, ShifterOperand(R0));  // 43-41
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ mov(R3, ShifterOperand(43));
+    __ mov(R1, ShifterOperand(41));
+    __ vmovsrr(S1, R1, R3);  // S1:S2 = 41:43
+    __ vmovs(S0, S2);  // S0 = S2, S0:S1 == 43:41
+    __ vmovd(D2, D0);  // D2 = D0, S4:S5 == 43:41
+    __ vmovrs(R3, S5);  // R3 = S5, R3 == 41
+    __ vmovrrs(R1, R2, S4);  // R1:R2 = S4:S5, R1:R2 == 43:41
+    __ vmovdrr(D3, R3, R2);  // D3 = R3:R2, S6:S7 == 41:41
+    __ vmovsr(S7, R1);  // S7 = R1, S6:S7 == 41:43
+    __ vmovrrd(R0, R1, D3);  // R0:R1 = D3, R0:R1 == 41:43
+    __ sub(R0, R1, ShifterOperand(R0));  // 43-41
+  } else {
+    __ LoadImmediate(R0, 2);
+  }
   __ bx(LR);
 }
 
@@ -121,126 +125,175 @@
 
 
 ASSEMBLER_TEST_GENERATE(SingleVLoadStore, assembler) {
-  __ LoadImmediate(R0, bit_cast<int32_t, float>(12.3f));
-  __ mov(R2, ShifterOperand(SP));
-  __ str(R0, Address(SP, (-kWordSize * 30), Address::PreIndex));
-  __ vldrs(S0, Address(R2, (-kWordSize * 30)));
-  __ vadds(S0, S0, S0);
-  __ vstrs(S0, Address(R2, (-kWordSize * 30)));
-  __ ldr(R0, Address(SP, (kWordSize * 30), Address::PostIndex));
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ LoadImmediate(R0, bit_cast<int32_t, float>(12.3f));
+    __ mov(R2, ShifterOperand(SP));
+    __ str(R0, Address(SP, (-kWordSize * 30), Address::PreIndex));
+    __ vldrs(S0, Address(R2, (-kWordSize * 30)));
+    __ vadds(S0, S0, S0);
+    __ vstrs(S0, Address(R2, (-kWordSize * 30)));
+    __ ldr(R0, Address(SP, (kWordSize * 30), Address::PostIndex));
+  } else {
+    __ LoadImmediate(R0, 0);
+  }
   __ bx(LR);
 }
 
 
 ASSEMBLER_TEST_RUN(SingleVLoadStore, test) {
   EXPECT(test != NULL);
-  typedef float (*SingleVLoadStore)();
-  float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry());
-  EXPECT_FLOAT_EQ(2*12.3f, res, 0.001f);
+  if (TargetCPUFeatures::vfp_supported()) {
+    typedef float (*SingleVLoadStore)();
+    float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry());
+    EXPECT_FLOAT_EQ(2*12.3f, res, 0.001f);
+  } else {
+    typedef int (*SingleVLoadStore)();
+    EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SingleVLoadStore, test->entry()));
+  }
 }
 
 
 ASSEMBLER_TEST_GENERATE(SingleVShiftLoadStore, assembler) {
-  __ LoadImmediate(R0, bit_cast<int32_t, float>(12.3f));
-  __ mov(R2, ShifterOperand(SP));
-  // Expressing __str(R0, Address(SP, (-kWordSize * 32), Address::PreIndex));
-  // as:
-  __ mov(R1, ShifterOperand(kWordSize));
-  __ str(R0, Address(SP, R1, LSL, 5, Address::NegPreIndex));
-  __ vldrs(S0, Address(R2, (-kWordSize * 32)));
-  __ vadds(S0, S0, S0);
-  __ vstrs(S0, Address(R2, (-kWordSize * 32)));
-  // Expressing __ldr(R0, Address(SP, (kWordSize * 32), Address::PostIndex));
-  // as:
-  __ ldr(R0, Address(SP, R1, LSL, 5, Address::PostIndex));
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ LoadImmediate(R0, bit_cast<int32_t, float>(12.3f));
+    __ mov(R2, ShifterOperand(SP));
+    // Expressing __str(R0, Address(SP, (-kWordSize * 32), Address::PreIndex));
+    // as:
+    __ mov(R1, ShifterOperand(kWordSize));
+    __ str(R0, Address(SP, R1, LSL, 5, Address::NegPreIndex));
+    __ vldrs(S0, Address(R2, (-kWordSize * 32)));
+    __ vadds(S0, S0, S0);
+    __ vstrs(S0, Address(R2, (-kWordSize * 32)));
+    // Expressing __ldr(R0, Address(SP, (kWordSize * 32), Address::PostIndex));
+    // as:
+    __ ldr(R0, Address(SP, R1, LSL, 5, Address::PostIndex));
+  } else {
+    __ LoadImmediate(R0, 0);
+  }
   __ bx(LR);
 }
 
 
 ASSEMBLER_TEST_RUN(SingleVShiftLoadStore, test) {
   EXPECT(test != NULL);
-  typedef float (*SingleVLoadStore)();
-  float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry());
-  EXPECT_FLOAT_EQ(2*12.3f, res, 0.001f);
+  if (TargetCPUFeatures::vfp_supported()) {
+    typedef float (*SingleVLoadStore)();
+    float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry());
+    EXPECT_FLOAT_EQ(2*12.3f, res, 0.001f);
+  } else {
+    typedef int (*SingleVLoadStore)();
+    EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SingleVLoadStore, test->entry()));
+  }
 }
 
 
 ASSEMBLER_TEST_GENERATE(DoubleVLoadStore, assembler) {
-  int64_t value = bit_cast<int64_t, double>(12.3);
-  __ LoadImmediate(R0, Utils::Low32Bits(value));
-  __ LoadImmediate(R1, Utils::High32Bits(value));
-  __ mov(R2, ShifterOperand(SP));
-  __ str(R0, Address(SP, (-kWordSize * 30), Address::PreIndex));
-  __ str(R1, Address(R2, (-kWordSize * 29)));
-  __ vldrd(D0, Address(R2, (-kWordSize * 30)));
-  __ vaddd(D0, D0, D0);
-  __ vstrd(D0, Address(R2, (-kWordSize * 30)));
-  __ ldr(R1, Address(R2, (-kWordSize * 29)));
-  __ ldr(R0, Address(SP, (kWordSize * 30), Address::PostIndex));
+  if (TargetCPUFeatures::vfp_supported()) {
+    int64_t value = bit_cast<int64_t, double>(12.3);
+    __ LoadImmediate(R0, Utils::Low32Bits(value));
+    __ LoadImmediate(R1, Utils::High32Bits(value));
+    __ mov(R2, ShifterOperand(SP));
+    __ str(R0, Address(SP, (-kWordSize * 30), Address::PreIndex));
+    __ str(R1, Address(R2, (-kWordSize * 29)));
+    __ vldrd(D0, Address(R2, (-kWordSize * 30)));
+    __ vaddd(D0, D0, D0);
+    __ vstrd(D0, Address(R2, (-kWordSize * 30)));
+    __ ldr(R1, Address(R2, (-kWordSize * 29)));
+    __ ldr(R0, Address(SP, (kWordSize * 30), Address::PostIndex));
+  } else {
+    __ LoadImmediate(R0, 0);
+  }
   __ bx(LR);
 }
 
 
 ASSEMBLER_TEST_RUN(DoubleVLoadStore, test) {
   EXPECT(test != NULL);
-  typedef double (*DoubleVLoadStore)();
-  double res = EXECUTE_TEST_CODE_DOUBLE(DoubleVLoadStore, test->entry());
-  EXPECT_FLOAT_EQ(2*12.3, res, 0.001);
+  if (TargetCPUFeatures::vfp_supported()) {
+    typedef double (*DoubleVLoadStore)();
+    float res = EXECUTE_TEST_CODE_DOUBLE(DoubleVLoadStore, test->entry());
+    EXPECT_FLOAT_EQ(2*12.3f, res, 0.001f);
+  } else {
+    typedef int (*DoubleVLoadStore)();
+    EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(DoubleVLoadStore, test->entry()));
+  }
 }
 
 
 ASSEMBLER_TEST_GENERATE(SingleFPOperations, assembler) {
-  __ LoadSImmediate(S0, 12.3f);
-  __ LoadSImmediate(S1, 3.4f);
-  __ vnegs(S0, S0);  // -12.3f
-  __ vabss(S0, S0);  // 12.3f
-  __ vadds(S0, S0, S1);  // 15.7f
-  __ vmuls(S0, S0, S1);  // 53.38f
-  __ vsubs(S0, S0, S1);  // 49.98f
-  __ vdivs(S0, S0, S1);  // 14.7f
-  __ vsqrts(S0, S0);  // 3.8340579f
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ LoadSImmediate(S0, 12.3f);
+    __ LoadSImmediate(S1, 3.4f);
+    __ vnegs(S0, S0);  // -12.3f
+    __ vabss(S0, S0);  // 12.3f
+    __ vadds(S0, S0, S1);  // 15.7f
+    __ vmuls(S0, S0, S1);  // 53.38f
+    __ vsubs(S0, S0, S1);  // 49.98f
+    __ vdivs(S0, S0, S1);  // 14.7f
+    __ vsqrts(S0, S0);  // 3.8340579f
+  } else {
+    __ LoadImmediate(R0, 0);
+  }
   __ bx(LR);
 }
 
 
 ASSEMBLER_TEST_RUN(SingleFPOperations, test) {
   EXPECT(test != NULL);
-  typedef float (*SingleFPOperations)();
-  float res = EXECUTE_TEST_CODE_FLOAT(SingleFPOperations, test->entry());
-  EXPECT_FLOAT_EQ(3.8340579f, res, 0.001f);
+  if (TargetCPUFeatures::vfp_supported()) {
+    typedef float (*SingleFPOperations)();
+    float res = EXECUTE_TEST_CODE_FLOAT(SingleFPOperations, test->entry());
+    EXPECT_FLOAT_EQ(3.8340579f, res, 0.001f);
+  } else {
+    typedef int (*SingleFPOperations)();
+    EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SingleFPOperations, test->entry()));
+  }
 }
 
 
 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) {
-  __ LoadDImmediate(D0, 12.3, R0);
-  __ LoadDImmediate(D1, 3.4, R0);
-  __ vnegd(D0, D0);  // -12.3
-  __ vabsd(D0, D0);  // 12.3
-  __ vaddd(D0, D0, D1);  // 15.7
-  __ vmuld(D0, D0, D1);  // 53.38
-  __ vsubd(D0, D0, D1);  // 49.98
-  __ vdivd(D0, D0, D1);  // 14.7
-  __ vsqrtd(D0, D0);  // 3.8340579
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ LoadDImmediate(D0, 12.3, R0);
+    __ LoadDImmediate(D1, 3.4, R0);
+    __ vnegd(D0, D0);  // -12.3
+    __ vabsd(D0, D0);  // 12.3
+    __ vaddd(D0, D0, D1);  // 15.7
+    __ vmuld(D0, D0, D1);  // 53.38
+    __ vsubd(D0, D0, D1);  // 49.98
+    __ vdivd(D0, D0, D1);  // 14.7
+    __ vsqrtd(D0, D0);  // 3.8340579
+  } else {
+    __ LoadImmediate(R0, 0);
+  }
   __ bx(LR);
 }
 
 
 ASSEMBLER_TEST_RUN(DoubleFPOperations, test) {
   EXPECT(test != NULL);
-  typedef double (*DoubleFPOperations)();
-  double res = EXECUTE_TEST_CODE_DOUBLE(DoubleFPOperations, test->entry());
-  EXPECT_FLOAT_EQ(3.8340579, res, 0.001);
+  if (TargetCPUFeatures::vfp_supported()) {
+    typedef double (*DoubleFPOperations)();
+    double res = EXECUTE_TEST_CODE_DOUBLE(DoubleFPOperations, test->entry());
+    EXPECT_FLOAT_EQ(3.8340579, res, 0.001);
+  } else {
+    typedef int (*DoubleFPOperations)();
+    EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(DoubleFPOperations, test->entry()));
+  }
 }
 
 
 ASSEMBLER_TEST_GENERATE(DoubleSqrtNeg, assembler) {
-  // Check that sqrt of a negative double gives NaN.
-  __ LoadDImmediate(D1, -1.0, R0);
-  __ vsqrtd(D0, D1);
-  __ vcmpd(D0, D0);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(1), VS);
-  __ mov(R0, ShifterOperand(0), VC);
+  if (TargetCPUFeatures::vfp_supported()) {
+    // Check that sqrt of a negative double gives NaN.
+    __ LoadDImmediate(D1, -1.0, R0);
+    __ vsqrtd(D0, D1);
+    __ vcmpd(D0, D0);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(1), VS);
+    __ mov(R0, ShifterOperand(0), VC);
+  } else {
+    __ LoadImmediate(R0, 1);
+  }
   __ Ret();
 }
 
@@ -253,102 +306,151 @@
 
 
 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion, assembler) {
-  __ mov(R3, ShifterOperand(6));
-  __ vmovsr(S3, R3);
-  __ vcvtdi(D0, S3);
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ mov(R3, ShifterOperand(6));
+    __ vmovsr(S3, R3);
+    __ vcvtdi(D0, S3);
+  } else {
+    __ LoadImmediate(R0, 0);
+  }
   __ bx(LR);
 }
 
 
 ASSEMBLER_TEST_RUN(IntToDoubleConversion, test) {
-  typedef double (*IntToDoubleConversionCode)();
   EXPECT(test != NULL);
-  double res = EXECUTE_TEST_CODE_DOUBLE(IntToDoubleConversionCode,
-                                        test->entry());
-  EXPECT_FLOAT_EQ(6.0, res, 0.001);
+  if (TargetCPUFeatures::vfp_supported()) {
+    typedef double (*IntToDoubleConversionCode)();
+    double res = EXECUTE_TEST_CODE_DOUBLE(IntToDoubleConversionCode,
+                                          test->entry());
+    EXPECT_FLOAT_EQ(6.0, res, 0.001);
+  } else {
+    typedef int (*IntToDoubleConversionCode)();
+    EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(IntToDoubleConversionCode,
+                                         test->entry()));
+  }
 }
 
 
 ASSEMBLER_TEST_GENERATE(LongToDoubleConversion, assembler) {
-  int64_t value = 60000000000LL;
-  __ LoadImmediate(R0, Utils::Low32Bits(value));
-  __ LoadImmediate(R1, Utils::High32Bits(value));
-  __ vmovsr(S0, R0);
-  __ vmovsr(S2, R1);
-  __ vcvtdu(D0, S0);
-  __ vcvtdi(D1, S2);
-  __ LoadDImmediate(D2, 1.0 * (1LL << 32), R0);
-  __ vmlad(D0, D1, D2);
+  if (TargetCPUFeatures::vfp_supported()) {
+    int64_t value = 60000000000LL;
+    __ LoadImmediate(R0, Utils::Low32Bits(value));
+    __ LoadImmediate(R1, Utils::High32Bits(value));
+    __ vmovsr(S0, R0);
+    __ vmovsr(S2, R1);
+    __ vcvtdu(D0, S0);
+    __ vcvtdi(D1, S2);
+    __ LoadDImmediate(D2, 1.0 * (1LL << 32), R0);
+    __ vmlad(D0, D1, D2);
+  } else {
+    __ LoadImmediate(R0, 0);
+  }
   __ bx(LR);
 }
 
 
 ASSEMBLER_TEST_RUN(LongToDoubleConversion, test) {
-  typedef double (*LongToDoubleConversionCode)();
   EXPECT(test != NULL);
-  double res = EXECUTE_TEST_CODE_DOUBLE(LongToDoubleConversionCode,
-                                        test->entry());
-  EXPECT_FLOAT_EQ(60000000000.0, res, 0.001);
+  if (TargetCPUFeatures::vfp_supported()) {
+    typedef double (*LongToDoubleConversionCode)();
+    double res = EXECUTE_TEST_CODE_DOUBLE(LongToDoubleConversionCode,
+                                          test->entry());
+    EXPECT_FLOAT_EQ(60000000000.0, res, 0.001);
+  } else {
+    typedef int (*LongToDoubleConversionCode)();
+    EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(LongToDoubleConversionCode,
+                                         test->entry()));
+  }
 }
 
 
 ASSEMBLER_TEST_GENERATE(IntToFloatConversion, assembler) {
-  __ mov(R3, ShifterOperand(6));
-  __ vmovsr(S3, R3);
-  __ vcvtsi(S0, S3);
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ mov(R3, ShifterOperand(6));
+    __ vmovsr(S3, R3);
+    __ vcvtsi(S0, S3);
+  } else {
+    __ LoadImmediate(R0, 0);
+  }
   __ bx(LR);
 }
 
 
 ASSEMBLER_TEST_RUN(IntToFloatConversion, test) {
-  typedef float (*IntToFloatConversionCode)();
   EXPECT(test != NULL);
-  float res = EXECUTE_TEST_CODE_FLOAT(IntToFloatConversionCode, test->entry());
-  EXPECT_FLOAT_EQ(6.0, res, 0.001);
+  if (TargetCPUFeatures::vfp_supported()) {
+    typedef float (*IntToFloatConversionCode)();
+    float res = EXECUTE_TEST_CODE_FLOAT(IntToFloatConversionCode,
+                                        test->entry());
+    EXPECT_FLOAT_EQ(6.0, res, 0.001);
+  } else {
+    typedef int (*IntToFloatConversionCode)();
+    EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(IntToFloatConversionCode,
+                                         test->entry()));
+  }
 }
 
 
 ASSEMBLER_TEST_GENERATE(FloatToIntConversion, assembler) {
-  __ vcvtis(S1, S0);
-  __ vmovrs(R0, S1);
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ vcvtis(S1, S0);
+    __ vmovrs(R0, S1);
+  } else {
+    __ LoadImmediate(R0, 0);
+  }
   __ bx(LR);
 }
 
 
 ASSEMBLER_TEST_RUN(FloatToIntConversion, test) {
-  typedef int (*FloatToIntConversion)(float arg);
   EXPECT(test != NULL);
-  EXPECT_EQ(12,
-            EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(),
-                                      12.8f));
-  EXPECT_EQ(INT_MIN,
-            EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(),
-                                      -FLT_MAX));
-  EXPECT_EQ(INT_MAX,
-            EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(),
-                                      FLT_MAX));
+  if (TargetCPUFeatures::vfp_supported()) {
+    typedef int (*FloatToIntConversion)(float arg);
+    EXPECT_EQ(12,
+              EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(),
+                                        12.8f));
+    EXPECT_EQ(INT_MIN,
+              EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(),
+                                        -FLT_MAX));
+    EXPECT_EQ(INT_MAX,
+              EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(),
+                                        FLT_MAX));
+  } else {
+    typedef int (*FloatToIntConversion)();
+    EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(FloatToIntConversion, test->entry()));
+  }
 }
 
 
 ASSEMBLER_TEST_GENERATE(DoubleToIntConversion, assembler) {
-  __ vcvtid(S0, D0);
-  __ vmovrs(R0, S0);
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ vcvtid(S0, D0);
+    __ vmovrs(R0, S0);
+  } else {
+    __ LoadImmediate(R0, 0);
+  }
   __ bx(LR);
 }
 
 
 ASSEMBLER_TEST_RUN(DoubleToIntConversion, test) {
-  typedef int (*DoubleToIntConversion)(double arg);
-  EXPECT(test != NULL);
-  EXPECT_EQ(12,
-            EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(),
-                                      12.8));
-  EXPECT_EQ(INT_MIN,
-            EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(),
-                                      -DBL_MAX));
-  EXPECT_EQ(INT_MAX,
-            EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(),
-                                      DBL_MAX));
+  if (TargetCPUFeatures::vfp_supported()) {
+    typedef int (*DoubleToIntConversion)(double arg);
+    EXPECT(test != NULL);
+    EXPECT_EQ(12,
+              EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(),
+                                        12.8));
+    EXPECT_EQ(INT_MIN,
+              EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(),
+                                        -DBL_MAX));
+    EXPECT_EQ(INT_MAX,
+              EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(),
+                                        DBL_MAX));
+  } else {
+    typedef int (*DoubleToIntConversion)();
+    EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(DoubleToIntConversion, test->entry()));
+  }
 }
 
 
@@ -369,43 +471,57 @@
 
 
 ASSEMBLER_TEST_GENERATE(DoubleToFloatConversion, assembler) {
-  __ LoadDImmediate(D1, 12.8, R0);
-  __ vcvtsd(S0, D1);
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ LoadDImmediate(D1, 12.8, R0);
+    __ vcvtsd(S0, D1);
+  } else {
+    __ LoadImmediate(R0, 0);
+  }
   __ bx(LR);
 }
 
 
 ASSEMBLER_TEST_RUN(DoubleToFloatConversion, test) {
-  typedef float (*DoubleToFloatConversionCode)();
   EXPECT(test != NULL);
-  float res = EXECUTE_TEST_CODE_FLOAT(DoubleToFloatConversionCode,
-                                      test->entry());
-  EXPECT_FLOAT_EQ(12.8, res, 0.001);
+  if (TargetCPUFeatures::vfp_supported()) {
+    typedef float (*DoubleToFloatConversionCode)();
+    float res = EXECUTE_TEST_CODE_FLOAT(DoubleToFloatConversionCode,
+                                        test->entry());
+    EXPECT_FLOAT_EQ(12.8, res, 0.001);
+  } else {
+    typedef int (*DoubleToFloatConversionCode)();
+    EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(DoubleToFloatConversionCode,
+                                         test->entry()));
+  }
 }
 
 
 ASSEMBLER_TEST_GENERATE(FloatCompare, assembler) {
-  // Test 12.3f vs 12.5f.
-  __ LoadSImmediate(S0, 12.3f);
-  __ LoadSImmediate(S1, 12.5f);
+  if (TargetCPUFeatures::vfp_supported()) {
+    // Test 12.3f vs 12.5f.
+    __ LoadSImmediate(S0, 12.3f);
+    __ LoadSImmediate(S1, 12.5f);
 
-  // Count errors in R0. R0 is zero if no errors found.
-  __ mov(R0, ShifterOperand(0));
-  __ vcmps(S0, S1);
-  __ vmstat();
-  __ add(R0, R0, ShifterOperand(1), VS);  // Error if unordered (Nan).
-  __ add(R0, R0, ShifterOperand(2), GT);  // Error if greater.
-  __ add(R0, R0, ShifterOperand(4), EQ);  // Error if equal.
-  __ add(R0, R0, ShifterOperand(8), PL);  // Error if not less.
+    // Count errors in R0. R0 is zero if no errors found.
+    __ mov(R0, ShifterOperand(0));
+    __ vcmps(S0, S1);
+    __ vmstat();
+    __ add(R0, R0, ShifterOperand(1), VS);  // Error if unordered (Nan).
+    __ add(R0, R0, ShifterOperand(2), GT);  // Error if greater.
+    __ add(R0, R0, ShifterOperand(4), EQ);  // Error if equal.
+    __ add(R0, R0, ShifterOperand(8), PL);  // Error if not less.
 
-  // Test NaN.
-  // Create NaN by dividing 0.0f/0.0f.
-  __ LoadSImmediate(S1, 0.0f);
-  __ vdivs(S1, S1, S1);
-  __ vcmps(S1, S1);
-  __ vmstat();
-  __ add(R0, R0, ShifterOperand(16), VC);  // Error if not unordered (not Nan).
-
+    // Test NaN.
+    // Create NaN by dividing 0.0f/0.0f.
+    __ LoadSImmediate(S1, 0.0f);
+    __ vdivs(S1, S1, S1);
+    __ vcmps(S1, S1);
+    __ vmstat();
+    // Error if not unordered (not Nan).
+    __ add(R0, R0, ShifterOperand(16), VC);
+  } else {
+    __ LoadImmediate(R0, 0);
+  }
   // R0 is 0 if all tests passed.
   __ bx(LR);
 }
@@ -419,27 +535,31 @@
 
 
 ASSEMBLER_TEST_GENERATE(DoubleCompare, assembler) {
-  // Test 12.3 vs 12.5.
-  __ LoadDImmediate(D0, 12.3, R1);
-  __ LoadDImmediate(D1, 12.5, R1);
+  if (TargetCPUFeatures::vfp_supported()) {
+    // Test 12.3 vs 12.5.
+    __ LoadDImmediate(D0, 12.3, R1);
+    __ LoadDImmediate(D1, 12.5, R1);
 
-  // Count errors in R0. R0 is zero if no errors found.
-  __ mov(R0, ShifterOperand(0));
-  __ vcmpd(D0, D1);
-  __ vmstat();
-  __ add(R0, R0, ShifterOperand(1), VS);  // Error if unordered (Nan).
-  __ add(R0, R0, ShifterOperand(2), GT);  // Error if greater.
-  __ add(R0, R0, ShifterOperand(4), EQ);  // Error if equal.
-  __ add(R0, R0, ShifterOperand(8), PL);  // Error if not less.
+    // Count errors in R0. R0 is zero if no errors found.
+    __ mov(R0, ShifterOperand(0));
+    __ vcmpd(D0, D1);
+    __ vmstat();
+    __ add(R0, R0, ShifterOperand(1), VS);  // Error if unordered (Nan).
+    __ add(R0, R0, ShifterOperand(2), GT);  // Error if greater.
+    __ add(R0, R0, ShifterOperand(4), EQ);  // Error if equal.
+    __ add(R0, R0, ShifterOperand(8), PL);  // Error if not less.
 
-  // Test NaN.
-  // Create NaN by dividing 0.0/0.0.
-  __ LoadDImmediate(D1, 0.0, R1);
-  __ vdivd(D1, D1, D1);
-  __ vcmpd(D1, D1);
-  __ vmstat();
-  __ add(R0, R0, ShifterOperand(16), VC);  // Error if not unordered (not Nan).
-
+    // Test NaN.
+    // Create NaN by dividing 0.0/0.0.
+    __ LoadDImmediate(D1, 0.0, R1);
+    __ vdivd(D1, D1, D1);
+    __ vcmpd(D1, D1);
+    __ vmstat();
+    // Error if not unordered (not Nan).
+    __ add(R0, R0, ShifterOperand(16), VC);
+  } else {
+    __ LoadImmediate(R0, 0);
+  }
   // R0 is 0 if all tests passed.
   __ bx(LR);
 }
@@ -563,48 +683,6 @@
 }
 
 
-ASSEMBLER_TEST_GENERATE(Semaphore, assembler) {
-  __ mov(R0, ShifterOperand(40));
-  __ mov(R1, ShifterOperand(42));
-  __ Push(R0);
-  Label retry;
-  __ Bind(&retry);
-  __ ldrex(R0, SP);
-  __ strex(IP, R1, SP);  // IP == 0, success
-  __ tst(IP, ShifterOperand(0));
-  __ b(&retry, NE);  // NE if context switch occurred between ldrex and strex.
-  __ Pop(R0);  // 42
-  __ bx(LR);
-}
-
-
-ASSEMBLER_TEST_RUN(Semaphore, test) {
-  EXPECT(test != NULL);
-  typedef int (*Semaphore)();
-  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Semaphore, test->entry()));
-}
-
-
-ASSEMBLER_TEST_GENERATE(FailedSemaphore, assembler) {
-  __ mov(R0, ShifterOperand(40));
-  __ mov(R1, ShifterOperand(42));
-  __ Push(R0);
-  __ ldrex(R0, SP);
-  __ clrex();  // Simulate a context switch.
-  __ strex(IP, R1, SP);  // IP == 1, failure
-  __ Pop(R0);  // 40
-  __ add(R0, R0, ShifterOperand(IP));
-  __ bx(LR);
-}
-
-
-ASSEMBLER_TEST_RUN(FailedSemaphore, test) {
-  EXPECT(test != NULL);
-  typedef int (*FailedSemaphore)();
-  EXPECT_EQ(41, EXECUTE_TEST_CODE_INT32(FailedSemaphore, test->entry()));
-}
-
-
 ASSEMBLER_TEST_GENERATE(AndOrr, assembler) {
   __ mov(R1, ShifterOperand(40));
   __ mov(R2, ShifterOperand(0));
@@ -658,24 +736,33 @@
 
 
 ASSEMBLER_TEST_GENERATE(QuotientRemainder, assembler) {
-  __ vmovsr(S2, R0);
-  __ vmovsr(S4, R2);
-  __ vcvtdi(D1, S2);
-  __ vcvtdi(D2, S4);
-  __ vdivd(D0, D1, D2);
-  __ vcvtid(S0, D0);
-  __ vmovrs(R1, S0);  // r1 = r0/r2
-  __ mls(R0, R1, R2, R0);  // r0 = r0 - r1*r2
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ vmovsr(S2, R0);
+    __ vmovsr(S4, R2);
+    __ vcvtdi(D1, S2);
+    __ vcvtdi(D2, S4);
+    __ vdivd(D0, D1, D2);
+    __ vcvtid(S0, D0);
+    __ vmovrs(R1, S0);  // r1 = r0/r2
+    __ mls(R0, R1, R2, R0);  // r0 = r0 - r1*r2
+  } else {
+    __ LoadImmediate(R0, 0);
+  }
   __ bx(LR);
 }
 
 
 ASSEMBLER_TEST_RUN(QuotientRemainder, test) {
   EXPECT(test != NULL);
-  typedef int64_t (*QuotientRemainder)(int64_t dividend, int64_t divisor);
-  EXPECT_EQ(0x1000400000da8LL,
-            EXECUTE_TEST_CODE_INT64_LL(QuotientRemainder, test->entry(),
-                                       0x12345678, 0x1234));
+  if (TargetCPUFeatures::vfp_supported()) {
+    typedef int64_t (*QuotientRemainder)(int64_t dividend, int64_t divisor);
+    EXPECT_EQ(0x1000400000da8LL,
+              EXECUTE_TEST_CODE_INT64_LL(QuotientRemainder, test->entry(),
+                                         0x12345678, 0x1234));
+  } else {
+    typedef int (*QuotientRemainder)();
+    EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(QuotientRemainder, test->entry()));
+  }
 }
 
 
@@ -1175,47 +1262,50 @@
 
 // Make sure we can store and reload the D registers using vstmd and vldmd
 ASSEMBLER_TEST_GENERATE(VstmdVldmd, assembler) {
-  __ LoadDImmediate(D0, 0.0, R0);
-  __ LoadDImmediate(D1, 1.0, R0);
-  __ LoadDImmediate(D2, 2.0, R0);
-  __ LoadDImmediate(D3, 3.0, R0);
-  __ LoadDImmediate(D4, 4.0, R0);
-  __ vstmd(DB_W, SP, D0, 5);  // Push D0 - D4 onto the stack, dec SP
-  __ LoadDImmediate(D0, 0.0, R0);
-  __ LoadDImmediate(D1, 0.0, R0);
-  __ LoadDImmediate(D2, 0.0, R0);
-  __ LoadDImmediate(D3, 0.0, R0);
-  __ LoadDImmediate(D4, 0.0, R0);
-  __ vldmd(IA_W, SP, D0, 5);  // Pop stack into D0 - D4, inc SP
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ LoadDImmediate(D0, 0.0, R0);
+    __ LoadDImmediate(D1, 1.0, R0);
+    __ LoadDImmediate(D2, 2.0, R0);
+    __ LoadDImmediate(D3, 3.0, R0);
+    __ LoadDImmediate(D4, 4.0, R0);
+    __ vstmd(DB_W, SP, D0, 5);  // Push D0 - D4 onto the stack, dec SP
+    __ LoadDImmediate(D0, 0.0, R0);
+    __ LoadDImmediate(D1, 0.0, R0);
+    __ LoadDImmediate(D2, 0.0, R0);
+    __ LoadDImmediate(D3, 0.0, R0);
+    __ LoadDImmediate(D4, 0.0, R0);
+    __ vldmd(IA_W, SP, D0, 5);  // Pop stack into D0 - D4, inc SP
 
-  // Load success value into R0
-  __ mov(R0, ShifterOperand(42));
+    // Load success value into R0
+    __ mov(R0, ShifterOperand(42));
 
-  // Check that 4.0 is back in D4
-  __ LoadDImmediate(D5, 4.0, R1);
-  __ vcmpd(D4, D5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    // Check that 4.0 is back in D4
+    __ LoadDImmediate(D5, 4.0, R1);
+    __ vcmpd(D4, D5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
 
-  // Check that 3.0 is back in D3
-  __ LoadDImmediate(D5, 3.0, R1);
-  __ vcmpd(D3, D5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    // Check that 3.0 is back in D3
+    __ LoadDImmediate(D5, 3.0, R1);
+    __ vcmpd(D3, D5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
 
 
-  // Check that 2.0 is back in D2
-  __ LoadDImmediate(D5, 2.0, R1);
-  __ vcmpd(D2, D5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    // Check that 2.0 is back in D2
+    __ LoadDImmediate(D5, 2.0, R1);
+    __ vcmpd(D2, D5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
 
-  // Check that 1.0 is back in D1
-  __ LoadDImmediate(D5, 1.0, R1);
-  __ vcmpd(D1, D5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
-
+    // Check that 1.0 is back in D1
+    __ LoadDImmediate(D5, 1.0, R1);
+    __ vcmpd(D1, D5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+  } else {
+    __ LoadImmediate(R0, 42);
+  }
   __ bx(LR);
 }
 
@@ -1229,46 +1319,49 @@
 
 // Make sure we can store and reload the S registers using vstms and vldms
 ASSEMBLER_TEST_GENERATE(VstmsVldms, assembler) {
-  __ LoadSImmediate(S0, 0.0);
-  __ LoadSImmediate(S1, 1.0);
-  __ LoadSImmediate(S2, 2.0);
-  __ LoadSImmediate(S3, 3.0);
-  __ LoadSImmediate(S4, 4.0);
-  __ vstms(DB_W, SP, S0, S4);  // Push S0 - S4 onto the stack, dec SP
-  __ LoadSImmediate(S0, 0.0);
-  __ LoadSImmediate(S1, 0.0);
-  __ LoadSImmediate(S2, 0.0);
-  __ LoadSImmediate(S3, 0.0);
-  __ LoadSImmediate(S4, 0.0);
-  __ vldms(IA_W, SP, S0, S4);  // Pop stack into S0 - S4, inc SP
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ LoadSImmediate(S0, 0.0);
+    __ LoadSImmediate(S1, 1.0);
+    __ LoadSImmediate(S2, 2.0);
+    __ LoadSImmediate(S3, 3.0);
+    __ LoadSImmediate(S4, 4.0);
+    __ vstms(DB_W, SP, S0, S4);  // Push S0 - S4 onto the stack, dec SP
+    __ LoadSImmediate(S0, 0.0);
+    __ LoadSImmediate(S1, 0.0);
+    __ LoadSImmediate(S2, 0.0);
+    __ LoadSImmediate(S3, 0.0);
+    __ LoadSImmediate(S4, 0.0);
+    __ vldms(IA_W, SP, S0, S4);  // Pop stack into S0 - S4, inc SP
 
-  // Load success value into R0
-  __ mov(R0, ShifterOperand(42));
+    // Load success value into R0
+    __ mov(R0, ShifterOperand(42));
 
-  // Check that 4.0 is back in S4
-  __ LoadSImmediate(S5, 4.0);
-  __ vcmps(S4, S5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    // Check that 4.0 is back in S4
+    __ LoadSImmediate(S5, 4.0);
+    __ vcmps(S4, S5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
 
-  // Check that 3.0 is back in S3
-  __ LoadSImmediate(S5, 3.0);
-  __ vcmps(S3, S5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    // Check that 3.0 is back in S3
+    __ LoadSImmediate(S5, 3.0);
+    __ vcmps(S3, S5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
 
-  // Check that 2.0 is back in S2
-  __ LoadSImmediate(S5, 2.0);
-  __ vcmps(S2, S5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    // Check that 2.0 is back in S2
+    __ LoadSImmediate(S5, 2.0);
+    __ vcmps(S2, S5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
 
-  // Check that 1.0 is back in S1
-  __ LoadSImmediate(S5, 1.0);
-  __ vcmps(S1, S5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
-
+    // Check that 1.0 is back in S1
+    __ LoadSImmediate(S5, 1.0);
+    __ vcmps(S1, S5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+  } else {
+    __ LoadImmediate(R0, 42);
+  }
   __ bx(LR);
 }
 
@@ -1282,45 +1375,48 @@
 
 // Make sure we can start somewhere other than D0
 ASSEMBLER_TEST_GENERATE(VstmdVldmd1, assembler) {
-  __ LoadDImmediate(D1, 1.0, R0);
-  __ LoadDImmediate(D2, 2.0, R0);
-  __ LoadDImmediate(D3, 3.0, R0);
-  __ LoadDImmediate(D4, 4.0, R0);
-  __ vstmd(DB_W, SP, D1, 4);  // Push D1 - D4 onto the stack, dec SP
-  __ LoadDImmediate(D1, 0.0, R0);
-  __ LoadDImmediate(D2, 0.0, R0);
-  __ LoadDImmediate(D3, 0.0, R0);
-  __ LoadDImmediate(D4, 0.0, R0);
-  __ vldmd(IA_W, SP, D1, 4);  // Pop stack into D1 - D4, inc SP
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ LoadDImmediate(D1, 1.0, R0);
+    __ LoadDImmediate(D2, 2.0, R0);
+    __ LoadDImmediate(D3, 3.0, R0);
+    __ LoadDImmediate(D4, 4.0, R0);
+    __ vstmd(DB_W, SP, D1, 4);  // Push D1 - D4 onto the stack, dec SP
+    __ LoadDImmediate(D1, 0.0, R0);
+    __ LoadDImmediate(D2, 0.0, R0);
+    __ LoadDImmediate(D3, 0.0, R0);
+    __ LoadDImmediate(D4, 0.0, R0);
+    __ vldmd(IA_W, SP, D1, 4);  // Pop stack into D1 - D4, inc SP
 
-  // Load success value into R0
-  __ mov(R0, ShifterOperand(42));
+    // Load success value into R0
+    __ mov(R0, ShifterOperand(42));
 
-  // Check that 4.0 is back in D4
-  __ LoadDImmediate(D5, 4.0, R1);
-  __ vcmpd(D4, D5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    // Check that 4.0 is back in D4
+    __ LoadDImmediate(D5, 4.0, R1);
+    __ vcmpd(D4, D5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
 
-  // Check that 3.0 is back in D3
-  __ LoadDImmediate(D5, 3.0, R1);
-  __ vcmpd(D3, D5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    // Check that 3.0 is back in D3
+    __ LoadDImmediate(D5, 3.0, R1);
+    __ vcmpd(D3, D5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
 
 
-  // Check that 2.0 is back in D2
-  __ LoadDImmediate(D5, 2.0, R1);
-  __ vcmpd(D2, D5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    // Check that 2.0 is back in D2
+    __ LoadDImmediate(D5, 2.0, R1);
+    __ vcmpd(D2, D5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
 
-  // Check that 1.0 is back in D1
-  __ LoadDImmediate(D5, 1.0, R1);
-  __ vcmpd(D1, D5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
-
+    // Check that 1.0 is back in D1
+    __ LoadDImmediate(D5, 1.0, R1);
+    __ vcmpd(D1, D5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+  } else {
+    __ LoadImmediate(R0, 42);
+  }
   __ bx(LR);
 }
 
@@ -1334,44 +1430,47 @@
 
 // Make sure we can start somewhere other than S0
 ASSEMBLER_TEST_GENERATE(VstmsVldms1, assembler) {
-  __ LoadSImmediate(S1, 1.0);
-  __ LoadSImmediate(S2, 2.0);
-  __ LoadSImmediate(S3, 3.0);
-  __ LoadSImmediate(S4, 4.0);
-  __ vstms(DB_W, SP, S1, S4);  // Push S0 - S4 onto the stack, dec SP
-  __ LoadSImmediate(S1, 0.0);
-  __ LoadSImmediate(S2, 0.0);
-  __ LoadSImmediate(S3, 0.0);
-  __ LoadSImmediate(S4, 0.0);
-  __ vldms(IA_W, SP, S1, S4);  // Pop stack into S0 - S4, inc SP
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ LoadSImmediate(S1, 1.0);
+    __ LoadSImmediate(S2, 2.0);
+    __ LoadSImmediate(S3, 3.0);
+    __ LoadSImmediate(S4, 4.0);
+    __ vstms(DB_W, SP, S1, S4);  // Push S0 - S4 onto the stack, dec SP
+    __ LoadSImmediate(S1, 0.0);
+    __ LoadSImmediate(S2, 0.0);
+    __ LoadSImmediate(S3, 0.0);
+    __ LoadSImmediate(S4, 0.0);
+    __ vldms(IA_W, SP, S1, S4);  // Pop stack into S0 - S4, inc SP
 
-  // Load success value into R0
-  __ mov(R0, ShifterOperand(42));
+    // Load success value into R0
+    __ mov(R0, ShifterOperand(42));
 
-  // Check that 4.0 is back in S4
-  __ LoadSImmediate(S5, 4.0);
-  __ vcmps(S4, S5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    // Check that 4.0 is back in S4
+    __ LoadSImmediate(S5, 4.0);
+    __ vcmps(S4, S5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
 
-  // Check that 3.0 is back in S3
-  __ LoadSImmediate(S5, 3.0);
-  __ vcmps(S3, S5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    // Check that 3.0 is back in S3
+    __ LoadSImmediate(S5, 3.0);
+    __ vcmps(S3, S5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
 
-  // Check that 2.0 is back in S2
-  __ LoadSImmediate(S5, 2.0);
-  __ vcmps(S2, S5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    // Check that 2.0 is back in S2
+    __ LoadSImmediate(S5, 2.0);
+    __ vcmps(S2, S5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
 
-  // Check that 1.0 is back in S1
-  __ LoadSImmediate(S5, 1.0);
-  __ vcmps(S1, S5);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
-
+    // Check that 1.0 is back in S1
+    __ LoadSImmediate(S5, 1.0);
+    __ vcmps(S1, S5);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+  } else {
+    __ LoadImmediate(R0, 42);
+  }
   __ bx(LR);
 }
 
@@ -1386,53 +1485,57 @@
 // Make sure we can store the D registers using vstmd and
 // load them into a different set using vldmd
 ASSEMBLER_TEST_GENERATE(VstmdVldmd_off, assembler) {
-  // Save used callee-saved FPU registers.
-  __ vstmd(DB_W, SP, D8, 3);
-  __ LoadDImmediate(D0, 0.0, R0);
-  __ LoadDImmediate(D1, 1.0, R0);
-  __ LoadDImmediate(D2, 2.0, R0);
-  __ LoadDImmediate(D3, 3.0, R0);
-  __ LoadDImmediate(D4, 4.0, R0);
-  __ LoadDImmediate(D5, 5.0, R0);
-  __ vstmd(DB_W, SP, D0, 5);  // Push D0 - D4 onto the stack, dec SP
-  __ vldmd(IA_W, SP, D5, 5);  // Pop stack into D5 - D9, inc SP
+  if (TargetCPUFeatures::vfp_supported()) {
+    // Save used callee-saved FPU registers.
+    __ vstmd(DB_W, SP, D8, 3);
+    __ LoadDImmediate(D0, 0.0, R0);
+    __ LoadDImmediate(D1, 1.0, R0);
+    __ LoadDImmediate(D2, 2.0, R0);
+    __ LoadDImmediate(D3, 3.0, R0);
+    __ LoadDImmediate(D4, 4.0, R0);
+    __ LoadDImmediate(D5, 5.0, R0);
+    __ vstmd(DB_W, SP, D0, 5);  // Push D0 - D4 onto the stack, dec SP
+    __ vldmd(IA_W, SP, D5, 5);  // Pop stack into D5 - D9, inc SP
 
-  // Load success value into R0
-  __ mov(R0, ShifterOperand(42));
+    // Load success value into R0
+    __ mov(R0, ShifterOperand(42));
 
-  // Check that 4.0 is in D9
-  __ LoadDImmediate(D10, 4.0, R1);
-  __ vcmpd(D9, D10);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    // Check that 4.0 is in D9
+    __ LoadDImmediate(D10, 4.0, R1);
+    __ vcmpd(D9, D10);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
 
-  // Check that 3.0 is in D8
-  __ LoadDImmediate(D10, 3.0, R1);
-  __ vcmpd(D8, D10);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    // Check that 3.0 is in D8
+    __ LoadDImmediate(D10, 3.0, R1);
+    __ vcmpd(D8, D10);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
 
 
-  // Check that 2.0 is in D7
-  __ LoadDImmediate(D10, 2.0, R1);
-  __ vcmpd(D7, D10);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    // Check that 2.0 is in D7
+    __ LoadDImmediate(D10, 2.0, R1);
+    __ vcmpd(D7, D10);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
 
-  // Check that 1.0 is in D6
-  __ LoadDImmediate(D10, 1.0, R1);
-  __ vcmpd(D6, D10);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    // Check that 1.0 is in D6
+    __ LoadDImmediate(D10, 1.0, R1);
+    __ vcmpd(D6, D10);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
 
-  // Check that 0.0 is in D5
-  __ LoadDImmediate(D10, 0.0, R1);
-  __ vcmpd(D5, D10);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    // Check that 0.0 is in D5
+    __ LoadDImmediate(D10, 0.0, R1);
+    __ vcmpd(D5, D10);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
 
-  // Restore used callee-saved FPU registers.
-  __ vldmd(IA_W, SP, D8, 3);
+    // Restore used callee-saved FPU registers.
+    __ vldmd(IA_W, SP, D8, 3);
+  } else {
+    __ LoadImmediate(R0, 42);
+  }
   __ bx(LR);
 }
 
@@ -1446,48 +1549,51 @@
 
 // Make sure we can start somewhere other than S0
 ASSEMBLER_TEST_GENERATE(VstmsVldms_off, assembler) {
-  __ LoadSImmediate(S0, 0.0);
-  __ LoadSImmediate(S1, 1.0);
-  __ LoadSImmediate(S2, 2.0);
-  __ LoadSImmediate(S3, 3.0);
-  __ LoadSImmediate(S4, 4.0);
-  __ LoadSImmediate(S5, 5.0);
-  __ vstms(DB_W, SP, S0, S4);  // Push S0 - S4 onto the stack, dec SP
-  __ vldms(IA_W, SP, S5, S9);  // Pop stack into S5 - S9, inc SP
+  if (TargetCPUFeatures::vfp_supported()) {
+    __ LoadSImmediate(S0, 0.0);
+    __ LoadSImmediate(S1, 1.0);
+    __ LoadSImmediate(S2, 2.0);
+    __ LoadSImmediate(S3, 3.0);
+    __ LoadSImmediate(S4, 4.0);
+    __ LoadSImmediate(S5, 5.0);
+    __ vstms(DB_W, SP, S0, S4);  // Push S0 - S4 onto the stack, dec SP
+    __ vldms(IA_W, SP, S5, S9);  // Pop stack into S5 - S9, inc SP
 
-  // Load success value into R0
-  __ mov(R0, ShifterOperand(42));
+    // Load success value into R0
+    __ mov(R0, ShifterOperand(42));
 
-  // Check that 4.0 is in S9
-  __ LoadSImmediate(S10, 4.0);
-  __ vcmps(S9, S10);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    // Check that 4.0 is in S9
+    __ LoadSImmediate(S10, 4.0);
+    __ vcmps(S9, S10);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
 
-  // Check that 3.0 is in S8
-  __ LoadSImmediate(S10, 3.0);
-  __ vcmps(S8, S10);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    // Check that 3.0 is in S8
+    __ LoadSImmediate(S10, 3.0);
+    __ vcmps(S8, S10);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
 
-  // Check that 2.0 is in S7
-  __ LoadSImmediate(S10, 2.0);
-  __ vcmps(S7, S10);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    // Check that 2.0 is in S7
+    __ LoadSImmediate(S10, 2.0);
+    __ vcmps(S7, S10);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
 
-  // Check that 1.0 is back in S6
-  __ LoadSImmediate(S10, 1.0);
-  __ vcmps(S6, S10);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    // Check that 1.0 is back in S6
+    __ LoadSImmediate(S10, 1.0);
+    __ vcmps(S6, S10);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
 
-  // Check that 0.0 is back in S5
-  __ LoadSImmediate(S10, 0.0);
-  __ vcmps(S5, S10);
-  __ vmstat();
-  __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
-
+    // Check that 0.0 is back in S5
+    __ LoadSImmediate(S10, 0.0);
+    __ vcmps(S5, S10);
+    __ vmstat();
+    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+  } else {
+    __ LoadImmediate(R0, 42);
+  }
   __ bx(LR);
 }
 
@@ -1927,47 +2033,51 @@
 
 
 ASSEMBLER_TEST_GENERATE(Mint_shl_ok, assembler) {
-  const QRegister value = Q0;
-  const QRegister temp = Q1;
-  const QRegister out = Q2;
-  const Register shift = R1;
-  const DRegister dtemp0 = EvenDRegisterOf(temp);
-  const SRegister stemp0 = EvenSRegisterOf(dtemp0);
-  const DRegister dout0 = EvenDRegisterOf(out);
-  const SRegister sout0 = EvenSRegisterOf(dout0);
-  const SRegister sout1 = OddSRegisterOf(dout0);
-  Label fail;
+  if (TargetCPUFeatures::neon_supported()) {
+    const QRegister value = Q0;
+    const QRegister temp = Q1;
+    const QRegister out = Q2;
+    const Register shift = R1;
+    const DRegister dtemp0 = EvenDRegisterOf(temp);
+    const SRegister stemp0 = EvenSRegisterOf(dtemp0);
+    const DRegister dout0 = EvenDRegisterOf(out);
+    const SRegister sout0 = EvenSRegisterOf(dout0);
+    const SRegister sout1 = OddSRegisterOf(dout0);
+    Label fail;
 
-  // Initialize.
-  __ veorq(value, value, value);
-  __ veorq(temp, temp, temp);
-  __ veorq(out, out, out);
-  __ LoadImmediate(shift, 32);
-  __ LoadImmediate(R2, 1 << 7);
-  __ vmovsr(S0, R2);
+    // Initialize.
+    __ veorq(value, value, value);
+    __ veorq(temp, temp, temp);
+    __ veorq(out, out, out);
+    __ LoadImmediate(shift, 32);
+    __ LoadImmediate(R2, 1 << 7);
+    __ vmovsr(S0, R2);
 
-  __ vmovsr(stemp0, shift);  // Move the shift into the low S register.
-  __ vshlqu(kWordPair, out, value, temp);
+    __ vmovsr(stemp0, shift);  // Move the shift into the low S register.
+    __ vshlqu(kWordPair, out, value, temp);
 
-  // check for overflow by shifting back and comparing.
-  __ rsb(shift, shift, ShifterOperand(0));
-  __ vmovsr(stemp0, shift);
-  __ vshlqi(kWordPair, temp, out, temp);
-  __ vceqqi(kWord, out, temp, value);
-  // Low 64 bits of temp should be all 1's, otherwise temp != value and
-  // we deopt.
-  __ vmovrs(shift, sout0);
-  __ CompareImmediate(shift, -1);
-  __ b(&fail, NE);
-  __ vmovrs(shift, sout1);
-  __ CompareImmediate(shift, -1);
-  __ b(&fail, NE);
+    // check for overflow by shifting back and comparing.
+    __ rsb(shift, shift, ShifterOperand(0));
+    __ vmovsr(stemp0, shift);
+    __ vshlqi(kWordPair, temp, out, temp);
+    __ vceqqi(kWord, out, temp, value);
+    // Low 64 bits of temp should be all 1's, otherwise temp != value and
+    // we deopt.
+    __ vmovrs(shift, sout0);
+    __ CompareImmediate(shift, -1);
+    __ b(&fail, NE);
+    __ vmovrs(shift, sout1);
+    __ CompareImmediate(shift, -1);
+    __ b(&fail, NE);
 
-  __ LoadImmediate(R0, 1);
-  __ bx(LR);
+    __ LoadImmediate(R0, 1);
+    __ bx(LR);
 
-  __ Bind(&fail);
-  __ LoadImmediate(R0, 0);
+    __ Bind(&fail);
+    __ LoadImmediate(R0, 0);
+  } else {
+    __ LoadImmediate(R0, 1);
+  }
   __ bx(LR);
 }
 
@@ -1980,47 +2090,51 @@
 
 
 ASSEMBLER_TEST_GENERATE(Mint_shl_overflow, assembler) {
-  const QRegister value = Q0;
-  const QRegister temp = Q1;
-  const QRegister out = Q2;
-  const Register shift = R1;
-  const DRegister dtemp0 = EvenDRegisterOf(temp);
-  const SRegister stemp0 = EvenSRegisterOf(dtemp0);
-  const DRegister dout0 = EvenDRegisterOf(out);
-  const SRegister sout0 = EvenSRegisterOf(dout0);
-  const SRegister sout1 = OddSRegisterOf(dout0);
-  Label fail;
+  if (TargetCPUFeatures::neon_supported()) {
+    const QRegister value = Q0;
+    const QRegister temp = Q1;
+    const QRegister out = Q2;
+    const Register shift = R1;
+    const DRegister dtemp0 = EvenDRegisterOf(temp);
+    const SRegister stemp0 = EvenSRegisterOf(dtemp0);
+    const DRegister dout0 = EvenDRegisterOf(out);
+    const SRegister sout0 = EvenSRegisterOf(dout0);
+    const SRegister sout1 = OddSRegisterOf(dout0);
+    Label fail;
 
-  // Initialize.
-  __ veorq(value, value, value);
-  __ veorq(temp, temp, temp);
-  __ veorq(out, out, out);
-  __ LoadImmediate(shift, 60);
-  __ LoadImmediate(R2, 1 << 7);
-  __ vmovsr(S0, R2);
+    // Initialize.
+    __ veorq(value, value, value);
+    __ veorq(temp, temp, temp);
+    __ veorq(out, out, out);
+    __ LoadImmediate(shift, 60);
+    __ LoadImmediate(R2, 1 << 7);
+    __ vmovsr(S0, R2);
 
-  __ vmovsr(stemp0, shift);  // Move the shift into the low S register.
-  __ vshlqu(kWordPair, out, value, temp);
+    __ vmovsr(stemp0, shift);  // Move the shift into the low S register.
+    __ vshlqu(kWordPair, out, value, temp);
 
-  // check for overflow by shifting back and comparing.
-  __ rsb(shift, shift, ShifterOperand(0));
-  __ vmovsr(stemp0, shift);
-  __ vshlqi(kWordPair, temp, out, temp);
-  __ vceqqi(kWord, out, temp, value);
-  // Low 64 bits of temp should be all 1's, otherwise temp != value and
-  // we deopt.
-  __ vmovrs(shift, sout0);
-  __ CompareImmediate(shift, -1);
-  __ b(&fail, NE);
-  __ vmovrs(shift, sout1);
-  __ CompareImmediate(shift, -1);
-  __ b(&fail, NE);
+    // check for overflow by shifting back and comparing.
+    __ rsb(shift, shift, ShifterOperand(0));
+    __ vmovsr(stemp0, shift);
+    __ vshlqi(kWordPair, temp, out, temp);
+    __ vceqqi(kWord, out, temp, value);
+    // Low 64 bits of temp should be all 1's, otherwise temp != value and
+    // we deopt.
+    __ vmovrs(shift, sout0);
+    __ CompareImmediate(shift, -1);
+    __ b(&fail, NE);
+    __ vmovrs(shift, sout1);
+    __ CompareImmediate(shift, -1);
+    __ b(&fail, NE);
 
-  __ LoadImmediate(R0, 0);
-  __ bx(LR);
+    __ LoadImmediate(R0, 0);
+    __ bx(LR);
 
-  __ Bind(&fail);
-  __ LoadImmediate(R0, 1);
+    __ Bind(&fail);
+    __ LoadImmediate(R0, 1);
+  } else {
+    __ LoadImmediate(R0, 1);
+  }
   __ bx(LR);
 }
 
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index 8fa4f0a..a2f8a65 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -1985,20 +1985,35 @@
 
 
 void Assembler::AddImmediate(Register reg, const Immediate& imm) {
-  intptr_t value = imm.value();
-  if (value > 0) {
+  const intptr_t value = imm.value();
+  if (value == 0) {
+    return;
+  }
+  if ((value > 0) || (value == kMinInt32)) {
     if (value == 1) {
       incl(reg);
-    } else if (value != 0) {
+    } else {
       addl(reg, imm);
     }
-  } else if (value < 0) {
-    value = -value;
+  } else {
+    SubImmediate(reg, Immediate(-value));
+  }
+}
+
+
+void Assembler::SubImmediate(Register reg, const Immediate& imm) {
+  const intptr_t value = imm.value();
+  if (value == 0) {
+    return;
+  }
+  if ((value > 0) || (value == kMinInt32)) {
     if (value == 1) {
       decl(reg);
-    } else if (value != 0) {
-      subl(reg, Immediate(value));
+    } else {
+      subl(reg, imm);
     }
+  } else {
+    AddImmediate(reg, Immediate(-value));
   }
 }
 
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index e21cc4c..f502bd5 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -627,6 +627,7 @@
   void PopRegister(Register r);
 
   void AddImmediate(Register reg, const Immediate& imm);
+  void SubImmediate(Register reg, const Immediate& imm);
 
   void Drop(intptr_t stack_elements);
 
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index 5f432c9..f26e32c 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -112,6 +112,7 @@
 
 
 void Assembler::EmitFarJump(int32_t offset, bool link) {
+  ASSERT(!in_delay_slot_);
   ASSERT(use_far_branches());
   const uint16_t low = Utils::Low16Bits(offset);
   const uint16_t high = Utils::High16Bits(offset);
@@ -146,6 +147,7 @@
 
 void Assembler::EmitFarBranch(Opcode b, Register rs, Register rt,
                               int32_t offset) {
+  ASSERT(!in_delay_slot_);
   EmitIType(b, rs, rt, 4);
   nop();
   EmitFarJump(offset, false);
@@ -167,6 +169,7 @@
 
 
 void Assembler::EmitFarRegImmBranch(RtRegImm b, Register rs, int32_t offset) {
+  ASSERT(!in_delay_slot_);
   EmitRegImmType(REGIMM, rs, b, 4);
   nop();
   EmitFarJump(offset, (b == BLTZAL) || (b == BGEZAL));
@@ -174,6 +177,7 @@
 
 
 void Assembler::EmitFarFpuBranch(bool kind, int32_t offset) {
+  ASSERT(!in_delay_slot_);
   const uint32_t b16 = kind ? (1 << 16) : 0;
   Emit(COP1 << kOpcodeShift | COP1_BC << kCop1SubShift | b16 | 4);
   nop();
@@ -182,6 +186,7 @@
 
 
 void Assembler::EmitBranch(Opcode b, Register rs, Register rt, Label* label) {
+  ASSERT(!in_delay_slot_);
   if (label->IsBound()) {
     // Relative destination from an instruction after the branch.
     const int32_t dest =
@@ -207,6 +212,7 @@
 
 
 void Assembler::EmitRegImmBranch(RtRegImm b, Register rs, Label* label) {
+  ASSERT(!in_delay_slot_);
   if (label->IsBound()) {
     // Relative destination from an instruction after the branch.
     const int32_t dest =
@@ -232,6 +238,7 @@
 
 
 void Assembler::EmitFpuBranch(bool kind, Label *label) {
+  ASSERT(!in_delay_slot_);
   const int32_t b16 = kind ? (1 << 16) : 0;  // Bit 16 set for branch on true.
   if (label->IsBound()) {
     // Relative destination from an instruction after the branch.
@@ -348,6 +355,7 @@
 
 
 void Assembler::LoadWordFromPoolOffset(Register rd, int32_t offset) {
+  ASSERT(!in_delay_slot_);
   ASSERT(rd != PP);
   if (Address::CanHoldOffset(offset)) {
     lw(rd, Address(PP, offset));
@@ -368,6 +376,7 @@
 
 void Assembler::AdduDetectOverflow(Register rd, Register rs, Register rt,
                                    Register ro, Register scratch) {
+  ASSERT(!in_delay_slot_);
   ASSERT(rd != ro);
   ASSERT(rd != TMP);
   ASSERT(ro != TMP);
@@ -408,6 +417,7 @@
 
 void Assembler::SubuDetectOverflow(Register rd, Register rs, Register rt,
                                    Register ro) {
+  ASSERT(!in_delay_slot_);
   ASSERT(rd != ro);
   ASSERT(rd != TMP);
   ASSERT(ro != TMP);
@@ -446,6 +456,7 @@
 
 
 void Assembler::LoadObject(Register rd, const Object& object) {
+  ASSERT(!in_delay_slot_);
   // Smis and VM heap objects are never relocated; do not use object pool.
   if (object.IsSmi()) {
     LoadImmediate(rd, reinterpret_cast<int32_t>(object.raw()));
@@ -485,6 +496,7 @@
 
 
 void Assembler::PushObject(const Object& object) {
+  ASSERT(!in_delay_slot_);
   LoadObject(TMP, object);
   Push(TMP);
 }
@@ -492,6 +504,7 @@
 
 void Assembler::CompareObject(Register rd1, Register rd2,
                               Register rn, const Object& object) {
+  ASSERT(!in_delay_slot_);
   ASSERT(rn != TMP);
   ASSERT(rd1 != TMP);
   ASSERT(rd1 != rd2);
@@ -505,6 +518,7 @@
 void Assembler::StoreIntoObjectFilterNoSmi(Register object,
                                            Register value,
                                            Label* no_update) {
+  ASSERT(!in_delay_slot_);
   COMPILE_ASSERT((kNewObjectAlignmentOffset == kWordSize) &&
                  (kOldObjectAlignmentOffset == 0), young_alignment);
 
@@ -523,6 +537,7 @@
 void Assembler::StoreIntoObjectFilter(Register object,
                                       Register value,
                                       Label* no_update) {
+  ASSERT(!in_delay_slot_);
   // For the value we are only interested in the new/old bit and the tag bit.
   // And the new bit with the tag bit. The resulting bit will be 0 for a Smi.
   sll(TMP, value, kObjectAlignmentLog2 - 1);
@@ -539,6 +554,7 @@
                                 const Address& dest,
                                 Register value,
                                 bool can_value_be_smi) {
+  ASSERT(!in_delay_slot_);
   ASSERT(object != value);
   sw(value, dest);
   Label done;
@@ -575,6 +591,7 @@
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
                                          Register value) {
+  ASSERT(!in_delay_slot_);
   sw(value, dest);
 #if defined(DEBUG)
   Label done;
@@ -589,6 +606,7 @@
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
                                          const Object& value) {
+  ASSERT(!in_delay_slot_);
   ASSERT(value.IsSmi() || value.InVMHeap() ||
          (value.IsOld() && value.IsNotTemporaryScopedHandle()));
   // No store buffer update.
@@ -607,6 +625,7 @@
 
 
 void Assembler::LoadClassById(Register result, Register class_id) {
+  ASSERT(!in_delay_slot_);
   ASSERT(result != class_id);
   lw(result, FieldAddress(CTX, Context::isolate_offset()));
   const intptr_t table_offset_in_isolate =
@@ -619,6 +638,7 @@
 
 
 void Assembler::LoadClass(Register result, Register object) {
+  ASSERT(!in_delay_slot_);
   ASSERT(TMP != result);
   LoadClassId(TMP, object);
 
@@ -633,6 +653,7 @@
 
 
 void Assembler::EnterFrame() {
+  ASSERT(!in_delay_slot_);
   addiu(SP, SP, Immediate(-2 * kWordSize));
   sw(RA, Address(SP, 1 * kWordSize));
   sw(FP, Address(SP, 0 * kWordSize));
@@ -641,6 +662,7 @@
 
 
 void Assembler::LeaveFrameAndReturn() {
+  ASSERT(!in_delay_slot_);
   mov(SP, FP);
   lw(RA, Address(SP, 1 * kWordSize));
   lw(FP, Address(SP, 0 * kWordSize));
@@ -650,6 +672,7 @@
 
 
 void Assembler::EnterStubFrame(bool load_pp) {
+  ASSERT(!in_delay_slot_);
   SetPrologueOffset();
   addiu(SP, SP, Immediate(-4 * kWordSize));
   sw(ZR, Address(SP, 3 * kWordSize));  // PC marker is 0 in stubs.
@@ -665,6 +688,7 @@
 
 
 void Assembler::LeaveStubFrame() {
+  ASSERT(!in_delay_slot_);
   addiu(SP, FP, Immediate(-1 * kWordSize));
   lw(RA, Address(SP, 2 * kWordSize));
   lw(FP, Address(SP, 1 * kWordSize));
@@ -674,6 +698,7 @@
 
 
 void Assembler::LeaveStubFrameAndReturn(Register ra) {
+  ASSERT(!in_delay_slot_);
   addiu(SP, FP, Immediate(-1 * kWordSize));
   lw(RA, Address(SP, 2 * kWordSize));
   lw(FP, Address(SP, 1 * kWordSize));
@@ -686,6 +711,7 @@
 void Assembler::UpdateAllocationStats(intptr_t cid,
                                       Register temp_reg,
                                       Heap::Space space) {
+  ASSERT(!in_delay_slot_);
   ASSERT(temp_reg != kNoRegister);
   ASSERT(temp_reg != TMP);
   ASSERT(cid > 0);
@@ -723,6 +749,7 @@
                                               Register size_reg,
                                               Register temp_reg,
                                               Heap::Space space) {
+  ASSERT(!in_delay_slot_);
   ASSERT(temp_reg != kNoRegister);
   ASSERT(cid > 0);
   ASSERT(temp_reg != TMP);
@@ -773,6 +800,7 @@
                             Label* failure,
                             Register instance_reg,
                             Register temp_reg) {
+  ASSERT(!in_delay_slot_);
   ASSERT(failure != NULL);
   if (FLAG_inline_alloc) {
     Heap* heap = Isolate::Current()->heap();
@@ -814,6 +842,7 @@
 
 
 void Assembler::EnterDartFrame(intptr_t frame_size) {
+  ASSERT(!in_delay_slot_);
   const intptr_t offset = CodeSize();
 
   SetPrologueOffset();
@@ -851,6 +880,7 @@
 // optimized function and there may be extra space for spill slots to
 // allocate. We must also set up the pool pointer for the function.
 void Assembler::EnterOsrFrame(intptr_t extra_size) {
+  ASSERT(!in_delay_slot_);
   Comment("EnterOsrFrame");
 
   GetNextPC(TMP);  // TMP gets the address of the next instruction.
@@ -880,6 +910,7 @@
 
 
 void Assembler::LeaveDartFrame() {
+  ASSERT(!in_delay_slot_);
   addiu(SP, FP, Immediate(-kWordSize));
 
   lw(RA, Address(SP, 2 * kWordSize));
@@ -892,6 +923,7 @@
 
 
 void Assembler::LeaveDartFrameAndReturn() {
+  ASSERT(!in_delay_slot_);
   addiu(SP, FP, Immediate(-kWordSize));
 
   lw(RA, Address(SP, 2 * kWordSize));
@@ -905,6 +937,7 @@
 
 
 void Assembler::ReserveAlignedFrameSpace(intptr_t frame_space) {
+  ASSERT(!in_delay_slot_);
   // Reserve space for arguments and align frame before entering
   // the C++ world.
   AddImmediate(SP, -frame_space);
@@ -916,6 +949,7 @@
 
 
 void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) {
+  ASSERT(!in_delay_slot_);
   const intptr_t kPushedRegistersSize =
       kDartVolatileCpuRegCount * kWordSize +
       2 * kWordSize +  // FP and RA.
@@ -958,6 +992,7 @@
 
 
 void Assembler::LeaveCallRuntimeFrame() {
+  ASSERT(!in_delay_slot_);
   const intptr_t kPushedRegistersSize =
       kDartVolatileCpuRegCount * kWordSize +
       2 * kWordSize +  // FP and RA.
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index e0de57b..2a4307b 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -768,6 +768,7 @@
   // registers is needed.
   void AddImmediateDetectOverflow(Register rd, Register rs, int32_t imm,
                                   Register ro, Register scratch = kNoRegister) {
+    ASSERT(!in_delay_slot_);
     LoadImmediate(rd, imm);
     AdduDetectOverflow(rd, rs, rd, ro, scratch);
   }
@@ -782,16 +783,19 @@
   // None of rd, rs, rt, or ro may be TMP.
   void SubImmediateDetectOverflow(Register rd, Register rs, int32_t imm,
                                   Register ro) {
+    ASSERT(!in_delay_slot_);
     LoadImmediate(rd, imm);
     SubuDetectOverflow(rd, rs, rd, ro);
   }
 
   void Branch(const ExternalLabel* label) {
+    ASSERT(!in_delay_slot_);
     LoadImmediate(TMP, label->address());
     jr(TMP);
   }
 
   void BranchPatchable(const ExternalLabel* label) {
+    ASSERT(!in_delay_slot_);
     const uint16_t low = Utils::Low16Bits(label->address());
     const uint16_t high = Utils::High16Bits(label->address());
     lui(T9, Immediate(high));
@@ -801,11 +805,13 @@
   }
 
   void BranchLink(const ExternalLabel* label) {
+    ASSERT(!in_delay_slot_);
     LoadImmediate(T9, label->address());
     jalr(T9);
   }
 
   void BranchLinkPatchable(const ExternalLabel* label) {
+    ASSERT(!in_delay_slot_);
     const int32_t offset =
         Array::data_offset() + 4*AddExternalLabel(label) - kHeapObjectTag;
     LoadWordFromPoolOffset(T9, offset);
@@ -821,6 +827,7 @@
   }
 
   void LoadPoolPointer() {
+    ASSERT(!in_delay_slot_);
     GetNextPC(TMP);  // TMP gets the address of the next instruction.
     const intptr_t object_pool_pc_dist =
         Instructions::HeaderSize() - Instructions::object_pool_offset() +
@@ -829,6 +836,7 @@
   }
 
   void LoadImmediate(Register rd, int32_t value) {
+    ASSERT(!in_delay_slot_);
     if (Utils::IsInt(kImmBits, value)) {
       addiu(rd, ZR, Immediate(value));
     } else {
@@ -840,6 +848,7 @@
   }
 
   void LoadImmediate(DRegister rd, double value) {
+    ASSERT(!in_delay_slot_);
     FRegister frd = static_cast<FRegister>(rd * 2);
     const int64_t ival = bit_cast<uint64_t, double>(value);
     const int32_t low = Utils::Low32Bits(ival);
@@ -860,6 +869,7 @@
   }
 
   void LoadImmediate(FRegister rd, float value) {
+    ASSERT(!in_delay_slot_);
     const int32_t ival = bit_cast<int32_t, float>(value);
     if (ival == 0) {
       mtc1(ZR, rd);
@@ -870,6 +880,7 @@
   }
 
   void AddImmediate(Register rd, Register rs, int32_t value) {
+    ASSERT(!in_delay_slot_);
     if ((value == 0) && (rd == rs)) return;
     // If value is 0, we still want to move rs to rd if they aren't the same.
     if (Utils::IsInt(kImmBits, value)) {
@@ -881,10 +892,12 @@
   }
 
   void AddImmediate(Register rd, int32_t value) {
+    ASSERT(!in_delay_slot_);
     AddImmediate(rd, rd, value);
   }
 
   void AndImmediate(Register rd, Register rs, int32_t imm) {
+    ASSERT(!in_delay_slot_);
     if (imm == 0) {
       mov(rd, ZR);
       return;
@@ -899,6 +912,7 @@
   }
 
   void BranchEqual(Register rd, int32_t value, Label* l) {
+    ASSERT(!in_delay_slot_);
     if (value == 0) {
       beq(rd, ZR, l);
     } else {
@@ -909,12 +923,14 @@
   }
 
   void BranchEqual(Register rd, const Object& object, Label* l) {
+    ASSERT(!in_delay_slot_);
     ASSERT(rd != CMPRES2);
     LoadObject(CMPRES2, object);
     beq(rd, CMPRES2, l);
   }
 
   void BranchNotEqual(Register rd, int32_t value, Label* l) {
+    ASSERT(!in_delay_slot_);
     if (value == 0) {
       bne(rd, ZR, l);
     } else {
@@ -925,17 +941,20 @@
   }
 
   void BranchNotEqual(Register rd, const Object& object, Label* l) {
+    ASSERT(!in_delay_slot_);
     ASSERT(rd != CMPRES2);
     LoadObject(CMPRES2, object);
     bne(rd, CMPRES2, l);
   }
 
   void BranchSignedGreater(Register rd, Register rs, Label* l) {
+    ASSERT(!in_delay_slot_);
     slt(CMPRES2, rs, rd);  // CMPRES2 = rd > rs ? 1 : 0.
     bne(CMPRES2, ZR, l);
   }
 
   void BranchSignedGreater(Register rd, int32_t value, Label* l) {
+    ASSERT(!in_delay_slot_);
     if (value == 0) {
       bgtz(rd, l);
     } else {
@@ -946,11 +965,13 @@
   }
 
   void BranchUnsignedGreater(Register rd, Register rs, Label* l) {
+    ASSERT(!in_delay_slot_);
     sltu(CMPRES2, rs, rd);
     bne(CMPRES2, ZR, l);
   }
 
   void BranchUnsignedGreater(Register rd, int32_t value, Label* l) {
+    ASSERT(!in_delay_slot_);
     if (value == 0) {
       BranchNotEqual(rd, 0, l);
     } else {
@@ -961,11 +982,13 @@
   }
 
   void BranchSignedGreaterEqual(Register rd, Register rs, Label* l) {
+    ASSERT(!in_delay_slot_);
     slt(CMPRES2, rd, rs);  // CMPRES2 = rd < rs ? 1 : 0.
     beq(CMPRES2, ZR, l);  // If CMPRES2 = 0, then rd >= rs.
   }
 
   void BranchSignedGreaterEqual(Register rd, int32_t value, Label* l) {
+    ASSERT(!in_delay_slot_);
     if (value == 0) {
       bgez(rd, l);
     } else {
@@ -981,11 +1004,13 @@
   }
 
   void BranchUnsignedGreaterEqual(Register rd, Register rs, Label* l) {
+    ASSERT(!in_delay_slot_);
     sltu(CMPRES2, rd, rs);  // CMPRES2 = rd < rs ? 1 : 0.
     beq(CMPRES2, ZR, l);
   }
 
   void BranchUnsignedGreaterEqual(Register rd, int32_t value, Label* l) {
+    ASSERT(!in_delay_slot_);
     if (value == 0) {
       b(l);
     } else {
@@ -1001,10 +1026,12 @@
   }
 
   void BranchSignedLess(Register rd, Register rs, Label* l) {
+    ASSERT(!in_delay_slot_);
     BranchSignedGreater(rs, rd, l);
   }
 
   void BranchSignedLess(Register rd, int32_t value, Label* l) {
+    ASSERT(!in_delay_slot_);
     if (value == 0) {
       bltz(rd, l);
     } else {
@@ -1020,10 +1047,12 @@
   }
 
   void BranchUnsignedLess(Register rd, Register rs, Label* l) {
+    ASSERT(!in_delay_slot_);
     BranchUnsignedGreater(rs, rd, l);
   }
 
   void BranchUnsignedLess(Register rd, int32_t value, Label* l) {
+    ASSERT(!in_delay_slot_);
     ASSERT(value != 0);
     if (Utils::IsUint(kImmBits, value)) {
       sltiu(CMPRES2, rd, Immediate(value));
@@ -1036,10 +1065,12 @@
   }
 
   void BranchSignedLessEqual(Register rd, Register rs, Label* l) {
+    ASSERT(!in_delay_slot_);
     BranchSignedGreaterEqual(rs, rd, l);
   }
 
   void BranchSignedLessEqual(Register rd, int32_t value, Label* l) {
+    ASSERT(!in_delay_slot_);
     if (value == 0) {
       blez(rd, l);
     } else {
@@ -1050,21 +1081,25 @@
   }
 
   void BranchUnsignedLessEqual(Register rd, Register rs, Label* l) {
+    ASSERT(!in_delay_slot_);
     BranchUnsignedGreaterEqual(rs, rd, l);
   }
 
   void BranchUnsignedLessEqual(Register rd, int32_t value, Label* l) {
+    ASSERT(!in_delay_slot_);
     ASSERT(rd != CMPRES2);
     LoadImmediate(CMPRES2, value);
     BranchUnsignedGreaterEqual(CMPRES2, rd, l);
   }
 
   void Push(Register rt) {
+    ASSERT(!in_delay_slot_);
     addiu(SP, SP, Immediate(-kWordSize));
     sw(rt, Address(SP));
   }
 
   void Pop(Register rt) {
+    ASSERT(!in_delay_slot_);
     lw(rt, Address(SP));
     addiu(SP, SP, Immediate(kWordSize));
   }
@@ -1082,6 +1117,7 @@
   }
 
   void LoadFromOffset(Register reg, Register base, int32_t offset) {
+    ASSERT(!in_delay_slot_);
     if (Utils::IsInt(kImmBits, offset)) {
       lw(reg, Address(base, offset));
     } else {
@@ -1092,6 +1128,7 @@
   }
 
   void StoreToOffset(Register reg, Register base, int32_t offset) {
+    ASSERT(!in_delay_slot_);
     if (Utils::IsInt(kImmBits, offset)) {
       sw(reg, Address(base, offset));
     } else {
@@ -1102,6 +1139,7 @@
   }
 
   void StoreDToOffset(DRegister reg, Register base, int32_t offset) {
+    ASSERT(!in_delay_slot_);
     FRegister lo = static_cast<FRegister>(reg * 2);
     FRegister hi = static_cast<FRegister>(reg * 2 + 1);
     swc1(lo, Address(base, offset));
@@ -1109,6 +1147,7 @@
   }
 
   void LoadDFromOffset(DRegister reg, Register base, int32_t offset) {
+    ASSERT(!in_delay_slot_);
     FRegister lo = static_cast<FRegister>(reg * 2);
     FRegister hi = static_cast<FRegister>(reg * 2 + 1);
     lwc1(lo, Address(base, offset));
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 34943ba..727fb63 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -2363,11 +2363,14 @@
 
 
 void Assembler::AddImmediate(Register reg, const Immediate& imm, Register pp) {
-  int64_t value = imm.value();
-  if (value > 0) {
+  const int64_t value = imm.value();
+  if (value == 0) {
+    return;
+  }
+  if ((value > 0) || (value == kMinInt64)) {
     if (value == 1) {
       incq(reg);
-    } else if (value != 0) {
+    } else {
       if (CanLoadImmediateFromPool(imm, pp)) {
         ASSERT(reg != TMP);
         LoadImmediate(TMP, imm, pp);
@@ -2376,31 +2379,22 @@
         addq(reg, imm);
       }
     }
-  } else if (value < 0) {
-    value = -value;
-    if (value == 1) {
-      decq(reg);
-    } else if (value != 0) {
-      const Immediate& s = Immediate(value);
-      if (CanLoadImmediateFromPool(s, pp)) {
-        ASSERT(reg != TMP);
-        LoadImmediate(TMP, s, pp);
-        subq(reg, TMP);
-      } else {
-        subq(reg, Immediate(value));
-      }
-    }
+  } else {
+    SubImmediate(reg, Immediate(-value), pp);
   }
 }
 
 
 void Assembler::AddImmediate(const Address& address, const Immediate& imm,
                              Register pp) {
-  int64_t value = imm.value();
-  if (value > 0) {
+  const int64_t value = imm.value();
+  if (value == 0) {
+    return;
+  }
+  if ((value > 0) || (value == kMinInt64)) {
     if (value == 1) {
       incq(address);
-    } else if (value != 0) {
+    } else {
       if (CanLoadImmediateFromPool(imm, pp)) {
         LoadImmediate(TMP, imm, pp);
         addq(address, TMP);
@@ -2408,19 +2402,54 @@
         addq(address, imm);
       }
     }
-  } else if (value < 0) {
-    value = -value;
+  } else {
+    SubImmediate(address, Immediate(-value), pp);
+  }
+}
+
+
+void Assembler::SubImmediate(Register reg, const Immediate& imm, Register pp) {
+  const int64_t value = imm.value();
+  if (value == 0) {
+    return;
+  }
+  if ((value > 0) || (value == kMinInt64)) {
     if (value == 1) {
-      decq(address);
-    } else if (value != 0) {
-      const Immediate& s = Immediate(value);
-      if (CanLoadImmediateFromPool(s, pp)) {
-        LoadImmediate(TMP, s, pp);
-        subq(address, TMP);
+      decq(reg);
+    } else {
+      if (CanLoadImmediateFromPool(imm, pp)) {
+        ASSERT(reg != TMP);
+        LoadImmediate(TMP, imm, pp);
+        subq(reg, TMP);
       } else {
-        subq(address, s);
+        subq(reg, imm);
       }
     }
+  } else {
+    AddImmediate(reg, Immediate(-value), pp);
+  }
+}
+
+
+void Assembler::SubImmediate(const Address& address, const Immediate& imm,
+                             Register pp) {
+  const int64_t value = imm.value();
+  if (value == 0) {
+    return;
+  }
+  if ((value > 0) || (value == kMinInt64)) {
+    if (value == 1) {
+      decq(address);
+    } else {
+      if (CanLoadImmediateFromPool(imm, pp)) {
+        LoadImmediate(TMP, imm, pp);
+        subq(address, TMP);
+      } else {
+        subq(address, imm);
+      }
+    }
+  } else {
+    AddImmediate(address, Immediate(-value), pp);
   }
 }
 
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index 734f59d..70f345e 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -671,6 +671,8 @@
   // PP should be passed for pp.
   void AddImmediate(Register reg, const Immediate& imm, Register pp);
   void AddImmediate(const Address& address, const Immediate& imm, Register pp);
+  void SubImmediate(Register reg, const Immediate& imm, Register pp);
+  void SubImmediate(const Address& address, const Immediate& imm, Register pp);
 
   void Drop(intptr_t stack_elements);
 
diff --git a/runtime/vm/ast.cc b/runtime/vm/ast.cc
index 9a30a27..f144e4f 100644
--- a/runtime/vm/ast.cc
+++ b/runtime/vm/ast.cc
@@ -119,13 +119,18 @@
 }
 
 
-// TODO(srdjan): Add code for logical negation.
 AstNode* LiteralNode::ApplyUnaryOp(Token::Kind unary_op_kind) {
   if (unary_op_kind == Token::kNEGATE) {
     if (literal().IsSmi()) {
       const Smi& smi = Smi::Cast(literal());
       const Instance& literal =
-          Instance::ZoneHandle(Integer::New(-smi.Value()));
+          Instance::ZoneHandle(Integer::New(-smi.Value(), Heap::kOld));
+      return new LiteralNode(this->token_pos(), literal);
+    }
+    if (literal().IsMint()) {
+      const Mint& mint = Mint::Cast(literal());
+      const Instance& literal =
+          Instance::ZoneHandle(Integer::New(-mint.value(), Heap::kOld));
       return new LiteralNode(this->token_pos(), literal);
     }
     if (literal().IsDouble()) {
@@ -136,6 +141,24 @@
           Double::ZoneHandle(Double::NewCanonical(new_value));
       return new LiteralNode(this->token_pos(), double_instance);
     }
+  } else if (unary_op_kind == Token::kBIT_NOT) {
+    if (literal().IsSmi()) {
+      const Smi& smi = Smi::Cast(literal());
+      const Instance& literal =
+          Instance::ZoneHandle(Integer::New(~smi.Value(), Heap::kOld));
+      return new LiteralNode(this->token_pos(), literal);
+    }
+    if (literal().IsMint()) {
+      const Mint& mint = Mint::Cast(literal());
+      const Instance& literal =
+          Instance::ZoneHandle(Integer::New(~mint.value(), Heap::kOld));
+      return new LiteralNode(this->token_pos(), literal);
+    }
+  } else if (unary_op_kind == Token::kNOT) {
+    if (literal().IsBool()) {
+      const Bool& boolean = Bool::Cast(literal());
+      return new LiteralNode(this->token_pos(), Bool::Get(!boolean.value()));
+    }
   }
   return NULL;
 }
diff --git a/runtime/vm/ast_printer.cc b/runtime/vm/ast_printer.cc
index 9ac20a5..c1c957d 100644
--- a/runtime/vm/ast_printer.cc
+++ b/runtime/vm/ast_printer.cc
@@ -391,29 +391,37 @@
 }
 
 
+void AstPrinter::PrintLocalScopeVariable(const LocalScope* scope,
+                                         LocalVariable* var) {
+  ASSERT(scope != NULL);
+  ASSERT(var != NULL);
+  OS::Print("(%s%s '%s'",
+            var->is_final() ? "final " : "",
+            String::Handle(var->type().Name()).ToCString(),
+            var->name().ToCString());
+  if (var->owner() != scope) {
+    OS::Print(" alias");
+  }
+  if (var->HasIndex()) {
+    OS::Print(" @%d", var->index());
+    if (var->is_captured()) {
+      OS::Print(" ctx %d", var->owner()->context_level());
+    }
+  } else if (var->owner()->function_level() != 0) {
+    OS::Print(" lev %d", var->owner()->function_level());
+  }
+  OS::Print(" valid %" Pd "-%" Pd ")",
+            var->token_pos(),
+            scope->end_token_pos());
+}
+
+
 void AstPrinter::PrintLocalScope(const LocalScope* scope,
                                  int start_index) {
   ASSERT(scope != NULL);
   for (int i = start_index; i < scope->num_variables(); i++) {
     LocalVariable* var = scope->VariableAt(i);
-    OS::Print("(%s%s '%s'",
-              var->is_final() ? "final " : "",
-              String::Handle(var->type().Name()).ToCString(),
-              var->name().ToCString());
-    if (var->owner() != scope) {
-      OS::Print(" alias");
-    }
-    if (var->HasIndex()) {
-      OS::Print(" @%d", var->index());
-      if (var->is_captured()) {
-        OS::Print(" ctx %d", var->owner()->context_level());
-      }
-    } else if (var->owner()->function_level() != 0) {
-      OS::Print(" lev %d", var->owner()->function_level());
-    }
-    OS::Print(" valid %" Pd "-%" Pd ")",
-              var->token_pos(),
-              scope->end_token_pos());
+    PrintLocalScopeVariable(scope, var);
   }
   const LocalScope* child = scope->child();
   while (child != NULL) {
@@ -455,7 +463,7 @@
   int pos = 0;  // Current position of variable in scope.
   while (pos < num_params) {
     LocalVariable* param = scope->VariableAt(pos);
-    ASSERT(param->owner() == scope);
+    ASSERT(param->owner() == scope);  // No aliases should precede parameters.
     OS::Print("(param %s%s '%s'",
               param->is_final() ? "final " : "",
               String::Handle(param->type().Name()).ToCString(),
diff --git a/runtime/vm/ast_printer.h b/runtime/vm/ast_printer.h
index f64d979..8d5d31f 100644
--- a/runtime/vm/ast_printer.h
+++ b/runtime/vm/ast_printer.h
@@ -18,8 +18,6 @@
   static void PrintNode(AstNode* node);
   static void PrintFunctionScope(const ParsedFunction& parsed_function);
   static void PrintFunctionNodes(const ParsedFunction& parsed_function);
-  static void PrintLocalScope(const LocalScope* scope, int variable_index);
-
 
 #define DECLARE_VISITOR_FUNCTION(BaseName)                                     \
   virtual void Visit##BaseName##Node(BaseName##Node* node);
@@ -31,6 +29,10 @@
   AstPrinter();
   ~AstPrinter();
 
+  static void PrintLocalScopeVariable(const LocalScope* scope,
+                                      LocalVariable* var);
+  static void PrintLocalScope(const LocalScope* scope, int variable_index);
+
   void VisitGenericAstNode(AstNode* node);
   void VisitGenericLocalNode(AstNode* node, const LocalVariable& local);
   void VisitGenericFieldNode(AstNode* node, const Field& field);
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 2b01e90..cd2bd36 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -31,8 +31,6 @@
   }
 }
 
-// TODO(zra): Remove when tests are ready to enable.
-#if !defined(TARGET_ARCH_ARM64)
 
 //
 // Measure compile of all functions in dart core lib classes.
@@ -54,8 +52,6 @@
   benchmark->set_score(elapsed_time);
 }
 
-#endif
-
 
 //
 // Measure creation of core isolate from a snapshot.
@@ -91,9 +87,6 @@
 }
 
 
-// TODO(zra): Remove when tests are ready to enable.
-#if !defined(TARGET_ARCH_ARM64)
-
 //
 // Measure invocation of Dart API functions.
 //
@@ -197,8 +190,6 @@
   benchmark->set_score(elapsed_time);
 }
 
-#endif
-
 
 //
 // Measure time accessing internal and external strings.
@@ -241,9 +232,6 @@
 }
 
 
-// TODO(zra): Remove when tests are ready to enable.
-#if !defined(TARGET_ARCH_ARM64)
-
 //
 // Measure compile of all dart2js(compiler) functions.
 //
@@ -325,8 +313,6 @@
   free(script);
 }
 
-#endif
-
 
 //
 // Measure frame lookup during stack traversal.
@@ -438,7 +424,9 @@
 
   // Start an Isolate, load a script and create a full snapshot.
   uint8_t* buffer;
-  TestCase::LoadTestScript(kScriptChars, NULL);
+  // Need to load the script into the dart: core library due to
+  // the import of dart:_internal.
+  TestCase::LoadCoreTestScript(kScriptChars, NULL);
   Api::CheckIsolateState(Isolate::Current());
 
   // Write snapshot with object content.
@@ -467,7 +455,9 @@
 
   // Start an Isolate, load a script and create a full snapshot.
   uint8_t* buffer;
-  TestCase::LoadTestScript(kScriptChars, NULL);
+  // Need to load the script into the dart: core library due to
+  // the import of dart:_internal.
+  TestCase::LoadCoreTestScript(kScriptChars, NULL);
   Api::CheckIsolateState(Isolate::Current());
 
   // Write snapshot with object content.
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 9e90e41..5b28264 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -2146,7 +2146,7 @@
   // Now clone the fields from the mixin class. There should be no
   // existing fields in the mixin application class.
   ASSERT(Array::Handle(cls.fields()).Length() == 0);
-  Array& fields = Array::Handle(isolate, mixin_cls.fields());
+  const Array& fields = Array::Handle(isolate, mixin_cls.fields());
   Field& field = Field::Handle(isolate);
   const GrowableObjectArray& cloned_fields =
       GrowableObjectArray::Handle(isolate, GrowableObjectArray::New());
@@ -2158,8 +2158,7 @@
       cloned_fields.Add(field);
     }
   }
-  fields = Array::MakeArray(cloned_fields);
-  cls.SetFields(fields);
+  cls.AddFields(cloned_fields);
 
   if (FLAG_trace_class_finalization) {
     OS::Print("Done applying mixin members of %s to %s\n",
@@ -2286,10 +2285,11 @@
   if (cls.IsTopLevel()) {
     FinalizeClass(cls);
   } else {
-    // This class should not contain any fields or functions yet, because it has
-    // not been compiled yet. Since 'ResolveAndFinalizeMemberTypes(cls)' has not
-    // been called yet, unfinalized member types could choke the snapshotter.
-    ASSERT(Array::Handle(cls.fields()).Length() == 0);
+    // This class should not contain any functions or user-defined fields yet,
+    // because it has not been compiled yet. There may however be metadata
+    // fields because type parameters are parsed before the class body. Since
+    // 'ResolveAndFinalizeMemberTypes(cls)' has not been called yet, unfinalized
+    // member types could choke the snapshotter.
     ASSERT(Array::Handle(cls.functions()).Length() == 0);
   }
 }
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 3ecd229..6ea4fb8 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -32,16 +32,8 @@
     " native entries.");
 DEFINE_FLAG(int, max_subtype_cache_entries, 100,
     "Maximum number of subtype cache entries (number of checks cached).");
-
-// Disable optimizing compiler on ARM64.
-#if defined(TARGET_ARCH_ARM64)
-DEFINE_FLAG(int, optimization_counter_threshold, -1,
-    "Function's usage-counter value before it is optimized, -1 means never");
-#else
 DEFINE_FLAG(int, optimization_counter_threshold, 15000,
     "Function's usage-counter value before it is optimized, -1 means never");
-#endif
-
 DEFINE_FLAG(charp, optimization_filter, NULL, "Optimize only named function");
 DEFINE_FLAG(int, reoptimization_counter_threshold, 2000,
     "Counter threshold before a function gets reoptimized.");
@@ -64,6 +56,7 @@
 DECLARE_FLAG(int, deoptimization_counter_threshold);
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, report_usage_count);
+DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
 DEFINE_FLAG(bool, use_osr, true, "Use on-stack replacement.");
 DEFINE_FLAG(bool, trace_osr, false, "Trace attempts at on-stack replacement.");
@@ -105,8 +98,22 @@
 // Arg1: array type arguments, i.e. vector of 1 type, the element type.
 // Return value: newly allocated array of length arg0.
 DEFINE_RUNTIME_ENTRY(AllocateArray, 2) {
-  const Smi& length = Smi::CheckedHandle(arguments.ArgAt(0));
-  const Array& array = Array::Handle(Array::New(length.Value()));
+  const Instance& length = Instance::CheckedHandle(arguments.ArgAt(0));
+  if (!length.IsSmi()) {
+    const String& error = String::Handle(String::NewFormatted(
+        "Length must be an integer in the range [0..%" Pd "].",
+        Array::kMaxElements));
+    Exceptions::ThrowArgumentError(error);
+  }
+  const intptr_t len = Smi::Cast(length).Value();
+  if (len < 0) {
+    const String& error = String::Handle(String::NewFormatted(
+        "Length (%" Pd ") must be an integer in the range [0..%" Pd "].",
+        len, Array::kMaxElements));
+    Exceptions::ThrowArgumentError(error);
+  }
+
+  const Array& array = Array::Handle(Array::New(len));
   arguments.SetReturn(array);
   TypeArguments& element_type =
       TypeArguments::CheckedHandle(arguments.ArgAt(1));
@@ -795,8 +802,19 @@
 }
 
 
-// Handles inline cache misses by updating the IC data array of the call
-// site.
+static void JSWarning(const ICData& ic_data, const char* msg) {
+  DartFrameIterator iterator;
+  StackFrame* caller_frame = iterator.NextFrame();
+  ASSERT(caller_frame != NULL);
+  // Report warning only if not already reported at this location.
+  if (!ic_data.IssuedJSWarning()) {
+    ic_data.SetIssuedJSWarning();
+    Exceptions::JSWarning(caller_frame, "%s", msg);
+  }
+}
+
+
+// Handles inline cache misses by updating the IC data array of the call site.
 //   Arg0: Receiver object.
 //   Arg1: IC data object.
 //   Returns: target function with compiled code or null.
@@ -806,14 +824,24 @@
   const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(1));
   GrowableArray<const Instance*> args(1);
   args.Add(&receiver);
+  if (FLAG_warn_on_javascript_compatibility) {
+    if (receiver.IsDouble() &&
+        String::Handle(ic_data.target_name()).Equals(Symbols::toString())) {
+      const double value = Double::Cast(receiver).value();
+      if (floor(value) == value) {
+        JSWarning(ic_data,
+                  "string representation of an integral value of type "
+                  "'double' has no decimal mark and no fractional part");
+      }
+    }
+  }
   const Function& result =
       Function::Handle(InlineCacheMissHandler(args, ic_data));
   arguments.SetReturn(result);
 }
 
 
-// Handles inline cache misses by updating the IC data array of the call
-// site.
+// Handles inline cache misses by updating the IC data array of the call site.
 //   Arg0: Receiver object.
 //   Arg1: Argument after receiver.
 //   Arg2: IC data object.
@@ -832,8 +860,7 @@
 }
 
 
-// Handles inline cache misses by updating the IC data array of the call
-// site.
+// Handles inline cache misses by updating the IC data array of the call site.
 //   Arg0: Receiver object.
 //   Arg1: Argument after receiver.
 //   Arg2: Second argument after receiver.
diff --git a/runtime/vm/code_generator_test.cc b/runtime/vm/code_generator_test.cc
index b838224..89fcc20 100644
--- a/runtime/vm/code_generator_test.cc
+++ b/runtime/vm/code_generator_test.cc
@@ -58,7 +58,7 @@
   const int num_params = 1;
   LocalVariable* parameter = NewTestLocalVariable("parameter");
   LocalScope* local_scope = node_seq->scope();
-  local_scope->AddVariable(parameter);
+  local_scope->InsertParameterAt(0, parameter);
   ASSERT(local_scope->num_variables() == num_params);
   const Function& function = test->function();
   function.set_num_fixed_parameters(num_params);
@@ -88,8 +88,8 @@
   const int num_locals = 1;
   LocalVariable* sum = NewTestLocalVariable("sum");
   LocalScope* local_scope = node_seq->scope();
-  local_scope->AddVariable(param1);
-  local_scope->AddVariable(param2);
+  local_scope->InsertParameterAt(0, param1);
+  local_scope->InsertParameterAt(1, param2);
   local_scope->AddVariable(sum);
   ASSERT(local_scope->num_variables() == num_params + num_locals);
   const Function& function = test->function();
@@ -206,8 +206,8 @@
   const int num_opt_params = 1;
   const int num_params = num_fixed_params + num_opt_params;
   LocalScope* local_scope = node_seq->scope();
-  local_scope->AddVariable(NewTestLocalVariable("a"));
-  local_scope->AddVariable(NewTestLocalVariable("b"));
+  local_scope->InsertParameterAt(0, NewTestLocalVariable("a"));
+  local_scope->InsertParameterAt(1, NewTestLocalVariable("b"));
   ASSERT(local_scope->num_variables() == num_params);
   const Array& default_values = Array::ZoneHandle(Array::New(num_opt_params));
   default_values.SetAt(0, Smi::ZoneHandle(Smi::New(1)));  // b = 1.
@@ -377,11 +377,11 @@
   const int num_opt_params = 3;
   const int num_params = num_fixed_params + num_opt_params;
   LocalScope* local_scope = node_seq->scope();
-  local_scope->AddVariable(NewTestLocalVariable("a"));
-  local_scope->AddVariable(NewTestLocalVariable("b"));
-  local_scope->AddVariable(NewTestLocalVariable("c"));
-  local_scope->AddVariable(NewTestLocalVariable("d"));
-  local_scope->AddVariable(NewTestLocalVariable("e"));
+  local_scope->InsertParameterAt(0, NewTestLocalVariable("a"));
+  local_scope->InsertParameterAt(1, NewTestLocalVariable("b"));
+  local_scope->InsertParameterAt(2, NewTestLocalVariable("c"));
+  local_scope->InsertParameterAt(3, NewTestLocalVariable("d"));
+  local_scope->InsertParameterAt(4, NewTestLocalVariable("e"));
   ASSERT(local_scope->num_variables() == num_params);
   const Array& default_values = Array::ZoneHandle(Array::New(num_opt_params));
   default_values.SetAt(0, Smi::ZoneHandle(Smi::New(10)));
@@ -474,9 +474,9 @@
   SequenceNode* node_seq = test->node_sequence();
   const int num_params = 3;
   LocalScope* local_scope = node_seq->scope();
-  local_scope->AddVariable(NewTestLocalVariable("a"));
-  local_scope->AddVariable(NewTestLocalVariable("b"));
-  local_scope->AddVariable(NewTestLocalVariable("c"));
+  local_scope->InsertParameterAt(0, NewTestLocalVariable("a"));
+  local_scope->InsertParameterAt(1, NewTestLocalVariable("b"));
+  local_scope->InsertParameterAt(2, NewTestLocalVariable("c"));
   ASSERT(local_scope->num_variables() == num_params);
   const Function& function = test->function();
   function.set_is_native(true);
diff --git a/runtime/vm/code_patcher_arm64.cc b/runtime/vm/code_patcher_arm64.cc
index 6b76496..c2a0138 100644
--- a/runtime/vm/code_patcher_arm64.cc
+++ b/runtime/vm/code_patcher_arm64.cc
@@ -6,7 +6,7 @@
 #if defined(TARGET_ARCH_ARM64)
 
 #include "vm/code_patcher.h"
-
+#include "vm/cpu.h"
 #include "vm/instructions.h"
 #include "vm/object.h"
 
@@ -46,16 +46,43 @@
 }
 
 
+class PoolPointerCall : public ValueObject {
+ public:
+  explicit PoolPointerCall(uword pc) : end_(pc) {
+    // Last instruction: blr ip0.
+    ASSERT(*(reinterpret_cast<uint32_t*>(end_) - 1) == 0xd63f0200);
+    InstructionPattern::DecodeLoadWordFromPool(
+        end_ - Instr::kInstrSize, &reg_, &index_);
+  }
+
+  int32_t pp_offset() const {
+    return InstructionPattern::OffsetFromPPIndex(index_);
+  }
+
+  void set_pp_offset(int32_t offset) const {
+    InstructionPattern::EncodeLoadWordFromPoolFixed(
+      end_ - Instr::kInstrSize, offset);
+    CPU::FlushICache(end_ - kCallPatternSize, kCallPatternSize);
+  }
+
+ private:
+  static const int kCallPatternSize = 3 * Instr::kInstrSize;
+  uword end_;
+  Register reg_;
+  intptr_t index_;
+  DISALLOW_IMPLICIT_CONSTRUCTORS(PoolPointerCall);
+};
+
+
 int32_t CodePatcher::GetPoolOffsetAt(uword return_address) {
-  // TODO(zra): Needed for debugger.
-  UNIMPLEMENTED();
-  return 0;
+  PoolPointerCall call(return_address);
+  return call.pp_offset();
 }
 
 
 void CodePatcher::SetPoolOffsetAt(uword return_address, int32_t offset) {
-  // TODO(zra): Needed for debugger.
-  UNIMPLEMENTED();
+  PoolPointerCall call(return_address);
+  call.set_pp_offset(offset);
 }
 
 
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index ef002bb..2039190 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -59,6 +59,8 @@
     "Enable compiler verification assertions");
 
 DECLARE_FLAG(bool, trace_failed_optimization_attempts);
+DECLARE_FLAG(bool, warn_on_javascript_compatibility);
+DECLARE_FLAG(bool, warning_as_error);
 
 // Compile a function. Should call only if the function has not been compiled.
 //   Arg0: function object.
@@ -438,12 +440,8 @@
           }
         }
 
-        // Optimize (a << b) & c patterns, merge operations.
-        // Run after CSE in order to have more opportunity to merge
-        // instructions that have same inputs.
-        optimizer.TryOptimizePatterns();
-        DEBUG_ASSERT(flow_graph->VerifyUseLists());
-
+        // Run loop-invariant code motion right after load elimination since it
+        // depends on the numbering of loads from the previous load-elimination.
         if (FLAG_loop_invariant_code_motion) {
           LICM licm(flow_graph);
           licm.Optimize();
@@ -451,6 +449,14 @@
         }
         flow_graph->RemoveRedefinitions();
 
+        // Optimize (a << b) & c patterns, merge operations.
+        // Run after CSE in order to have more opportunity to merge
+        // instructions that have same inputs.
+        optimizer.TryOptimizePatterns();
+        DEBUG_ASSERT(flow_graph->VerifyUseLists());
+
+        DeadStoreElimination::Optimize(flow_graph);
+
         if (FLAG_range_analysis) {
           // Propagate types after store-load-forwarding. Some phis may have
           // become smi phis that can be processed by range analysis.
@@ -485,6 +491,8 @@
         // amount of materializations it has to perform.
         optimizer.EliminateEnvironments();
 
+        DeadCodeElimination::EliminateDeadPhis(flow_graph);
+
         // Attempt to sink allocations of temporary non-escaping objects to
         // the deoptimization path.
         AllocationSinking* sinking = NULL;
@@ -592,10 +600,11 @@
       is_compiled = true;
       done = true;
     } else {
-      // We bailed out.
+      // We bailed out or we encountered an error.
+      const Error& error = Error::Handle(
+          isolate->object_store()->sticky_error());
 
-      if (isolate->object_store()->sticky_error() ==
-          Object::branch_offset_error().raw()) {
+      if (error.raw() == Object::branch_offset_error().raw()) {
         // Compilation failed due to an out of range branch offset in the
         // assembler. We try again (done = false) with far branches enabled.
         done = false;
@@ -606,15 +615,19 @@
         // try again (done = true), and indicate that we did not finish
         // compiling (is_compiled = false).
         if (FLAG_trace_bailout) {
-          const Error& bailout_error = Error::Handle(
-              isolate->object_store()->sticky_error());
-          OS::Print("%s\n", bailout_error.ToErrorCString());
+          OS::Print("%s\n", error.ToErrorCString());
         }
         done = true;
-        ASSERT(optimized);
+        ASSERT(optimized ||
+               (FLAG_warn_on_javascript_compatibility &&
+                FLAG_warning_as_error));
       }
 
-      isolate->object_store()->clear_sticky_error();
+      // Clear the error if it was not a real error, but just a bailout.
+      if (error.IsLanguageError() &&
+          (LanguageError::Cast(error).kind() == LanguageError::kBailout)) {
+        isolate->object_store()->clear_sticky_error();
+      }
       is_compiled = false;
     }
     // Reset global isolate state.
@@ -787,19 +800,29 @@
 
     const bool success =
         CompileParsedFunctionHelper(parsed_function, optimized, osr_id);
-    if (optimized && !success) {
-      // Optimizer bailed out. Disable optimizations and to never try again.
-      if (FLAG_trace_compiler) {
-        OS::Print("--> disabling optimizations for '%s'\n",
-                  function.ToFullyQualifiedCString());
-      } else if (FLAG_trace_failed_optimization_attempts) {
-        OS::Print("Cannot optimize: %s\n", function.ToFullyQualifiedCString());
+    if (!success) {
+      if (optimized) {
+        // Optimizer bailed out. Disable optimizations and to never try again.
+        if (FLAG_trace_compiler) {
+          OS::Print("--> disabling optimizations for '%s'\n",
+                    function.ToFullyQualifiedCString());
+        } else if (FLAG_trace_failed_optimization_attempts) {
+          OS::Print("Cannot optimize: %s\n",
+                    function.ToFullyQualifiedCString());
+        }
+        function.SetIsOptimizable(false);
+        return Error::null();
       }
-      function.SetIsOptimizable(false);
-      return Error::null();
+      // So far, the only possible real error is a JS warning reported as error.
+      ASSERT(FLAG_warn_on_javascript_compatibility && FLAG_warning_as_error);
+      Error& error = Error::Handle();
+      // We got an error during compilation.
+      error = isolate->object_store()->sticky_error();
+      ASSERT(!error.IsNull());
+      isolate->object_store()->clear_sticky_error();
+      return error.raw();
     }
 
-    ASSERT(success);
     per_compile_timer.Stop();
 
     if (FLAG_trace_compiler) {
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index a1656cb..b276707 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -112,7 +112,7 @@
   D13 = 13,
   D14 = 14,
   D15 = 15,
-#ifdef VFPv3_D16
+#if defined(VFPv3_D16)
   kNumberOfDRegisters = 16,
   // Leaving these defined, but marking them as kNoDRegister to avoid polluting
   // other parts of the code with #ifdef's. Instead, query kNumberOfDRegisters
@@ -166,7 +166,7 @@
   Q5  =  5,
   Q6  =  6,
   Q7  =  7,
-#ifdef VFPv3_D16
+#if defined(VFPv3_D16)
   kNumberOfQRegisters = 8,
   Q8  = kNoQRegister,
   Q9  = kNoQRegister,
@@ -223,6 +223,7 @@
 
 // Architecture independent aliases.
 typedef QRegister FpuRegister;
+
 const FpuRegister FpuTMP = QTMP;
 const int kNumberOfFpuRegisters = kNumberOfQRegisters;
 const FpuRegister kNoFpuRegister = kNoQRegister;
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index ae55829..59de4ad 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -219,6 +219,7 @@
   kDoubleWord,
   kSWord,
   kDWord,
+  kQWord,
 };
 
 static inline int Log2OperandSizeBytes(OperandSize os) {
@@ -236,6 +237,8 @@
     case kDoubleWord:
     case kDWord:
       return 3;
+    case kQWord:
+      return 4;
     default:
       UNREACHABLE();
       break;
@@ -243,6 +246,27 @@
   return -1;
 }
 
+static inline bool IsSignedOperand(OperandSize os) {
+  switch (os) {
+    case kByte:
+    case kHalfword:
+    case kWord:
+      return true;
+    case kUnsignedByte:
+    case kUnsignedHalfword:
+    case kUnsignedWord:
+    case kDoubleWord:
+    case kSWord:
+    case kDWord:
+    case kQWord:
+      return false;
+    default:
+      UNREACHABLE();
+      break;
+  }
+  return false;
+}
+
 // Opcodes from C3
 // C3.1.
 enum MainOp {
@@ -337,8 +361,11 @@
   LoadStoreRegFixed = LoadStoreFixed | B29 | B28,
   STR = LoadStoreRegFixed,
   LDR = LoadStoreRegFixed | B22,
+  LDRS = LoadStoreRegFixed | B23,
   FSTR = STR | B26,
   FLDR = LDR | B26,
+  FSTRQ = STR | B26 | B23,
+  FLDRQ = LDR | B26 | B23,
 };
 
 // C3.4.1
@@ -439,6 +466,11 @@
   FPOneSourceMask = 0x5f207c00,
   FPOneSourceFixed = FPFixed | B21 | B14,
   FMOVDD = FPOneSourceFixed | B22,
+  FABSD = FPOneSourceFixed | B22 | B15,
+  FNEGD = FPOneSourceFixed | B22 | B16,
+  FSQRTD = FPOneSourceFixed | B22 | B16 | B15,
+  FCVTDS = FPOneSourceFixed | B15 | B17,
+  FCVTSD = FPOneSourceFixed | B22 | B17,
 };
 
 // C3.6.26
@@ -578,6 +610,7 @@
   kImm9Bits = 9,
   kImm12Shift = 10,
   kImm12Bits = 12,
+  kImm12Mask = 0xfff << kImm12Shift,
   kImm12ShiftShift = 22,
   kImm12ShiftBits = 2,
   kImm14Shift = 5,
@@ -590,9 +623,11 @@
   kImm19Mask = 0x7ffff << kImm19Shift,
   kImm26Shift = 0,
   kImm26Bits = 26,
+  kImm26Mask = 0x03ffffff << kImm26Shift,
 
   kCondShift = 0,
   kCondBits = 4,
+  kCondMask = 0xf << kCondShift,
 
   kSelCondShift = 12,
   kSelCondBits = 4,
@@ -715,6 +750,11 @@
         (static_cast<int32_t>(rn) << kRnShift));
   }
 
+  inline void SetImm12Bits(int32_t orig, int32_t imm12) {
+    ASSERT((imm12 & 0xfffff000) == 0);
+    SetInstructionBits((orig & ~kImm12Mask) | (imm12 << kImm12Shift));
+  }
+
   inline int NField() const { return Bit(22); }
   inline int SField() const { return Bit(kSShift); }
   inline int SFField() const { return Bit(kSFShift); }
diff --git a/runtime/vm/cpu_arm.cc b/runtime/vm/cpu_arm.cc
index a7ad919..a7a4c5e 100644
--- a/runtime/vm/cpu_arm.cc
+++ b/runtime/vm/cpu_arm.cc
@@ -3,12 +3,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-
 #if defined(TARGET_ARCH_ARM)
 
+#include "vm/assembler.h"
 #include "vm/cpu.h"
 #include "vm/cpuinfo.h"
+#include "vm/heap.h"
+#include "vm/isolate.h"
+#include "vm/object.h"
 #include "vm/simulator.h"
+#include "vm/thread.h"
 
 #if defined(HOST_ARCH_ARM)
 #include <sys/syscall.h>  /* NOLINT */
@@ -17,6 +21,15 @@
 
 namespace dart {
 
+DEFINE_FLAG(bool, use_vfp, true, "Use vfp instructions if supported");
+DEFINE_FLAG(bool, use_neon, true, "Use neon instructions if supported");
+#if !defined(HOST_ARCH_ARM)
+DEFINE_FLAG(bool, sim_use_armv7, true, "Use all ARMv7 instructions");
+DEFINE_FLAG(bool, sim_use_armv5te, false, "Restrict to ARMv5TE instructions");
+DEFINE_FLAG(bool, sim_use_armv6, false, "Restrict to ARMv6 instructions");
+DEFINE_FLAG(bool, sim_use_hardfp, false, "Use the softfp ABI.");
+#endif
+
 void CPU::FlushICache(uword start, uword size) {
 #if defined(HOST_ARCH_ARM)
   // Nothing to do. Flushing no instructions.
@@ -52,7 +65,9 @@
 
 
 bool HostCPUFeatures::integer_division_supported_ = false;
+bool HostCPUFeatures::vfp_supported_ = false;
 bool HostCPUFeatures::neon_supported_ = false;
+bool HostCPUFeatures::hardfp_supported_ = false;
 const char* HostCPUFeatures::hardware_ = NULL;
 ARMVersion HostCPUFeatures::arm_version_ = ARMvUnknown;
 #if defined(DEBUG)
@@ -64,18 +79,27 @@
 void HostCPUFeatures::InitOnce() {
   CpuInfo::InitOnce();
   hardware_ = CpuInfo::GetCpuModel();
-  // Check for ARMv6 or ARMv7. It can be in either the Processor or
+
+  // Has floating point unit.
+  vfp_supported_ = CpuInfo::FieldContains(kCpuInfoFeatures, "vfp") &&
+                   FLAG_use_vfp;
+
+  // Check for ARMv5, ARMv6 or ARMv7. It can be in either the Processor or
   // Model information fields.
-  if (CpuInfo::FieldContains(kCpuInfoProcessor, "ARMv6") ||
-      CpuInfo::FieldContains(kCpuInfoModel, "ARMv6")) {
+  if (CpuInfo::FieldContains(kCpuInfoProcessor, "ARM926EJ-S") ||
+      CpuInfo::FieldContains(kCpuInfoModel, "ARM926EJ-S")) {
+    // Lego Mindstorm EV3.
+    arm_version_ = ARMv5TE;
+  } else if (CpuInfo::FieldContains(kCpuInfoProcessor, "ARMv6") ||
+             CpuInfo::FieldContains(kCpuInfoModel, "ARMv6")) {
+    // Raspberry Pi, etc.
     arm_version_ = ARMv6;
   } else {
     ASSERT(CpuInfo::FieldContains(kCpuInfoProcessor, "ARMv7") ||
            CpuInfo::FieldContains(kCpuInfoModel, "ARMv7"));
     arm_version_ = ARMv7;
   }
-  // Has floating point unit.
-  ASSERT(CpuInfo::FieldContains(kCpuInfoFeatures, "vfp"));
+
   // Has integer division.
   bool is_krait = CpuInfo::FieldContains(kCpuInfoHardware, "QCT APQ8064");
   if (is_krait) {
@@ -85,7 +109,17 @@
     integer_division_supported_ =
         CpuInfo::FieldContains(kCpuInfoFeatures, "idiva");
   }
-  neon_supported_ = CpuInfo::FieldContains(kCpuInfoFeatures, "neon");
+  neon_supported_ = CpuInfo::FieldContains(kCpuInfoFeatures, "neon") &&
+                    FLAG_use_vfp && FLAG_use_neon;
+
+  // Use the cross-compiler's predefined macros to determine whether we should
+  // use the hard or soft float ABI.
+#if defined(__ARM_PCS_VFP)
+  hardfp_supported_ = true;
+#else
+  hardfp_supported_ = false;
+#endif
+
 #if defined(DEBUG)
   initialized_ = true;
 #endif
@@ -108,9 +142,19 @@
 void HostCPUFeatures::InitOnce() {
   CpuInfo::InitOnce();
   hardware_ = CpuInfo::GetCpuModel();
-  integer_division_supported_ = true;
-  neon_supported_ = true;
-  arm_version_ = ARMv7;
+  vfp_supported_ = FLAG_use_vfp;
+  neon_supported_ = FLAG_use_vfp && FLAG_use_neon;
+  hardfp_supported_ = FLAG_sim_use_hardfp;
+  if (FLAG_sim_use_armv5te) {
+    arm_version_ = ARMv5TE;
+    integer_division_supported_ = false;
+  } else if (FLAG_sim_use_armv6) {
+    arm_version_ = ARMv6;
+    integer_division_supported_ = true;
+  } else if (FLAG_sim_use_armv7) {
+    arm_version_ = ARMv7;
+    integer_division_supported_ = true;
+  }
 #if defined(DEBUG)
   initialized_ = true;
 #endif
diff --git a/runtime/vm/cpu_arm.h b/runtime/vm/cpu_arm.h
index 92be988..6bc301e 100644
--- a/runtime/vm/cpu_arm.h
+++ b/runtime/vm/cpu_arm.h
@@ -19,6 +19,7 @@
 // they may be altered for testing.
 
 enum ARMVersion {
+  ARMv5TE,
   ARMv6,
   ARMv7,
   ARMvUnknown,
@@ -36,10 +37,18 @@
     DEBUG_ASSERT(initialized_);
     return integer_division_supported_;
   }
+  static bool vfp_supported() {
+    DEBUG_ASSERT(initialized_);
+    return vfp_supported_;
+  }
   static bool neon_supported() {
     DEBUG_ASSERT(initialized_);
     return neon_supported_;
   }
+  static bool hardfp_supported() {
+    DEBUG_ASSERT(initialized_);
+    return hardfp_supported_;
+  }
   static ARMVersion arm_version() {
     DEBUG_ASSERT(initialized_);
     return arm_version_;
@@ -50,6 +59,10 @@
     DEBUG_ASSERT(initialized_);
     integer_division_supported_ = supported;
   }
+  static void set_vfp_supported(bool supported) {
+    DEBUG_ASSERT(initialized_);
+    vfp_supported_ = supported;
+  }
   static void set_neon_supported(bool supported) {
     DEBUG_ASSERT(initialized_);
     neon_supported_ = supported;
@@ -63,7 +76,9 @@
  private:
   static const char* hardware_;
   static bool integer_division_supported_;
+  static bool vfp_supported_;
   static bool neon_supported_;
+  static bool hardfp_supported_;
   static ARMVersion arm_version_;
 #if defined(DEBUG)
   static bool initialized_;
@@ -84,9 +99,15 @@
   static bool integer_division_supported() {
     return HostCPUFeatures::integer_division_supported();
   }
+  static bool vfp_supported() {
+    return HostCPUFeatures::vfp_supported();
+  }
   static bool neon_supported() {
     return HostCPUFeatures::neon_supported();
   }
+  static bool hardfp_supported() {
+    return HostCPUFeatures::hardfp_supported();
+  }
   static const char* hardware() {
     return HostCPUFeatures::hardware();
   }
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 76110c1..96da554 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1275,10 +1275,10 @@
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE_SCOPE(isolate);
   CHECK_CALLBACK_STATE(isolate);
+
+  ASSERT(isolate->GetAndClearResumeRequest() == false);
   isolate->message_handler()->HandleOOBMessages();
-  // TODO(turnidge): The return value here should indicate whether an
-  // OOB message should cause the program to resume.  Implement.
-  return false;
+  return isolate->GetAndClearResumeRequest();
 }
 
 
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 41f893b..f0325b6 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -49,7 +49,7 @@
   EXPECT_STREQ(
       "Unhandled exception:\n"
       "Exception: bad news\n"
-      "#0      testMain (dart:test-lib:2:3)",
+      "#0      testMain (test-lib:2:3)",
       Dart_GetError(exception));
 
   EXPECT(Dart_IsError(Dart_ErrorGetException(instance)));
@@ -97,7 +97,7 @@
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("bar", cstr);
   Dart_StringToCString(script_url, &cstr);
-  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_STREQ("test-lib", cstr);
   EXPECT_EQ(1, line_number);
   EXPECT_EQ(10, column_number);
 
@@ -109,7 +109,7 @@
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("foo", cstr);
   Dart_StringToCString(script_url, &cstr);
-  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_STREQ("test-lib", cstr);
   EXPECT_EQ(2, line_number);
   EXPECT_EQ(13, column_number);
 
@@ -121,7 +121,7 @@
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("testMain", cstr);
   Dart_StringToCString(script_url, &cstr);
-  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_STREQ("test-lib", cstr);
   EXPECT_EQ(3, line_number);
   EXPECT_EQ(18, column_number);
 
@@ -171,7 +171,7 @@
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("foo", cstr);
   Dart_StringToCString(script_url, &cstr);
-  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_STREQ("test-lib", cstr);
   EXPECT_EQ(1, line_number);
   EXPECT_EQ(20, column_number);
 
@@ -187,7 +187,7 @@
     Dart_StringToCString(function_name, &cstr);
     EXPECT_STREQ("foo", cstr);
     Dart_StringToCString(script_url, &cstr);
-    EXPECT_STREQ("dart:test-lib", cstr);
+    EXPECT_STREQ("test-lib", cstr);
     EXPECT_EQ(1, line_number);
     EXPECT_EQ(43, column_number);
   }
@@ -201,7 +201,7 @@
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("testMain", cstr);
   Dart_StringToCString(script_url, &cstr);
-  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_STREQ("test-lib", cstr);
   EXPECT_EQ(2, line_number);
   EXPECT_EQ(18, column_number);
 
@@ -250,7 +250,7 @@
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("C.foo", cstr);
   Dart_StringToCString(script_url, &cstr);
-  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_STREQ("test-lib", cstr);
   EXPECT_EQ(2, line_number);
   EXPECT_EQ(3, column_number);
 
@@ -311,7 +311,7 @@
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("inspectStack", cstr);
   Dart_StringToCString(script_url, &cstr);
-  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_STREQ("test-lib", cstr);
   EXPECT_EQ(1, line_number);
   EXPECT_EQ(47, column_number);
 
@@ -324,7 +324,7 @@
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("foo", cstr);
   Dart_StringToCString(script_url, &cstr);
-  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_STREQ("test-lib", cstr);
   EXPECT_EQ(2, line_number);
   EXPECT_EQ(32, column_number);
 
@@ -340,7 +340,7 @@
     Dart_StringToCString(function_name, &cstr);
     EXPECT_STREQ("foo", cstr);
     Dart_StringToCString(script_url, &cstr);
-    EXPECT_STREQ("dart:test-lib", cstr);
+    EXPECT_STREQ("test-lib", cstr);
     EXPECT_EQ(2, line_number);
     EXPECT_EQ(40, column_number);
   }
@@ -354,7 +354,7 @@
   Dart_StringToCString(function_name, &cstr);
   EXPECT_STREQ("testMain", cstr);
   Dart_StringToCString(script_url, &cstr);
-  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_STREQ("test-lib", cstr);
   EXPECT_EQ(3, line_number);
   EXPECT_EQ(18, column_number);
 
@@ -5029,7 +5029,8 @@
   Dart_Handle result;
   Dart_Handle instance;
   // Create a test library and Load up a test script in it.
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  // The test library must have a dart: url so it can import dart:_internal.
+  Dart_Handle lib = TestCase::LoadCoreTestScript(kScriptChars, NULL);
   Dart_Handle type = Dart_GetType(lib, NewString("TestClass"), 0, NULL);
   EXPECT_VALID(type);
 
@@ -5435,7 +5436,7 @@
   result = Dart_LoadScript(url, source, 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("Dart_LoadScript: "
-               "A script has already been loaded from 'dart:test-lib'.",
+               "A script has already been loaded from 'test-lib'.",
                Dart_GetError(result));
 }
 
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index e66f964..f8fd318 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -99,10 +99,9 @@
 // TODO(hausner): Get rid of library parameter. A source breakpoint location
 // does not imply a library, since the same source code can be included
 // in more than one library, e.g. the text location of mixin functions.
-void SourceBreakpoint::GetCodeLocation(
-    Library* lib,
-    Script* script,
-    intptr_t* pos) {
+void SourceBreakpoint::GetCodeLocation(Library* lib,
+                                       Script* script,
+                                       intptr_t* pos) {
   *script = this->script();
   *pos = token_pos_;
   if (IsResolved()) {
@@ -192,12 +191,12 @@
 }
 
 
-void Debugger::SignalIsolateEvent(EventType type) {
+void Debugger::SignalIsolateEvent(DebuggerEvent::EventType type) {
   if (event_handler_ != NULL) {
     DebuggerEvent event(type);
-    event.isolate_id = isolate_id_;
-    ASSERT(event.isolate_id != ILLEGAL_ISOLATE_ID);
-    if (type == kIsolateInterrupted) {
+    event.set_isolate_id(isolate_id_);
+    ASSERT(event.isolate_id() != ILLEGAL_ISOLATE_ID);
+    if (type == DebuggerEvent::kIsolateInterrupted) {
       DebuggerStackTrace* trace = CollectStackTrace();
       ASSERT(trace->Length() > 0);
       ASSERT(stack_trace_ == NULL);
@@ -217,7 +216,7 @@
   if (event_handler_ != NULL) {
     Debugger* debugger = Isolate::Current()->debugger();
     ASSERT(debugger != NULL);
-    debugger->SignalIsolateEvent(kIsolateInterrupted);
+    debugger->SignalIsolateEvent(DebuggerEvent::kIsolateInterrupted);
   }
 }
 
@@ -487,6 +486,43 @@
 }
 
 
+const char* DebuggerEvent::EventTypeToCString(EventType type) {
+  switch (type) {
+    case kBreakpointReached:
+      return "BreakpointReached";
+    case kBreakpointResolved:
+      return "BreakpointResolved";
+    case kExceptionThrown:
+      return "ExceptionThrown";
+    case kIsolateCreated:
+      return "IsolateCreated";
+    case kIsolateShutdown:
+      return "IsolateShutdown";
+    case kIsolateInterrupted:
+      return "IsolateInterrupted";
+    default:
+      UNREACHABLE();
+      return "Unknown";
+  }
+}
+
+
+void DebuggerEvent::PrintJSON(JSONStream* js) const {
+  JSONObject jsobj(js);
+  jsobj.AddProperty("type", "DebuggerEvent");
+  // TODO(turnidge): Drop the 'id' for things like DebuggerEvent.
+  jsobj.AddProperty("id", "");
+  // TODO(turnidge): Add 'isolate'.
+  jsobj.AddProperty("eventType", EventTypeToCString(type()));
+  if (type() == kBreakpointResolved || type() == kBreakpointReached) {
+    jsobj.AddProperty("breakpoint", breakpoint());
+  }
+  if (type() == kExceptionThrown) {
+    jsobj.AddProperty("exception", *(exception()));
+  }
+}
+
+
 ActivationFrame* DebuggerStackTrace::GetHandlerFrame(
     const Instance& exc_obj) const {
   ExceptionHandlers& handlers = ExceptionHandlers::Handle();
@@ -1030,7 +1066,7 @@
     delete bpt;
   }
   // Signal isolate shutdown event.
-  SignalIsolateEvent(Debugger::kIsolateShutdown);
+  SignalIsolateEvent(DebuggerEvent::kIsolateShutdown);
 }
 
 
@@ -1176,8 +1212,8 @@
 
 void Debugger::SignalBpResolved(SourceBreakpoint* bpt) {
   if (event_handler_ != NULL) {
-    DebuggerEvent event(kBreakpointResolved);
-    event.breakpoint = bpt;
+    DebuggerEvent event(DebuggerEvent::kBreakpointResolved);
+    event.set_breakpoint(bpt);
     (*event_handler_)(&event);
   }
 }
@@ -1480,8 +1516,8 @@
   if (!ShouldPauseOnException(stack_trace, exc)) {
     return;
   }
-  DebuggerEvent event(kExceptionThrown);
-  event.exception = &exc;
+  DebuggerEvent event(DebuggerEvent::kExceptionThrown);
+  event.set_exception(&exc);
   ASSERT(stack_trace_ == NULL);
   stack_trace_ = stack_trace;
   Pause(&event);
@@ -2166,6 +2202,7 @@
 }
 
 
+// static
 bool Debugger::IsDebuggable(const Function& func) {
   if (!IsDebuggableFunctionKind(func)) {
     return false;
@@ -2183,9 +2220,9 @@
   isolate_->set_single_step(false);
   ASSERT(!IsPaused());
   ASSERT(obj_cache_ == NULL);
-  DebuggerEvent event(kBreakpointReached);
-  event.top_frame = top_frame;
-  event.breakpoint = bpt;
+  DebuggerEvent event(DebuggerEvent::kBreakpointReached);
+  event.set_top_frame(top_frame);
+  event.set_breakpoint(bpt);
   Pause(&event);
 }
 
@@ -2297,7 +2334,7 @@
   initialized_ = true;
 
   // Signal isolate creation event.
-  SignalIsolateEvent(Debugger::kIsolateCreated);
+  SignalIsolateEvent(DebuggerEvent::kIsolateCreated);
 }
 
 
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 72a1218..dc176a8 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -37,7 +37,7 @@
   intptr_t end_token_pos() const { return end_token_pos_; }
   intptr_t id() const { return id_; }
 
-  RawScript* script() { return script_; }
+  RawScript* script() const { return script_; }
   RawString* SourceUrl();
   intptr_t LineNumber();
 
@@ -46,7 +46,7 @@
   void Enable();
   void Disable();
   bool IsEnabled() const { return is_enabled_; }
-  bool IsResolved() { return is_resolved_; }
+  bool IsResolved() const { return is_resolved_; }
 
   void PrintJSON(JSONStream* stream);
 
@@ -262,7 +262,9 @@
                                DebuggerStackTrace* stack);
 
 
-class Debugger {
+// TODO(turnidge): At some point we may want to turn this into a class
+// hierarchy.
+class DebuggerEvent {
  public:
   enum EventType {
     kBreakpointReached = 1,
@@ -272,24 +274,71 @@
     kIsolateShutdown = 5,
     kIsolateInterrupted = 6,
   };
-  struct DebuggerEvent {
-    explicit DebuggerEvent(EventType event_type)
-        : type(event_type) {
-      top_frame = NULL;
-      breakpoint = NULL;
-      exception = NULL;
-      isolate_id = 0;
-    }
-    EventType type;
-    // type == kBreakpointReached.
-    ActivationFrame* top_frame;
-    // type == kBreakpointResolved, kBreakpointReached.
-    SourceBreakpoint* breakpoint;
-    // type == kExceptionThrown.
-    const Object* exception;
-    // type == kIsolate(Created|Shutdown|Interrupted).
-    Dart_Port isolate_id;
-  };
+
+  explicit DebuggerEvent(EventType event_type)
+      : type_(event_type),
+        top_frame_(NULL),
+        breakpoint_(NULL),
+        exception_(NULL),
+        isolate_id_(0) {}
+
+  EventType type() const { return type_; }
+
+  ActivationFrame* top_frame() const {
+    ASSERT(type_ == kBreakpointReached);
+    return top_frame_;
+  }
+  void set_top_frame(ActivationFrame* frame) {
+    ASSERT(type_ == kBreakpointReached);
+    top_frame_ = frame;
+  }
+
+  SourceBreakpoint* breakpoint() const {
+    ASSERT(type_ == kBreakpointReached || type_ == kBreakpointResolved);
+    return breakpoint_;
+  }
+  void set_breakpoint(SourceBreakpoint* bpt) {
+    ASSERT(type_ == kBreakpointReached || type_ == kBreakpointResolved);
+    breakpoint_ = bpt;
+  }
+
+  const Object* exception() const {
+    ASSERT(type_ == kExceptionThrown);
+    return exception_;
+  }
+  void set_exception(const Object* exception) {
+    ASSERT(type_ == kExceptionThrown);
+    exception_ = exception;
+  }
+
+  Dart_Port isolate_id() const {
+    ASSERT(type_ == kIsolateCreated ||
+           type_ == kIsolateShutdown ||
+           type_ == kIsolateInterrupted);
+    return isolate_id_;
+  }
+  void set_isolate_id(Dart_Port isolate_id) {
+    ASSERT(type_ == kIsolateCreated ||
+           type_ == kIsolateShutdown ||
+           type_ == kIsolateInterrupted);
+    isolate_id_ = isolate_id;
+  }
+
+  void PrintJSON(JSONStream* js) const;
+
+  static const char* EventTypeToCString(EventType type);
+
+ private:
+  EventType type_;
+  ActivationFrame* top_frame_;
+  SourceBreakpoint* breakpoint_;
+  const Object* exception_;
+  Dart_Port isolate_id_;
+};
+
+
+class Debugger {
+ public:
   typedef void EventHandler(DebuggerEvent *event);
 
   Debugger();
@@ -381,7 +430,7 @@
   void DebuggerStepCallback();
 
   void SignalExceptionThrown(const Instance& exc);
-  void SignalIsolateEvent(EventType type);
+  void SignalIsolateEvent(DebuggerEvent::EventType type);
   static void SignalIsolateInterrupted();
 
   uword GetPatchedStubAddress(uword breakpoint_address);
diff --git a/runtime/vm/debugger_api_impl.cc b/runtime/vm/debugger_api_impl.cc
index 2a82818..cabf9e7 100644
--- a/runtime/vm/debugger_api_impl.cc
+++ b/runtime/vm/debugger_api_impl.cc
@@ -109,34 +109,34 @@
 static Dart_BreakpointHandler* legacy_bp_handler = NULL;
 
 
-static void DebuggerEventHandler(Debugger::DebuggerEvent* event) {
+static void DebuggerEventHandler(DebuggerEvent* event) {
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate != NULL);
   ASSERT(isolate->debugger() != NULL);
   Dart_EnterScope();
   Dart_IsolateId isolate_id = isolate->debugger()->GetIsolateId();
-  if (event->type == Debugger::kBreakpointReached) {
+  if (event->type() == DebuggerEvent::kBreakpointReached) {
     if (legacy_bp_handler != NULL) {
       Dart_StackTrace stack_trace =
           reinterpret_cast<Dart_StackTrace>(isolate->debugger()->StackTrace());
       (*legacy_bp_handler)(isolate_id, NULL, stack_trace);
     } else if (paused_event_handler != NULL) {
       Dart_CodeLocation location;
-      ActivationFrame* top_frame = event->top_frame;
+      ActivationFrame* top_frame = event->top_frame();
       location.script_url = Api::NewHandle(isolate, top_frame->SourceUrl());
       const Library& lib = Library::Handle(top_frame->Library());
       location.library_id = lib.index();
       location.token_pos = top_frame->TokenPos();
       intptr_t bp_id = 0;
-      if (event->breakpoint != NULL) {
-        ASSERT(event->breakpoint->id() != ILLEGAL_BREAKPOINT_ID);
-        bp_id = event->breakpoint->id();
+      if (event->breakpoint() != NULL) {
+        ASSERT(event->breakpoint()->id() != ILLEGAL_BREAKPOINT_ID);
+        bp_id = event->breakpoint()->id();
       }
       (*paused_event_handler)(isolate_id, bp_id, location);
     }
-  } else if (event->type == Debugger::kBreakpointResolved) {
+  } else if (event->type() == DebuggerEvent::kBreakpointResolved) {
     if (bp_resolved_handler != NULL) {
-      SourceBreakpoint* bpt = event->breakpoint;
+      SourceBreakpoint* bpt = event->breakpoint();
       ASSERT(bpt != NULL);
       Dart_CodeLocation location;
       Library& library = Library::Handle(isolate);
@@ -148,24 +148,25 @@
       location.token_pos = token_pos;
       (*bp_resolved_handler)(isolate_id, bpt->id(), location);
     }
-  } else if (event->type == Debugger::kExceptionThrown) {
+  } else if (event->type() == DebuggerEvent::kExceptionThrown) {
     if (exc_thrown_handler != NULL) {
-      Dart_Handle exception = Api::NewHandle(isolate, event->exception->raw());
+      Dart_Handle exception =
+          Api::NewHandle(isolate, event->exception()->raw());
       Dart_StackTrace trace =
       reinterpret_cast<Dart_StackTrace>(isolate->debugger()->StackTrace());
       (*exc_thrown_handler)(isolate_id, exception, trace);
     }
-  } else if (event->type == Debugger::kIsolateCreated) {
+  } else if (event->type() == DebuggerEvent::kIsolateCreated) {
     if (isolate_event_handler != NULL) {
-      (*isolate_event_handler)(event->isolate_id, kCreated);
+      (*isolate_event_handler)(event->isolate_id(), kCreated);
     }
-  } else if (event->type == Debugger::kIsolateInterrupted) {
+  } else if (event->type() == DebuggerEvent::kIsolateInterrupted) {
     if (isolate_event_handler != NULL) {
-      (*isolate_event_handler)(event->isolate_id, kInterrupted);
+      (*isolate_event_handler)(event->isolate_id(), kInterrupted);
     }
-  } else if (event->type == Debugger::kIsolateShutdown) {
+  } else if (event->type() == DebuggerEvent::kIsolateShutdown) {
     if (isolate_event_handler != NULL) {
-      (*isolate_event_handler)(event->isolate_id, kShutdown);
+      (*isolate_event_handler)(event->isolate_id(), kShutdown);
     }
   } else {
     UNIMPLEMENTED();
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index 6c7fa81..16f73f7 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -2,10 +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(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "include/dart_debugger_api.h"
 #include "include/dart_mirrors_api.h"
 #include "platform/assert.h"
@@ -1932,7 +1928,7 @@
   EXPECT(Dart_IsString(sig));
   EXPECT_STREQ("() => void", ToCString(sig));
   EXPECT(Dart_IsString(loc.script_url));
-  EXPECT_STREQ("dart:test-lib", ToCString(loc.script_url));
+  EXPECT_STREQ("test-lib", ToCString(loc.script_url));
   EXPECT_EQ(0, loc.token_pos);
   EXPECT(loc.library_id > 0);
 }
@@ -2144,5 +2140,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/debugger_arm64.cc b/runtime/vm/debugger_arm64.cc
index c4632f2..94b75e1 100644
--- a/runtime/vm/debugger_arm64.cc
+++ b/runtime/vm/debugger_arm64.cc
@@ -15,30 +15,85 @@
 
 RawInstance* ActivationFrame::GetInstanceCallReceiver(
                  intptr_t num_actual_args) {
-  UNIMPLEMENTED();
-  return NULL;
+  ASSERT(num_actual_args > 0);  // At minimum we have a receiver on the stack.
+  // Stack pointer points to last argument that was pushed on the stack.
+  const uword receiver_addr = sp() + ((num_actual_args - 1) * kWordSize);
+  const uword receiver = *reinterpret_cast<uword*>(receiver_addr);
+  return reinterpret_cast<RawInstance*>(receiver);
 }
 
 
 RawObject* ActivationFrame::GetClosureObject(intptr_t num_actual_args) {
-  UNIMPLEMENTED();
-  return NULL;
+  // At a minimum we have the closure object on the stack.
+  ASSERT(num_actual_args > 0);
+  // Stack pointer points to last argument that was pushed on the stack.
+  const uword closure_addr = sp() + ((num_actual_args - 1) * kWordSize);
+  const uword closure = *reinterpret_cast<uword*>(closure_addr);
+  return reinterpret_cast<RawObject*>(closure);
 }
 
 
 uword CodeBreakpoint::OrigStubAddress() const {
-  UNIMPLEMENTED();
-  return 0;
+  const Code& code = Code::Handle(code_);
+  const Array& object_pool = Array::Handle(code.ObjectPool());
+  const uword offset = saved_value_;
+  ASSERT((offset % kWordSize) == 0);
+  const intptr_t index = (offset - Array::data_offset()) / kWordSize;
+  const uword stub_address = reinterpret_cast<uword>(object_pool.At(index));
+  ASSERT(stub_address % kWordSize == 0);
+  return stub_address;
 }
 
 
 void CodeBreakpoint::PatchCode() {
-  UNIMPLEMENTED();
+  ASSERT(!is_enabled_);
+  const Code& code = Code::Handle(code_);
+  const Instructions& instrs = Instructions::Handle(code.instructions());
+  {
+    WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
+    switch (breakpoint_kind_) {
+      case PcDescriptors::kIcCall:
+      case PcDescriptors::kUnoptStaticCall:
+      case PcDescriptors::kRuntimeCall:
+      case PcDescriptors::kClosureCall:
+      case PcDescriptors::kReturn: {
+        int32_t offset = CodePatcher::GetPoolOffsetAt(pc_);
+        ASSERT((offset > 0) && ((offset & 0x7) == 0));
+        saved_value_ = static_cast<uword>(offset);
+        const uint32_t stub_offset =
+            InstructionPattern::OffsetFromPPIndex(
+                Assembler::kBreakpointRuntimeCPIndex);
+        CodePatcher::SetPoolOffsetAt(pc_, stub_offset);
+        break;
+      }
+      default:
+        UNREACHABLE();
+    }
+  }
+  is_enabled_ = true;
 }
 
 
 void CodeBreakpoint::RestoreCode() {
-  UNIMPLEMENTED();
+  ASSERT(is_enabled_);
+  const Code& code = Code::Handle(code_);
+  const Instructions& instrs = Instructions::Handle(code.instructions());
+  {
+    WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
+    switch (breakpoint_kind_) {
+      case PcDescriptors::kIcCall:
+      case PcDescriptors::kUnoptStaticCall:
+      case PcDescriptors::kClosureCall:
+      case PcDescriptors::kRuntimeCall:
+      case PcDescriptors::kReturn: {
+        CodePatcher::SetPoolOffsetAt(pc_, static_cast<int32_t>(saved_value_));
+        break;
+      }
+      default:
+        UNREACHABLE();
+    }
+  }
+  is_enabled_ = false;
 }
 
 }  // namespace dart
diff --git a/runtime/vm/debugger_test.cc b/runtime/vm/debugger_test.cc
index 7d16bd1..d9c508b 100644
--- a/runtime/vm/debugger_test.cc
+++ b/runtime/vm/debugger_test.cc
@@ -2,10 +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(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "vm/debugger.h"
 #include "vm/unit_test.h"
 
@@ -49,11 +45,11 @@
        "[{\"type\":\"Breakpoint\",\"id\":2,"
          "\"enabled\":true,\"resolved\":false,"
          "\"location\":{\"type\":\"Location\","
-                       "\"script\":\"dart:test-lib\",\"tokenPos\":14}},"
+                       "\"script\":\"test-lib\",\"tokenPos\":14}},"
         "{\"type\":\"Breakpoint\",\"id\":1,"
          "\"enabled\":true,\"resolved\":false,"
          "\"location\":{\"type\":\"Location\","
-                       "\"script\":\"dart:test-lib\",\"tokenPos\":5}}]",
+                       "\"script\":\"test-lib\",\"tokenPos\":5}}]",
        js.ToCString());
   }
 }
@@ -69,9 +65,9 @@
 
   // The debugger knows that it is paused, and why.
   EXPECT(debugger->IsPaused());
-  const Debugger::DebuggerEvent* event = debugger->PauseEvent();
+  const DebuggerEvent* event = debugger->PauseEvent();
   EXPECT(event != NULL);
-  EXPECT(event->type == Debugger::kBreakpointReached);
+  EXPECT(event->type() == DebuggerEvent::kBreakpointReached);
   saw_paused_event = true;
 }
 
@@ -109,5 +105,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/disassembler_arm.cc b/runtime/vm/disassembler_arm.cc
index 4804a69..5c2d333 100644
--- a/runtime/vm/disassembler_arm.cc
+++ b/runtime/vm/disassembler_arm.cc
@@ -6,7 +6,9 @@
 
 #include "vm/globals.h"  // Needed here to get TARGET_ARCH_ARM.
 #if defined(TARGET_ARCH_ARM)
+
 #include "platform/assert.h"
+#include "vm/cpu.h"
 
 namespace dart {
 
@@ -694,6 +696,12 @@
       }
     } else if (instr->IsMultiplyOrSyncPrimitive()) {
       if (instr->Bit(24) == 0) {
+        if ((TargetCPUFeatures::arm_version() != ARMv7) &&
+            (instr->Bits(21, 3) != 0)) {
+          // mla ... smlal only supported on armv7.
+          Unknown(instr);
+          return;
+        }
         // multiply instructions
         switch (instr->Bits(21, 3)) {
           case 0: {
@@ -757,7 +765,11 @@
       // 16-bit immediate loads, msr (immediate), and hints
       switch (instr->Bits(20, 5)) {
         case 16: {
-          Format(instr, "movw'cond 'rd, #'imm4_12");
+          if (TargetCPUFeatures::arm_version() == ARMv7) {
+            Format(instr, "movw'cond 'rd, #'imm4_12");
+          } else {
+            Unknown(instr);
+          }
           break;
         }
         case 18: {
@@ -769,7 +781,11 @@
           break;
         }
         case 20: {
-          Format(instr, "movt'cond 'rd, #'imm4_12");
+          if (TargetCPUFeatures::arm_version() == ARMv7) {
+            Format(instr, "movt'cond 'rd, #'imm4_12");
+          } else {
+            Unknown(instr);
+          }
           break;
         }
         default: {
@@ -948,6 +964,10 @@
 
 void ARMDecoder::DecodeType3(Instr* instr) {
   if (instr->IsDivision()) {
+    if (!TargetCPUFeatures::integer_division_supported()) {
+      Unknown(instr);
+      return;
+    }
     if (instr->Bit(21)) {
       Format(instr, "udiv'cond 'rn, 'rs, 'rm");
     } else {
diff --git a/runtime/vm/disassembler_arm64.cc b/runtime/vm/disassembler_arm64.cc
index 55cc0fd..c79e2d0 100644
--- a/runtime/vm/disassembler_arm64.cc
+++ b/runtime/vm/disassembler_arm64.cc
@@ -387,6 +387,29 @@
       }
       return 6;
     }
+    case 'f': {
+      ASSERT(STRING_STARTS_WITH(format, "fsz"));
+        const int sz = instr->SzField();
+        char const* sz_str;
+        switch (sz) {
+          case 0:
+            if (instr->Bit(23) == 1) {
+              sz_str = "q";
+            } else {
+              sz_str = "b";
+            }
+            break;
+          case 1: sz_str = "h"; break;
+          case 2: sz_str = "s"; break;
+          case 3: sz_str = "d"; break;
+          default: sz_str = "?"; break;
+        }
+        buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+                                   remaining_size_in_buffer(),
+                                   "%s",
+                                   sz_str);
+      return 3;
+    }
     case 'h': {
       ASSERT(STRING_STARTS_WITH(format, "hw"));
       const int shift = instr->HWField() << 4;
@@ -562,27 +585,19 @@
 
 
 void ARM64Decoder::DecodeLoadStoreReg(Instr* instr) {
-  if (instr->Bit(23) != 0) {
-    // 128-bit ldr/str.
-    Unknown(instr);
-  }
   if (instr->Bit(26) == 1) {
-    if (instr->Bits(30, 2) != 3) {
-      // Only 64-bit double variant supported.
-      Unknown(instr);
-    }
     // SIMD or FP src/dst.
     if (instr->Bit(22) == 1) {
-      Format(instr, "fldrd 'vt, 'memop");
+      Format(instr, "fldr'fsz 'vt, 'memop");
     } else {
-      Format(instr, "fstrd 'vt, 'memop");
+      Format(instr, "fstr'fsz 'vt, 'memop");
     }
   } else {
     // Integer src/dst.
-    if (instr->Bit(22) == 1) {
-      Format(instr, "ldr'sz 'rt, 'memop");
-    } else {
+    if (instr->Bits(22, 2) == 0) {
       Format(instr, "str'sz 'rt, 'memop");
+    } else {
+      Format(instr, "ldr'sz 'rt, 'memop");
     }
   }
 }
@@ -698,7 +713,7 @@
 
 
 void ARM64Decoder::DecodeSystem(Instr* instr) {
-  if ((instr->Bits(0, 8) == 0x5f) && (instr->Bits(12, 4) == 2) &&
+  if ((instr->Bits(0, 8) == 0x1f) && (instr->Bits(12, 4) == 2) &&
       (instr->Bits(16, 3) == 3) && (instr->Bits(19, 2) == 0) &&
       (instr->Bit(21) == 0)) {
     if (instr->Bits(8, 4) == 0) {
@@ -987,12 +1002,34 @@
 
 
 void ARM64Decoder::DecodeFPOneSource(Instr* instr) {
-  const int opc = instr->Bits(15, 2);
+  const int opc = instr->Bits(15, 6);
+
+  if ((opc != 5) && (instr->Bit(22) != 1)) {
+    // Source is interpreted as single-precision only if we're doing a
+    // conversion from single -> double.
+    Unknown(instr);
+    return;
+  }
 
   switch (opc) {
     case 0:
       Format(instr, "fmovdd 'vd, 'vn");
       break;
+    case 1:
+      Format(instr, "fabsd 'vd, 'vn");
+      break;
+    case 2:
+      Format(instr, "fnegd 'vd, 'vn");
+      break;
+    case 3:
+      Format(instr, "fsqrtd 'vd, 'vn");
+      break;
+    case 4:
+      Format(instr, "fcvtsd 'vd, 'vn");
+      break;
+    case 5:
+      Format(instr, "fcvtds 'vd, 'vn");
+      break;
     default:
       Unknown(instr);
       break;
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 50338fa..7546f4ef 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -34,6 +34,12 @@
             "Prints a stack trace everytime a throw occurs.");
 DEFINE_FLAG(bool, verbose_stacktrace, false,
     "Stack traces will include methods marked invisible.");
+DEFINE_FLAG(int, stacktrace_depth_on_warning, 5,
+            "Maximal number of stack frames to print after a runtime warning.");
+DECLARE_FLAG(bool, silent_warnings);
+DECLARE_FLAG(bool, warning_as_error);
+DECLARE_FLAG(bool, warn_on_javascript_compatibility);
+
 
 const char* Exceptions::kCastErrorDstName = "type cast";
 
@@ -341,7 +347,7 @@
     type = test_class.super_type();
     if (type.IsNull()) return Field::null();
     test_class = type.type_class();
-  };
+  }
   UNREACHABLE();
   return Field::null();
 }
@@ -689,6 +695,10 @@
       library = Library::CoreLibrary();
       class_name = &Symbols::JavascriptIntegerOverflowError();
       break;
+    case kJavascriptCompatibilityError:
+      library = Library::CoreLibrary();
+      class_name = &Symbols::JavascriptCompatibilityError();
+      break;
     case kAssertion:
       library = Library::CoreLibrary();
       class_name = &Symbols::AssertionError();
@@ -726,4 +736,44 @@
                                           arguments);
 }
 
+
+// Throw JavascriptCompatibilityError exception.
+static void ThrowJavascriptCompatibilityError(const char* msg) {
+  const Array& exc_args = Array::Handle(Array::New(1));
+  const String& msg_str = String::Handle(String::New(msg));
+  exc_args.SetAt(0, msg_str);
+  Exceptions::ThrowByType(Exceptions::kJavascriptCompatibilityError, exc_args);
+}
+
+
+void Exceptions::JSWarning(StackFrame* caller_frame, const char* format, ...) {
+  ASSERT(caller_frame != NULL);
+  ASSERT(FLAG_warn_on_javascript_compatibility);
+  if (FLAG_silent_warnings) return;
+  const Code& caller_code = Code::Handle(caller_frame->LookupDartCode());
+  ASSERT(!caller_code.IsNull());
+  const uword caller_pc = caller_frame->pc();
+  const intptr_t token_pos = caller_code.GetTokenIndexOfPC(caller_pc);
+  const Function& caller = Function::Handle(caller_code.function());
+  const Script& script = Script::Handle(caller.script());
+  va_list args;
+  va_start(args, format);
+  const Error& error = Error::Handle(
+      LanguageError::NewFormattedV(Error::Handle(),  // No previous error.
+                                   script, token_pos, LanguageError::kWarning,
+                                   Heap::kNew, format, args));
+  va_end(args);
+  if (FLAG_warning_as_error) {
+    ThrowJavascriptCompatibilityError(error.ToErrorCString());
+  } else {
+    OS::Print("javascript compatibility warning: %s", error.ToErrorCString());
+  }
+  const Stacktrace& stacktrace =
+     Stacktrace::Handle(Exceptions::CurrentStacktrace());
+  intptr_t idx = 0;
+  OS::Print("%s",
+            stacktrace.ToCStringInternal(&idx,
+                                         FLAG_stacktrace_depth_on_warning));
+}
+
 }  // namespace dart
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index bf12977..9549b55 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -21,6 +21,7 @@
 class RawStacktrace;
 class RawObject;
 class Script;
+class StackFrame;
 class String;
 
 class Exceptions : AllStatic {
@@ -30,6 +31,13 @@
   static void Throw(const Instance& exception);
   static void ReThrow(const Instance& exception, const Instance& stacktrace);
   static void PropagateError(const Error& error);
+
+  // Report a Javascript compatibility warning at the call site given by
+  // caller_frame. Note that a JavascriptCompatibilityError is thrown
+  // if --warning_as_error is specified.
+  static void JSWarning(StackFrame* caller_frame, const char* format, ...)
+      PRINTF_ATTRIBUTE(2, 3);
+
   static RawStacktrace* CurrentStacktrace();
 
   // Helpers to create and throw errors.
@@ -55,6 +63,7 @@
     kIsolateSpawn,
     kIsolateUnhandledException,
     kJavascriptIntegerOverflowError,
+    kJavascriptCompatibilityError,
     kAssertion,
     kCast,
     kType,
diff --git a/runtime/vm/exceptions_test.cc b/runtime/vm/exceptions_test.cc
index e3138a3..1901c58 100644
--- a/runtime/vm/exceptions_test.cc
+++ b/runtime/vm/exceptions_test.cc
@@ -19,7 +19,7 @@
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   const Instance& expected = Instance::CheckedHandle(arguments->NativeArgAt(0));
   const Instance& actual = Instance::CheckedHandle(arguments->NativeArgAt(1));
-  if (!expected.Equals(actual)) {
+  if (!expected.CanonicalizeEquals(actual)) {
     OS::Print("expected: '%s' actual: '%s'\n",
         expected.ToCString(), actual.ToCString());
     FATAL("Unhandled_equals fails.\n");
diff --git a/runtime/vm/find_code_object_test.cc b/runtime/vm/find_code_object_test.cc
index f9e5aee..f67b684 100644
--- a/runtime/vm/find_code_object_test.cc
+++ b/runtime/vm/find_code_object_test.cc
@@ -2,10 +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(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "platform/assert.h"
 #include "vm/class_finalizer.h"
 #include "vm/compiler.h"
@@ -160,5 +156,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h
index 9c4008d..fc5214e 100644
--- a/runtime/vm/flow_graph.h
+++ b/runtime/vm/flow_graph.h
@@ -221,6 +221,7 @@
   friend class IfConverter;
   friend class BranchSimplifier;
   friend class ConstantPropagator;
+  friend class DeadCodeElimination;
 
   // SSA transformation methods and fields.
   void ComputeDominators(GrowableArray<BitVector*>* dominance_frontier);
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index 1359ea7..4a3d66d 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -85,6 +85,9 @@
     fpu_regs_(),
     blocked_cpu_registers_(),
     blocked_fpu_registers_(),
+    number_of_registers_(0),
+    registers_(),
+    blocked_registers_(),
     cpu_spill_slot_count_(0) {
   for (intptr_t i = 0; i < vreg_count_; i++) {
     live_ranges_.Add(NULL);
@@ -1861,8 +1864,8 @@
 intptr_t FlowGraphAllocator::FirstIntersectionWithAllocated(
     intptr_t reg, LiveRange* unallocated) {
   intptr_t intersection = kMaxPosition;
-  for (intptr_t i = 0; i < registers_[reg].length(); i++) {
-    LiveRange* allocated = registers_[reg][i];
+  for (intptr_t i = 0; i < registers_[reg]->length(); i++) {
+    LiveRange* allocated = (*registers_[reg])[i];
     if (allocated == NULL) continue;
 
     UseInterval* allocated_head =
@@ -1966,7 +1969,7 @@
                           free_until));
   } else {
     for (intptr_t reg = 0; reg < NumberOfRegisters(); ++reg) {
-      if (!blocked_registers_[reg] && (registers_[reg].length() == 0)) {
+      if (!blocked_registers_[reg] && (registers_[reg]->length() == 0)) {
         candidate = reg;
         free_until = kMaxPosition;
         break;
@@ -2000,9 +2003,10 @@
       (loop_header != NULL) &&
       (free_until >= loop_header->last_block()->end_pos()) &&
       loop_header->backedge_interference()->Contains(unallocated->vreg())) {
-    ASSERT(static_cast<intptr_t>(kNumberOfFpuRegisters) <=
-           kNumberOfCpuRegisters);
-    bool used_on_backedge[kNumberOfCpuRegisters] = { false };
+    GrowableArray<bool> used_on_backedge(number_of_registers_);
+    for (intptr_t i = 0; i < number_of_registers_; i++) {
+      used_on_backedge.Add(false);
+    }
 
     for (PhiIterator it(loop_header->entry()->AsJoinEntry());
          !it.Done();
@@ -2062,7 +2066,7 @@
     AddToUnallocated(tail);
   }
 
-  registers_[candidate].Add(unallocated);
+  registers_[candidate]->Add(unallocated);
   unallocated->set_assigned_location(MakeRegisterLocation(candidate));
 
   return true;
@@ -2084,8 +2088,8 @@
   const intptr_t loop_start = loop->entry()->start_pos();
   const intptr_t loop_end = loop->last_block()->end_pos();
 
-  for (intptr_t i = 0; i < registers_[reg].length(); i++) {
-    LiveRange* allocated = registers_[reg][i];
+  for (intptr_t i = 0; i < registers_[reg]->length(); i++) {
+    LiveRange* allocated = (*registers_[reg])[i];
 
     UseInterval* interval = allocated->finger()->first_pending_use_interval();
     if (interval->Contains(loop_start)) {
@@ -2182,8 +2186,8 @@
   intptr_t blocked_at = kMaxPosition;
   const intptr_t start = unallocated->Start();
 
-  for (intptr_t i = 0; i < registers_[reg].length(); i++) {
-    LiveRange* allocated = registers_[reg][i];
+  for (intptr_t i = 0; i < registers_[reg]->length(); i++) {
+    LiveRange* allocated = (*registers_[reg])[i];
 
     UseInterval* first_pending_use_interval =
         allocated->finger()->first_pending_use_interval();
@@ -2234,19 +2238,19 @@
 void FlowGraphAllocator::RemoveEvicted(intptr_t reg, intptr_t first_evicted) {
   intptr_t to = first_evicted;
   intptr_t from = first_evicted + 1;
-  while (from < registers_[reg].length()) {
-    LiveRange* allocated = registers_[reg][from++];
-    if (allocated != NULL) registers_[reg][to++] = allocated;
+  while (from < registers_[reg]->length()) {
+    LiveRange* allocated = (*registers_[reg])[from++];
+    if (allocated != NULL) (*registers_[reg])[to++] = allocated;
   }
-  registers_[reg].TruncateTo(to);
+  registers_[reg]->TruncateTo(to);
 }
 
 
 void FlowGraphAllocator::AssignNonFreeRegister(LiveRange* unallocated,
                                                intptr_t reg) {
   intptr_t first_evicted = -1;
-  for (intptr_t i = registers_[reg].length() - 1; i >= 0; i--) {
-    LiveRange* allocated = registers_[reg][i];
+  for (intptr_t i = registers_[reg]->length() - 1; i >= 0; i--) {
+    LiveRange* allocated = (*registers_[reg])[i];
     if (allocated->vreg() < 0) continue;  // Can't be evicted.
     if (EvictIntersection(allocated, unallocated)) {
       // If allocated was not spilled convert all pending uses.
@@ -2254,7 +2258,7 @@
         ASSERT(allocated->End() <= unallocated->Start());
         ConvertAllUses(allocated);
       }
-      registers_[reg][i] = NULL;
+      (*registers_[reg])[i] = NULL;
       first_evicted = i;
     }
   }
@@ -2262,7 +2266,7 @@
   // Remove evicted ranges from the array.
   if (first_evicted != -1) RemoveEvicted(reg, first_evicted);
 
-  registers_[reg].Add(unallocated);
+  registers_[reg]->Add(unallocated);
   unallocated->set_assigned_location(MakeRegisterLocation(reg));
 }
 
@@ -2355,14 +2359,14 @@
 
 void FlowGraphAllocator::AdvanceActiveIntervals(const intptr_t start) {
   for (intptr_t reg = 0; reg < NumberOfRegisters(); reg++) {
-    if (registers_[reg].is_empty()) continue;
+    if (registers_[reg]->is_empty()) continue;
 
     intptr_t first_evicted = -1;
-    for (intptr_t i = registers_[reg].length() - 1; i >= 0; i--) {
-      LiveRange* range = registers_[reg][i];
+    for (intptr_t i = registers_[reg]->length() - 1; i >= 0; i--) {
+      LiveRange* range = (*registers_[reg])[i];
       if (range->finger()->Advance(start)) {
         ConvertAllUses(range);
-        registers_[reg][i] = NULL;
+        (*registers_[reg])[i] = NULL;
         first_evicted = i;
       }
     }
@@ -2461,26 +2465,31 @@
 
 
 void FlowGraphAllocator::PrepareForAllocation(
-  Location::Kind register_kind,
-  intptr_t number_of_registers,
-  const GrowableArray<LiveRange*>& unallocated,
-  LiveRange** blocking_ranges,
-  bool* blocked_registers) {
-  ASSERT(number_of_registers <= kNumberOfCpuRegisters);
+    Location::Kind register_kind,
+    intptr_t number_of_registers,
+    const GrowableArray<LiveRange*>& unallocated,
+    LiveRange** blocking_ranges,
+    bool* blocked_registers) {
   register_kind_ = register_kind;
   number_of_registers_ = number_of_registers;
 
+  blocked_registers_.Clear();
+  registers_.Clear();
+  for (intptr_t i = 0; i < number_of_registers_; i++) {
+    blocked_registers_.Add(false);
+    registers_.Add(new ZoneGrowableArray<LiveRange*>);
+  }
   ASSERT(unallocated_.is_empty());
   unallocated_.AddArray(unallocated);
 
   for (intptr_t reg = 0; reg < number_of_registers; reg++) {
     blocked_registers_[reg] = blocked_registers[reg];
-    ASSERT(registers_[reg].is_empty());
+    ASSERT(registers_[reg]->is_empty());
 
     LiveRange* range = blocking_ranges[reg];
     if (range != NULL) {
       range->finger()->Initialize(range);
-      registers_[reg].Add(range);
+      registers_[reg]->Add(range);
     }
   }
 }
diff --git a/runtime/vm/flow_graph_allocator.h b/runtime/vm/flow_graph_allocator.h
index 348f692..ab05f25 100644
--- a/runtime/vm/flow_graph_allocator.h
+++ b/runtime/vm/flow_graph_allocator.h
@@ -298,9 +298,10 @@
   // ranges that can be affected by future allocation decisions.
   // Those live ranges that end before the start of the current live range are
   // removed from the list and will not be affected.
-  GrowableArray<LiveRange*> registers_[kNumberOfCpuRegisters];
+  // The length of both arrays is 'number_of_registers_'
+  GrowableArray<ZoneGrowableArray<LiveRange*>*> registers_;
 
-  bool blocked_registers_[kNumberOfCpuRegisters];
+  GrowableArray<bool> blocked_registers_;
 
 
   // Worklist for register allocator. Always maintained sorted according
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 181ca41..3374c10 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -37,7 +37,11 @@
 DEFINE_FLAG(bool, print_scopes, false, "Print scopes of local variables.");
 DEFINE_FLAG(bool, trace_type_check_elimination, false,
             "Trace type check elimination at compile time.");
+DEFINE_FLAG(bool, warn_on_javascript_compatibility, false,
+            "Warn on incompatibilities between vm and dart2js.");
 DECLARE_FLAG(bool, enable_type_checks);
+DECLARE_FLAG(bool, warning_as_error);
+DECLARE_FLAG(bool, silent_warnings);
 
 
 // TODO(srdjan): Allow compiler to add constants as they are encountered in
@@ -956,12 +960,12 @@
 }
 
 
-void EffectGraphVisitor::Bailout(const char* reason) {
+void EffectGraphVisitor::Bailout(const char* reason) const {
   owner()->Bailout(reason);
 }
 
 
-void EffectGraphVisitor::InlineBailout(const char* reason) {
+void EffectGraphVisitor::InlineBailout(const char* reason) const {
   owner()->parsed_function()->function().set_is_inlinable(false);
   if (owner()->IsInlining()) owner()->Bailout(reason);
 }
@@ -1403,6 +1407,39 @@
 }
 
 
+void FlowGraphBuilder::WarnOnJSIntegralNumTypeTest(
+    AstNode* node, const AbstractType& type) const {
+  if (is_optimizing()) {
+    // Warnings for constants are issued when the graph is built for the first
+    // time only, i.e. just before generating unoptimized code.
+    // They should not be repeated when generating optimized code.
+    return;
+  }
+  if (!(node->IsLiteralNode() && (type.IsIntType() || type.IsDoubleType()))) {
+    return;
+  }
+  const Instance& instance = node->AsLiteralNode()->literal();
+  if (type.IsIntType()) {
+    if (instance.IsDouble()) {
+      const Double& double_instance = Double::Cast(instance);
+      double value = double_instance.value();
+      if (floor(value) == value) {
+        Warning(node->token_pos(),
+                "javascript compatibility warning: integral value of type "
+                "'double' is also considered to be of type 'int'");
+      }
+    }
+  } else {
+    ASSERT(type.IsDoubleType());
+    if (instance.IsInteger()) {
+      Warning(node->token_pos(),
+              "javascript compatibility warning: integer value is also "
+              "considered to be of type 'double'");
+    }
+  }
+}
+
+
 void EffectGraphVisitor::BuildTypeTest(ComparisonNode* node) {
   ASSERT(Token::IsTypeTestOperator(node->kind()));
   const AbstractType& type = node->right()->AsTypeNode()->type();
@@ -1418,6 +1455,12 @@
     ReturnDefinition(new ConstantInstr(Bool::Get(!negate_result)));
     return;
   }
+
+  // Check for javascript compatibility.
+  if (FLAG_warn_on_javascript_compatibility) {
+    owner()->WarnOnJSIntegralNumTypeTest(node->left(), type);
+  }
+
   ValueGraphVisitor for_left_value(owner());
   node->left()->Visit(&for_left_value);
   Append(for_left_value);
@@ -1462,6 +1505,12 @@
   ASSERT(!node->right()->AsTypeNode()->type().IsNull());
   const AbstractType& type = node->right()->AsTypeNode()->type();
   ASSERT(type.IsFinalized() && !type.IsMalformed() && !type.IsMalbounded());
+
+  // Check for javascript compatibility.
+  if (FLAG_warn_on_javascript_compatibility) {
+    owner()->WarnOnJSIntegralNumTypeTest(node->left(), type);
+  }
+
   ValueGraphVisitor for_value(owner());
   node->left()->Visit(&for_value);
   Append(for_value);
@@ -3889,18 +3938,40 @@
 }
 
 
+void FlowGraphBuilder::Warning(intptr_t token_pos,
+                               const char* format, ...) const {
+  if (FLAG_silent_warnings) return;
+  const Function& function = parsed_function_->function();
+  va_list args;
+  va_start(args, format);
+  const Error& error = Error::Handle(
+      LanguageError::NewFormattedV(Error::Handle(),  // No previous error.
+                                   Script::Handle(function.script()),
+                                   token_pos, LanguageError::kWarning,
+                                   Heap::kNew, format, args));
+  va_end(args);
+  if (FLAG_warning_as_error) {
+    Isolate::Current()->long_jump_base()->Jump(1, error);
+    UNREACHABLE();
+  } else {
+    OS::Print("%s", error.ToErrorCString());
+  }
+}
+
+
 void FlowGraphBuilder::Bailout(const char* reason) const {
   const Function& function = parsed_function_->function();
   const Error& error = Error::Handle(
       LanguageError::NewFormatted(Error::Handle(),  // No previous error.
                                   Script::Handle(function.script()),
                                   function.token_pos(),
-                                  LanguageError::kError,
+                                  LanguageError::kBailout,
                                   Heap::kNew,
                                   "FlowGraphBuilder Bailout: %s %s",
                                   String::Handle(function.name()).ToCString(),
                                   reason));
   Isolate::Current()->long_jump_base()->Jump(1, error);
+  UNREACHABLE();
 }
 
 }  // namespace dart
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 78ccc09..8f62c7d 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -151,6 +151,12 @@
   ParsedFunction* parsed_function() const { return parsed_function_; }
   const Array& ic_data_array() const { return ic_data_array_; }
 
+  void WarnOnJSIntegralNumTypeTest(AstNode* node,
+                                   const AbstractType& type) const;
+
+  void Warning(intptr_t token_pos, const char* format, ...) const
+      PRINTF_ATTRIBUTE(3, 4);
+
   void Bailout(const char* reason) const;
 
   intptr_t AllocateBlockId() { return ++last_used_block_id_; }
@@ -285,8 +291,8 @@
   bool is_empty() const { return entry_ == NULL; }
   bool is_open() const { return is_empty() || exit_ != NULL; }
 
-  void Bailout(const char* reason);
-  void InlineBailout(const char* reason);
+  void Bailout(const char* reason) const;
+  void InlineBailout(const char* reason) const;
 
   // Append a graph fragment to this graph.  Assumes this graph is open.
   void Append(const EffectGraphVisitor& other_fragment);
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 4b90de5..2671d5b 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -10,6 +10,7 @@
 #include "vm/dart_entry.h"
 #include "vm/debugger.h"
 #include "vm/deopt_instructions.h"
+#include "vm/exceptions.h"
 #include "vm/flow_graph_allocator.h"
 #include "vm/il_printer.h"
 #include "vm/intrinsifier.h"
@@ -37,6 +38,7 @@
 DECLARE_FLAG(charp, stacktrace_filter);
 DECLARE_FLAG(int, deoptimize_every);
 DECLARE_FLAG(charp, deoptimize_filter);
+DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
 DEFINE_FLAG(bool, enable_simd_inline, true,
     "Enable inlining of SIMD related method calls.");
@@ -338,12 +340,13 @@
       LanguageError::NewFormatted(Error::Handle(),  // No previous error.
                                   Script::Handle(function.script()),
                                   function.token_pos(),
-                                  LanguageError::kError,
+                                  LanguageError::kBailout,
                                   Heap::kNew,
                                   "FlowGraphCompiler Bailout: %s %s",
                                   String::Handle(function.name()).ToCString(),
                                   reason));
   Isolate::Current()->long_jump_base()->Jump(1, error);
+  UNREACHABLE();
 }
 
 
@@ -828,7 +831,12 @@
     return;
   }
 
-  if (is_optimizing()) {
+  if (is_optimizing() &&
+      // Do not make the instance call megamorphic if the callee needs to decode
+      // the calling code sequence to lookup the ic data and verify if a JS
+      // warning has already been issued or not.
+      (!FLAG_warn_on_javascript_compatibility ||
+       !ic_data.MayCheckForJSWarning())) {
     EmitMegamorphicInstanceCall(ic_data, argument_count,
                                 deopt_id, token_pos, locs);
     return;
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index dad6a51..bc4b773 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -244,6 +244,7 @@
 
   ~FlowGraphCompiler();
 
+  static bool SupportsUnboxedDoubles();
   static bool SupportsUnboxedMints();
   static bool SupportsSinCos();
   static bool SupportsUnboxedSimd128();
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 699ef8b..c918bed 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -24,6 +24,7 @@
 
 DEFINE_FLAG(bool, trap_on_deoptimization, false, "Trap on deoptimization.");
 DEFINE_FLAG(bool, unbox_mints, true, "Optimize 64-bit integer arithmetic.");
+DEFINE_FLAG(bool, unbox_doubles, true, "Optimize double arithmetic.");
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(int, reoptimization_counter_threshold);
 DECLARE_FLAG(bool, enable_type_checks);
@@ -40,6 +41,11 @@
 }
 
 
+bool FlowGraphCompiler::SupportsUnboxedDoubles() {
+  return TargetCPUFeatures::vfp_supported() && FLAG_unbox_doubles;
+}
+
+
 bool FlowGraphCompiler::SupportsUnboxedMints() {
   return TargetCPUFeatures::neon_supported() && FLAG_unbox_mints;
 }
@@ -1596,7 +1602,14 @@
     }
   } else if (source.IsFpuRegister()) {
     if (destination.IsFpuRegister()) {
-      __ vmovq(destination.fpu_reg(), source.fpu_reg());
+      if (TargetCPUFeatures::neon_supported()) {
+        __ vmovq(destination.fpu_reg(), source.fpu_reg());
+      } else {
+        // If we're not inlining simd values, then only the even numbered D
+        // register will have anything in them.
+        __ vmovd(EvenDRegisterOf(destination.fpu_reg()),
+                 EvenDRegisterOf(source.fpu_reg()));
+      }
     } else {
       if (destination.IsDoubleStackSlot()) {
         const intptr_t dest_offset = destination.ToStackSlotOffset();
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index b33b5fb..d19fbb5 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -36,6 +36,11 @@
 }
 
 
+bool FlowGraphCompiler::SupportsUnboxedDoubles() {
+  return true;
+}
+
+
 bool FlowGraphCompiler::SupportsUnboxedMints() {
   return false;
 }
@@ -255,7 +260,7 @@
     if (is_raw_type) {
       const Register kClassIdReg = R2;
       // dynamic type argument, check only classes.
-      __ LoadClassId(kClassIdReg, kInstanceReg);
+      __ LoadClassId(kClassIdReg, kInstanceReg, PP);
       __ CompareImmediate(kClassIdReg, type_class.id(), PP);
       __ b(is_instance_lbl, EQ);
       // List is a very common case.
@@ -336,7 +341,7 @@
   }
   // Compare if the classes are equal.
   const Register kClassIdReg = R2;
-  __ LoadClassId(kClassIdReg, kInstanceReg);
+  __ LoadClassId(kClassIdReg, kInstanceReg, PP);
   __ CompareImmediate(kClassIdReg, type_class.id(), PP);
   __ b(is_instance_lbl, EQ);
   // See ClassFinalizer::ResolveSuperTypeAndInterfaces for list of restricted
@@ -350,8 +355,8 @@
   }
   if (type.IsFunctionType()) {
     // Check if instance is a closure.
-    __ LoadClassById(R3, kClassIdReg);
-    __ LoadFieldFromOffset(R3, R3, Class::signature_function_offset());
+    __ LoadClassById(R3, kClassIdReg, PP);
+    __ LoadFieldFromOffset(R3, R3, Class::signature_function_offset(), PP);
     __ CompareObject(R3, Object::null_object(), PP);
     __ b(is_instance_lbl, NE);
   }
@@ -385,11 +390,11 @@
     Label* is_not_instance_lbl) {
   __ Comment("Subtype1TestCacheLookup");
   const Register kInstanceReg = R0;
-  __ LoadClass(R1, kInstanceReg);
+  __ LoadClass(R1, kInstanceReg, PP);
   // R1: instance class.
   // Check immediate superclass equality.
-  __ LoadFieldFromOffset(R2, R1, Class::super_type_offset());
-  __ LoadFieldFromOffset(R2, R2, Type::type_class_offset());
+  __ LoadFieldFromOffset(R2, R1, Class::super_type_offset(), PP);
+  __ LoadFieldFromOffset(R2, R2, Type::type_class_offset(), PP);
   __ CompareObject(R2, type_class, PP);
   __ b(is_instance_lbl, EQ);
 
@@ -423,7 +428,7 @@
     __ CompareObject(R1, Object::null_object(), PP);
     __ b(is_instance_lbl, EQ);
     __ LoadFieldFromOffset(
-        R2, R1, TypeArguments::type_at_offset(type_param.index()));
+        R2, R1, TypeArguments::type_at_offset(type_param.index()), PP);
     // R2: concrete type of type.
     // Check if type argument is dynamic.
     __ CompareObject(R2, Type::ZoneHandle(Type::DynamicType()), PP);
@@ -738,7 +743,7 @@
   const int max_num_pos_args = num_fixed_params + num_opt_pos_params;
 
   __ LoadFieldFromOffset(
-      R8, R4, ArgumentsDescriptor::positional_count_offset());
+      R8, R4, ArgumentsDescriptor::positional_count_offset(), PP);
   // Check that min_num_pos_args <= num_pos_args.
   Label wrong_num_arguments;
   __ CompareImmediate(R8, Smi::RawValue(min_num_pos_args), PP);
@@ -751,7 +756,7 @@
   // Argument i passed at fp[kParamEndSlotFromFp + num_args - i] is copied
   // to fp[kFirstLocalSlotFromFp - i].
 
-  __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset());
+  __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset(), PP);
   // Since R7 and R8 are Smi, use LSL 2 instead of LSL 3.
   // Let R7 point to the last passed positional argument, i.e. to
   // fp[kParamEndSlotFromFp + num_args - (num_pos_args - 1)].
@@ -805,9 +810,9 @@
       opt_param_position[i + 1] = pos;
     }
     // Generate code handling each optional parameter in alphabetical order.
-    __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset());
+    __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset(), PP);
     __ LoadFieldFromOffset(
-        R8, R4, ArgumentsDescriptor::positional_count_offset());
+        R8, R4, ArgumentsDescriptor::positional_count_offset(), PP);
     __ SmiUntag(R8);
     // Let R7 point to the first passed argument, i.e. to
     // fp[kParamEndSlotFromFp + num_args - 0]; num_args (R7) is Smi.
@@ -821,13 +826,13 @@
       const int param_pos = opt_param_position[i];
       // Check if this named parameter was passed in.
       // Load R5 with the name of the argument.
-      __ LoadFromOffset(R5, R6, ArgumentsDescriptor::name_offset());
+      __ LoadFromOffset(R5, R6, ArgumentsDescriptor::name_offset(), PP);
       ASSERT(opt_param[i]->name().IsSymbol());
       __ CompareObject(R5, opt_param[i]->name(), PP);
       __ b(&load_default_value, NE);
       // Load R5 with passed-in argument at provided arg_pos, i.e. at
       // fp[kParamEndSlotFromFp + num_args - arg_pos].
-      __ LoadFromOffset(R5, R6, ArgumentsDescriptor::position_offset());
+      __ LoadFromOffset(R5, R6, ArgumentsDescriptor::position_offset(), PP);
       // R5 is arg_pos as Smi.
       // Point to next named entry.
       __ add(R6, R6, Operand(ArgumentsDescriptor::named_entry_size()));
@@ -848,7 +853,7 @@
       // scope->VariableAt(i)->index(), because captured variables still need
       // to be copied to the context that is not yet allocated.
       const intptr_t computed_param_pos = kFirstLocalSlotFromFp - param_pos;
-      __ StoreToOffset(R5, FP, computed_param_pos * kWordSize);
+      __ StoreToOffset(R5, FP, computed_param_pos * kWordSize, PP);
     }
     delete[] opt_param;
     delete[] opt_param_position;
@@ -862,7 +867,7 @@
   } else {
     ASSERT(num_opt_pos_params > 0);
     __ LoadFieldFromOffset(
-        R8, R4, ArgumentsDescriptor::positional_count_offset());
+        R8, R4, ArgumentsDescriptor::positional_count_offset(), PP);
     __ SmiUntag(R8);
     for (int i = 0; i < num_opt_pos_params; i++) {
       Label next_parameter;
@@ -881,11 +886,11 @@
       // scope->VariableAt(i)->index(), because captured variables still need
       // to be copied to the context that is not yet allocated.
       const intptr_t computed_param_pos = kFirstLocalSlotFromFp - param_pos;
-      __ StoreToOffset(R5, FP, computed_param_pos * kWordSize);
+      __ StoreToOffset(R5, FP, computed_param_pos * kWordSize, PP);
       __ Bind(&next_parameter);
     }
     if (check_correct_named_args) {
-      __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset());
+      __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset(), PP);
       __ SmiUntag(R7);
       // Check that R8 equals R7, i.e. no named arguments passed.
       __ CompareRegisters(R8, R7);
@@ -902,7 +907,7 @@
                     Isolate::kNoDeoptId, kNumArgsChecked));
     __ LoadObject(R5, ic_data, PP);
     __ LeaveDartFrame();  // The arguments are still on the stack.
-    __ BranchFixed(&StubCode::CallNoSuchMethodFunctionLabel());
+    __ BranchPatchable(&StubCode::CallNoSuchMethodFunctionLabel());
     // The noSuchMethod call may return to the caller, but not here.
     __ hlt(0);
   } else if (check_correct_named_args) {
@@ -917,7 +922,7 @@
   // an issue anymore.
 
   // R4 : arguments descriptor array.
-  __ LoadFieldFromOffset(R8, R4, ArgumentsDescriptor::count_offset());
+  __ LoadFieldFromOffset(R8, R4, ArgumentsDescriptor::count_offset(), PP);
   __ SmiUntag(R8);
   __ add(R7, FP, Operand((kParamEndSlotFromFp + 1) * kWordSize));
   const Address original_argument_addr(R7, R8, UXTX, Address::Scaled);
@@ -937,8 +942,8 @@
   // SP: receiver.
   // Sequence node has one return node, its input is load field node.
   __ Comment("Inlined Getter");
-  __ LoadFromOffset(R0, SP, 0 * kWordSize);
-  __ LoadFromOffset(R0, R0, offset - kHeapObjectTag);
+  __ LoadFromOffset(R0, SP, 0 * kWordSize, PP);
+  __ LoadFromOffset(R0, R0, offset - kHeapObjectTag, PP);
   __ ret();
 }
 
@@ -949,9 +954,9 @@
   // SP+0: value.
   // Sequence node has one store node and one return NULL node.
   __ Comment("Inlined Setter");
-  __ LoadFromOffset(R0, SP, 1 * kWordSize);  // Receiver.
-  __ LoadFromOffset(R1, SP, 0 * kWordSize);  // Value.
-  __ StoreIntoObject(R0, FieldAddress(R0, offset), R1);
+  __ LoadFromOffset(R0, SP, 1 * kWordSize, PP);  // Receiver.
+  __ LoadFromOffset(R1, SP, 0 * kWordSize, PP);  // Value.
+  __ StoreIntoObjectOffset(R0, offset, R1, PP);
   __ LoadObject(R0, Object::null_object(), PP);
   __ ret();
 }
@@ -977,14 +982,16 @@
                          Isolate::kNoDeoptId,
                          0);  // No token position.
     intptr_t threshold = FLAG_optimization_counter_threshold;
-    __ LoadFieldFromOffset(R7, function_reg, Function::usage_counter_offset());
+    __ LoadFieldFromOffset(
+        R7, function_reg, Function::usage_counter_offset(), new_pp);
     if (is_optimizing()) {
       // Reoptimization of an optimized function is triggered by counting in
       // IC stubs, but not at the entry of the function.
       threshold = FLAG_reoptimization_counter_threshold;
     } else {
       __ add(R7, R7, Operand(1));
-      __ StoreFieldToOffset(R7, function_reg, Function::usage_counter_offset());
+      __ StoreFieldToOffset(
+          R7, function_reg, Function::usage_counter_offset(), new_pp);
     }
     __ CompareImmediate(R7, threshold, new_pp);
     ASSERT(function_reg == R6);
@@ -1054,11 +1061,11 @@
       __ Comment("Check argument count");
       // Check that exactly num_fixed arguments are passed in.
       Label correct_num_arguments, wrong_num_arguments;
-      __ LoadFieldFromOffset(R0, R4, ArgumentsDescriptor::count_offset());
+      __ LoadFieldFromOffset(R0, R4, ArgumentsDescriptor::count_offset(), PP);
       __ CompareImmediate(R0, Smi::RawValue(num_fixed_params), PP);
       __ b(&wrong_num_arguments, NE);
       __ LoadFieldFromOffset(R1, R4,
-            ArgumentsDescriptor::positional_count_offset());
+            ArgumentsDescriptor::positional_count_offset(), PP);
       __ CompareRegisters(R0, R1);
       __ b(&correct_num_arguments, EQ);
       __ Bind(&wrong_num_arguments);
@@ -1075,7 +1082,7 @@
                         Isolate::kNoDeoptId, kNumArgsChecked));
         __ LoadObject(R5, ic_data, PP);
         __ LeaveDartFrame();  // The arguments are still on the stack.
-        __ BranchFixed(&StubCode::CallNoSuchMethodFunctionLabel());
+        __ BranchPatchable(&StubCode::CallNoSuchMethodFunctionLabel());
         // The noSuchMethod call may return to the caller, but not here.
         __ hlt(0);
       } else {
@@ -1095,7 +1102,7 @@
     __ LoadObject(R0, Object::null_object(), PP);
     for (intptr_t i = 0; i < num_locals; ++i) {
       // Subtract index i (locals lie at lower addresses than FP).
-      __ StoreToOffset(R0, FP, (slot_base - i) * kWordSize);
+      __ StoreToOffset(R0, FP, (slot_base - i) * kWordSize, PP);
     }
   }
 
@@ -1108,14 +1115,12 @@
   AddCurrentDescriptor(PcDescriptors::kPatchCode,
                        Isolate::kNoDeoptId,
                        0);  // No token position.
-  __ BranchFixed(&StubCode::FixCallersTargetLabel());
+  __ BranchPatchable(&StubCode::FixCallersTargetLabel());
 
   AddCurrentDescriptor(PcDescriptors::kLazyDeoptJump,
                        Isolate::kNoDeoptId,
                        0);  // No token position.
-  // TODO(zra): Can I use a normal BranchPatchable here? Probably have to change
-  // the CodePatcher.
-  __ BranchFixed(&StubCode::DeoptimizeLazyLabel());
+  __ BranchPatchable(&StubCode::DeoptimizeLazyLabel());
 }
 
 
@@ -1183,9 +1188,9 @@
   counter.SetAt(0, Smi::Handle(Smi::New(0)));
   __ Comment("Edge counter");
   __ LoadObject(R0, counter, PP);
-  __ LoadFieldFromOffset(TMP, R0, Array::element_offset(0));
+  __ LoadFieldFromOffset(TMP, R0, Array::element_offset(0), PP);
   __ add(TMP, TMP, Operand(Smi::RawValue(1)));
-  __ StoreFieldToOffset(TMP, R0, Array::element_offset(0));
+  __ StoreFieldToOffset(TMP, R0, Array::element_offset(0), PP);
 }
 
 
@@ -1246,21 +1251,21 @@
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
   Label not_smi, load_cache;
-  __ LoadFromOffset(R0, SP, (argument_count - 1) * kWordSize);
+  __ LoadFromOffset(R0, SP, (argument_count - 1) * kWordSize, PP);
   __ tsti(R0, kSmiTagMask);
   __ b(&not_smi, NE);
   __ LoadImmediate(R0, Smi::RawValue(kSmiCid), PP);
   __ b(&load_cache);
 
   __ Bind(&not_smi);
-  __ LoadClassId(R0, R0);
+  __ LoadClassId(R0, R0, PP);
   __ SmiTag(R0);
 
   // R0: class ID of the receiver (smi).
   __ Bind(&load_cache);
   __ LoadObject(R1, cache, PP);
-  __ LoadFieldFromOffset(R2, R1, MegamorphicCache::buckets_offset());
-  __ LoadFieldFromOffset(R1, R1, MegamorphicCache::mask_offset());
+  __ LoadFieldFromOffset(R2, R1, MegamorphicCache::buckets_offset(), PP);
+  __ LoadFieldFromOffset(R1, R1, MegamorphicCache::mask_offset(), PP);
   // R2: cache buckets array.
   // R1: mask.
   __ mov(R3, R0);
@@ -1273,9 +1278,9 @@
   __ Bind(&loop);
   __ and_(R3, R3, Operand(R1));
   const intptr_t base = Array::data_offset();
-  // R3 is smi tagged, but table entries are 8 bytes, so LSL 2.
-  __ add(TMP, R2, Operand(R3, LSL, 2));
-  __ LoadFieldFromOffset(R4, TMP, base);
+  // R3 is smi tagged, but table entries are 16 bytes, so LSL 3.
+  __ add(TMP, R2, Operand(R3, LSL, 3));
+  __ LoadFieldFromOffset(R4, TMP, base, PP);
 
   ASSERT(kIllegalCid == 0);
   __ tst(R4, Operand(R4));
@@ -1288,10 +1293,10 @@
   // proper target for the given name and arguments descriptor.  If the
   // illegal class id was found, the target is a cache miss handler that can
   // be invoked as a normal Dart function.
-  __ add(TMP, R2, Operand(R3, LSL, 2));
-  __ LoadFieldFromOffset(R0, TMP, base + kWordSize);
-  __ LoadFieldFromOffset(R1, R0, Function::code_offset());
-  __ LoadFieldFromOffset(R1, R1, Code::instructions_offset());
+  __ add(TMP, R2, Operand(R3, LSL, 3));
+  __ LoadFieldFromOffset(R0, TMP, base + kWordSize, PP);
+  __ LoadFieldFromOffset(R1, R0, Function::code_offset(), PP);
+  __ LoadFieldFromOffset(R1, R1, Code::instructions_offset(), PP);
   __ LoadObject(R5, ic_data, PP);
   __ LoadObject(R4, arguments_descriptor, PP);
   __ AddImmediate(R1, R1, Instructions::HeaderSize() - kHeapObjectTag, PP);
@@ -1575,18 +1580,18 @@
     } else {
       ASSERT(destination.IsStackSlot());
       const intptr_t dest_offset = destination.ToStackSlotOffset();
-      __ StoreToOffset(source.reg(), FP, dest_offset);
+      __ StoreToOffset(source.reg(), FP, dest_offset, PP);
     }
   } else if (source.IsStackSlot()) {
     if (destination.IsRegister()) {
       const intptr_t source_offset = source.ToStackSlotOffset();
-      __ LoadFromOffset(destination.reg(), FP, source_offset);
+      __ LoadFromOffset(destination.reg(), FP, source_offset, PP);
     } else {
       ASSERT(destination.IsStackSlot());
       const intptr_t source_offset = source.ToStackSlotOffset();
       const intptr_t dest_offset = destination.ToStackSlotOffset();
-      __ LoadFromOffset(TMP, FP, source_offset);
-      __ StoreToOffset(TMP, FP, dest_offset);
+      __ LoadFromOffset(TMP, FP, source_offset, PP);
+      __ StoreToOffset(TMP, FP, dest_offset, PP);
     }
   } else if (source.IsFpuRegister()) {
     if (destination.IsFpuRegister()) {
@@ -1595,7 +1600,7 @@
       if (destination.IsDoubleStackSlot()) {
         const intptr_t dest_offset = destination.ToStackSlotOffset();
         VRegister src = source.fpu_reg();
-        __ StoreDToOffset(src, FP, dest_offset);
+        __ StoreDToOffset(src, FP, dest_offset, PP);
       } else {
         ASSERT(destination.IsQuadStackSlot());
         UNIMPLEMENTED();
@@ -1605,13 +1610,13 @@
     if (destination.IsFpuRegister()) {
       const intptr_t dest_offset = source.ToStackSlotOffset();
       const VRegister dst = destination.fpu_reg();
-      __ LoadDFromOffset(dst, FP, dest_offset);
+      __ LoadDFromOffset(dst, FP, dest_offset, PP);
     } else {
       ASSERT(destination.IsDoubleStackSlot());
       const intptr_t source_offset = source.ToStackSlotOffset();
       const intptr_t dest_offset = destination.ToStackSlotOffset();
-      __ LoadDFromOffset(VTMP, FP, source_offset);
-      __ StoreDToOffset(VTMP, FP, dest_offset);
+      __ LoadDFromOffset(VTMP, FP, source_offset, PP);
+      __ StoreDToOffset(VTMP, FP, dest_offset, PP);
     }
   } else if (source.IsQuadStackSlot()) {
     UNIMPLEMENTED();
@@ -1623,17 +1628,17 @@
     } else if (destination.IsFpuRegister()) {
       const VRegister dst = destination.fpu_reg();
       __ LoadObject(TMP, constant, PP);
-      __ LoadDFieldFromOffset(dst, TMP, Double::value_offset());
+      __ LoadDFieldFromOffset(dst, TMP, Double::value_offset(), PP);
     } else if (destination.IsDoubleStackSlot()) {
       const intptr_t dest_offset = destination.ToStackSlotOffset();
       __ LoadObject(TMP, constant, PP);
-      __ LoadDFieldFromOffset(VTMP, TMP, Double::value_offset());
-      __ StoreDToOffset(VTMP, FP, dest_offset);
+      __ LoadDFieldFromOffset(VTMP, TMP, Double::value_offset(), PP);
+      __ StoreDToOffset(VTMP, FP, dest_offset, PP);
     } else {
       ASSERT(destination.IsStackSlot());
       const intptr_t dest_offset = destination.ToStackSlotOffset();
       __ LoadObject(TMP, constant, PP);
-      __ StoreToOffset(TMP, FP, dest_offset);
+      __ StoreToOffset(TMP, FP, dest_offset, PP);
     }
   }
 
@@ -1678,8 +1683,8 @@
         : source.ToStackSlotOffset();
 
     if (double_width) {
-      __ LoadDFromOffset(VTMP, FP, slot_offset);
-      __ StoreDToOffset(reg, FP, slot_offset);
+      __ LoadDFromOffset(VTMP, FP, slot_offset, PP);
+      __ StoreDToOffset(reg, FP, slot_offset, PP);
       __ fmovdd(reg, VTMP);
     } else {
       UNIMPLEMENTED();
@@ -1690,10 +1695,10 @@
 
     ScratchFpuRegisterScope ensure_scratch(this, VTMP);
     VRegister scratch = ensure_scratch.reg();
-    __ LoadDFromOffset(VTMP, FP, source_offset);
-    __ LoadDFromOffset(scratch, FP, dest_offset);
-    __ StoreDToOffset(VTMP, FP, dest_offset);
-    __ StoreDToOffset(scratch, FP, source_offset);
+    __ LoadDFromOffset(VTMP, FP, source_offset, PP);
+    __ LoadDFromOffset(scratch, FP, dest_offset, PP);
+    __ StoreDToOffset(VTMP, FP, dest_offset, PP);
+    __ StoreDToOffset(scratch, FP, source_offset, PP);
   } else if (source.IsQuadStackSlot() && destination.IsQuadStackSlot()) {
     UNIMPLEMENTED();
   } else {
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 518f15b..c0e1f3f 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -43,6 +43,11 @@
 }
 
 
+bool FlowGraphCompiler::SupportsUnboxedDoubles() {
+  return true;
+}
+
+
 bool FlowGraphCompiler::SupportsUnboxedMints() {
   // Support unboxed mints when SSE 4.1 is available.
   return FLAG_unbox_mints && TargetCPUFeatures::sse4_1_supported();
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 5b272c0..3b2d462 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -37,6 +37,11 @@
 }
 
 
+bool FlowGraphCompiler::SupportsUnboxedDoubles() {
+  return true;
+}
+
+
 bool FlowGraphCompiler::SupportsUnboxedMints() {
   return false;
 }
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 66bd6cd..adefcec 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -39,6 +39,11 @@
 }
 
 
+bool FlowGraphCompiler::SupportsUnboxedDoubles() {
+  return true;
+}
+
+
 bool FlowGraphCompiler::SupportsUnboxedMints() {
   return false;
 }
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index f8a5494..98c611f 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -8,6 +8,7 @@
 #include "vm/cha.h"
 #include "vm/cpu.h"
 #include "vm/dart_entry.h"
+#include "vm/exceptions.h"
 #include "vm/flow_graph_builder.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/hash_map.h"
@@ -27,6 +28,7 @@
 DEFINE_FLAG(int, getter_setter_ratio, 13,
     "Ratio of getter/setter usage used for double field unboxing heuristics");
 DEFINE_FLAG(bool, load_cse, true, "Use redundant load elimination.");
+DEFINE_FLAG(bool, dead_store_elimination, true, "Eliminate dead stores");
 DEFINE_FLAG(int, max_polymorphic_checks, 4,
     "Maximum number of polymorphic check, otherwise it is megamorphic.");
 DEFINE_FLAG(int, max_equality_polymorphic_checks, 32,
@@ -46,12 +48,19 @@
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, source_lines);
 DECLARE_FLAG(bool, trace_type_check_elimination);
+DECLARE_FLAG(bool, warn_on_javascript_compatibility);
+
 
 static bool ShouldInlineSimd() {
   return FlowGraphCompiler::SupportsUnboxedSimd128();
 }
 
 
+static bool CanUnboxDouble() {
+  return FlowGraphCompiler::SupportsUnboxedDoubles();
+}
+
+
 // Optimize instance calls using ICData.
 void FlowGraphOptimizer::ApplyICData() {
   VisitBlocks();
@@ -109,6 +118,17 @@
     // to megamorphic call.
     return false;
   }
+  if (FLAG_warn_on_javascript_compatibility) {
+    // Do not make the instance call megamorphic if the callee needs to decode
+    // the calling code sequence to lookup the ic data and verify if a warning
+    // has already been issued or not.
+    // TryCreateICData is only invoked if the ic_data target has not been called
+    // yet, so no warning can possibly have been issued.
+    ASSERT(!call->ic_data()->IssuedJSWarning());
+    if (call->ic_data()->MayCheckForJSWarning()) {
+      return false;
+    }
+  }
   GrowableArray<intptr_t> class_ids(call->ic_data()->NumArgsTested());
   ASSERT(call->ic_data()->NumArgsTested() <= call->ArgumentCount());
   for (intptr_t i = 0; i < call->ic_data()->NumArgsTested(); i++) {
@@ -398,7 +418,7 @@
 // Tries to merge MathUnary operations, in this case sinus and cosinus.
 void FlowGraphOptimizer::TryMergeMathUnary(
     GrowableArray<MathUnaryInstr*>* merge_candidates) {
-  if (!FlowGraphCompiler::SupportsSinCos()) {
+  if (!FlowGraphCompiler::SupportsSinCos() || !CanUnboxDouble()) {
     return;
   }
   if (merge_candidates->length() < 2) {
@@ -591,6 +611,7 @@
     converted = new BoxIntegerInstr(use->CopyWithType());
 
   } else if (from == kUnboxedMint && to == kUnboxedDouble) {
+    ASSERT(CanUnboxDouble());
     // Convert by boxing/unboxing.
     // TODO(fschneider): Implement direct unboxed mint-to-double conversion.
     BoxIntegerInstr* boxed = new BoxIntegerInstr(use->CopyWithType());
@@ -602,9 +623,11 @@
     converted = new UnboxDoubleInstr(new Value(boxed), deopt_id);
 
   } else if ((from == kUnboxedDouble) && (to == kTagged)) {
+    ASSERT(CanUnboxDouble());
     converted = new BoxDoubleInstr(use->CopyWithType());
 
   } else if ((from == kTagged) && (to == kUnboxedDouble)) {
+    ASSERT(CanUnboxDouble());
     ASSERT((deopt_target != NULL) ||
            (use->Type()->ToCid() == kDoubleCid));
     const intptr_t deopt_id = (deopt_target != NULL) ?
@@ -742,7 +765,9 @@
 
   switch (phi->Type()->ToCid()) {
     case kDoubleCid:
-      unboxed = kUnboxedDouble;
+      if (CanUnboxDouble()) {
+        unboxed = kUnboxedDouble;
+      }
       break;
     case kFloat32x4Cid:
       if (ShouldInlineSimd()) {
@@ -919,6 +944,11 @@
 
 
 static bool ShouldSpecializeForDouble(const ICData& ic_data) {
+  // Don't specialize for double if we can't unbox them.
+  if (!CanUnboxDouble()) {
+    return false;
+  }
+
   // Unboxed double operation can't handle case of two smis.
   if (ICDataHasReceiverArgumentClassIds(ic_data, kSmiCid, kSmiCid)) {
     return false;
@@ -1303,8 +1333,6 @@
     case MethodRecognizer::kImmutableArrayGetIndexed:
     case MethodRecognizer::kObjectArrayGetIndexed:
     case MethodRecognizer::kGrowableArrayGetIndexed:
-    case MethodRecognizer::kFloat32ArrayGetIndexed:
-    case MethodRecognizer::kFloat64ArrayGetIndexed:
     case MethodRecognizer::kInt8ArrayGetIndexed:
     case MethodRecognizer::kUint8ArrayGetIndexed:
     case MethodRecognizer::kUint8ClampedArrayGetIndexed:
@@ -1313,6 +1341,12 @@
     case MethodRecognizer::kInt16ArrayGetIndexed:
     case MethodRecognizer::kUint16ArrayGetIndexed:
       return InlineGetIndexed(kind, call, receiver, ic_data, entry, last);
+    case MethodRecognizer::kFloat32ArrayGetIndexed:
+    case MethodRecognizer::kFloat64ArrayGetIndexed:
+      if (!CanUnboxDouble()) {
+        return false;
+      }
+      return InlineGetIndexed(kind, call, receiver, ic_data, entry, last);
     case MethodRecognizer::kFloat32x4ArrayGetIndexed:
     case MethodRecognizer::kFloat64x2ArrayGetIndexed:
       if (!ShouldInlineSimd()) {
@@ -1364,6 +1398,9 @@
                               &ic_data, value_check, entry, last);
     case MethodRecognizer::kFloat32ArraySetIndexed:
     case MethodRecognizer::kFloat64ArraySetIndexed:
+      if (!CanUnboxDouble()) {
+        return false;
+      }
       // Check that value is always double.
       if (!ArgIsAlways(kDoubleCid, ic_data, 2)) {
         return false;
@@ -1424,10 +1461,16 @@
                                      kTypedDataUint32ArrayCid,
                                      ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseGetFloat32:
+      if (!CanUnboxDouble()) {
+        return false;
+      }
       return InlineByteArrayViewLoad(call, receiver, receiver_cid,
                                      kTypedDataFloat32ArrayCid,
                                      ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseGetFloat64:
+      if (!CanUnboxDouble()) {
+        return false;
+      }
       return InlineByteArrayViewLoad(call, receiver, receiver_cid,
                                      kTypedDataFloat64ArrayCid,
                                      ic_data, entry, last);
@@ -1476,10 +1519,16 @@
                                       kTypedDataUint32ArrayCid,
                                       ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseSetFloat32:
+      if (!CanUnboxDouble()) {
+        return false;
+      }
       return InlineByteArrayViewStore(target, call, receiver, receiver_cid,
                                       kTypedDataFloat32ArrayCid,
                                       ic_data, entry, last);
     case MethodRecognizer::kByteArrayBaseSetFloat64:
+      if (!CanUnboxDouble()) {
+        return false;
+      }
       return InlineByteArrayViewStore(target, call, receiver, receiver_cid,
                                       kTypedDataFloat64ArrayCid,
                                       ic_data, entry, last);
@@ -1812,7 +1861,7 @@
   } else if (HasTwoMintOrSmi(ic_data) &&
              FlowGraphCompiler::SupportsUnboxedMints()) {
     cid = kMintCid;
-  } else if (HasTwoDoubleOrSmi(ic_data)) {
+  } else if (HasTwoDoubleOrSmi(ic_data) && CanUnboxDouble()) {
     // Use double comparison.
     if (SmiFitsInDouble()) {
       cid = kDoubleCid;
@@ -1914,7 +1963,7 @@
   } else if (HasTwoMintOrSmi(ic_data) &&
              FlowGraphCompiler::SupportsUnboxedMints()) {
     cid = kMintCid;
-  } else if (HasTwoDoubleOrSmi(ic_data)) {
+  } else if (HasTwoDoubleOrSmi(ic_data) && CanUnboxDouble()) {
     // Use double comparison.
     if (SmiFitsInDouble()) {
       cid = kDoubleCid;
@@ -2067,6 +2116,9 @@
   Definition* left = call->ArgumentAt(0);
   Definition* right = call->ArgumentAt(1);
   if (operands_type == kDoubleCid) {
+    if (!CanUnboxDouble()) {
+      return false;
+    }
     // Check that either left or right are not a smi.  Result of a
     // binary operation with two smis is a smi not a double, except '/' which
     // returns a double for two smis.
@@ -2177,7 +2229,8 @@
     unary_op = new UnaryMintOpInstr(
         op_kind, new Value(input), call->deopt_id());
   } else if (HasOnlyOneDouble(*call->ic_data()) &&
-             (op_kind == Token::kNEGATE)) {
+             (op_kind == Token::kNEGATE) &&
+             CanUnboxDouble()) {
     AddReceiverCheck(call);
     unary_op = new UnaryDoubleOpInstr(
         Token::kNEGATE, new Value(input), call->deopt_id());
@@ -2379,6 +2432,9 @@
 
 bool FlowGraphOptimizer::InlineFloat64x2Getter(InstanceCallInstr* call,
                                                MethodRecognizer::Kind getter) {
+  if (!ShouldInlineSimd()) {
+    return false;
+  }
   AddCheckClass(call->ArgumentAt(0),
                 ICData::ZoneHandle(
                     call->ic_data()->AsUnaryClassChecksForArgNr(0)),
@@ -2851,7 +2907,8 @@
     return false;
   }
 
-  if ((recognized_kind == MethodRecognizer::kIntegerToDouble) &&
+  if (CanUnboxDouble() &&
+      (recognized_kind == MethodRecognizer::kIntegerToDouble) &&
       (ic_data.NumberOfChecks() == 1) &&
       (class_ids[0] == kSmiCid)) {
     AddReceiverCheck(call);
@@ -2862,6 +2919,9 @@
   }
 
   if (class_ids[0] == kDoubleCid) {
+    if (!CanUnboxDouble()) {
+      return false;
+    }
     switch (recognized_kind) {
       case MethodRecognizer::kDoubleToInteger: {
         AddReceiverCheck(call);
@@ -2910,7 +2970,18 @@
         (recognized_kind == MethodRecognizer::kByteArrayBaseGetUint32) ||
         (recognized_kind == MethodRecognizer::kByteArrayBaseSetInt32) ||
         (recognized_kind == MethodRecognizer::kByteArrayBaseSetUint32)) {
-      if (!CanUnboxInt32()) return false;
+      if (!CanUnboxInt32()) {
+        return false;
+      }
+    }
+
+    if ((recognized_kind == MethodRecognizer::kByteArrayBaseGetFloat32) ||
+        (recognized_kind == MethodRecognizer::kByteArrayBaseGetFloat64) ||
+        (recognized_kind == MethodRecognizer::kByteArrayBaseSetFloat32) ||
+        (recognized_kind == MethodRecognizer::kByteArrayBaseSetFloat64)) {
+      if (!CanUnboxDouble()) {
+        return false;
+      }
     }
 
     switch (recognized_kind) {
@@ -3694,8 +3765,13 @@
 
 bool FlowGraphOptimizer::BuildByteArrayViewLoad(InstanceCallInstr* call,
                                                 intptr_t view_cid) {
-  bool simd_view = (view_cid == kTypedDataFloat32x4ArrayCid) ||
-                   (view_cid == kTypedDataInt32x4ArrayCid);
+  const bool simd_view = (view_cid == kTypedDataFloat32x4ArrayCid) ||
+                         (view_cid == kTypedDataInt32x4ArrayCid);
+  const bool float_view = (view_cid == kTypedDataFloat32ArrayCid) ||
+                          (view_cid == kTypedDataFloat64ArrayCid);
+  if (float_view && !CanUnboxDouble()) {
+    return false;
+  }
   if (simd_view && !ShouldInlineSimd()) {
     return false;
   }
@@ -3705,8 +3781,13 @@
 
 bool FlowGraphOptimizer::BuildByteArrayViewStore(InstanceCallInstr* call,
                                                  intptr_t view_cid) {
-  bool simd_view = (view_cid == kTypedDataFloat32x4ArrayCid) ||
-                   (view_cid == kTypedDataInt32x4ArrayCid);
+  const bool simd_view = (view_cid == kTypedDataFloat32x4ArrayCid) ||
+                         (view_cid == kTypedDataInt32x4ArrayCid);
+  const bool float_view = (view_cid == kTypedDataFloat32ArrayCid) ||
+                          (view_cid == kTypedDataFloat64ArrayCid);
+  if (float_view && !CanUnboxDouble()) {
+    return false;
+  }
   if (simd_view && !ShouldInlineSimd()) {
     return false;
   }
@@ -3871,6 +3952,15 @@
       call->ArgumentAt(4)->OriginalDefinition()->AsConstant()->value()).value();
   const ICData& unary_checks =
       ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecks());
+  if (FLAG_warn_on_javascript_compatibility &&
+      !unary_checks.IssuedJSWarning() &&
+      (type.IsIntType() || type.IsDoubleType() || !type.IsInstantiated())) {
+    // No warning was reported yet for this type check, either because it has
+    // not been executed yet, or because no problematic combinations of instance
+    // type and test type have been encountered so far. A warning may still be
+    // reported, so do not replace the instance call.
+    return;
+  }
   if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
     ZoneGrowableArray<intptr_t>* results =
         new ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
@@ -3952,6 +4042,15 @@
   ASSERT(!type.IsMalformedOrMalbounded());
   const ICData& unary_checks =
       ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecks());
+  if (FLAG_warn_on_javascript_compatibility &&
+      !unary_checks.IssuedJSWarning() &&
+      (type.IsIntType() || type.IsDoubleType() || !type.IsInstantiated())) {
+    // No warning was reported yet for this type check, either because it has
+    // not been executed yet, or because no problematic combinations of instance
+    // type and test type have been encountered so far. A warning may still be
+    // reported, so do not replace the instance call.
+    return;
+  }
   if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
     ZoneGrowableArray<intptr_t>* results =
         new ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
@@ -4098,7 +4197,11 @@
   }
 }
 
+
 void FlowGraphOptimizer::VisitStaticCall(StaticCallInstr* call) {
+  if (!CanUnboxDouble()) {
+    return;
+  }
   MethodRecognizer::Kind recognized_kind =
       MethodRecognizer::RecognizeKind(call->function());
   MathUnaryInstr::MathUnaryKind unary_kind;
@@ -4195,6 +4298,12 @@
                                      recognized_kind,
                                      call->token_pos());
     ReplaceCall(call, invoke);
+  } else if (recognized_kind == MethodRecognizer::kObjectArrayConstructor) {
+    Value* type = new Value(call->ArgumentAt(0));
+    Value* num_elements = new Value(call->ArgumentAt(1));
+    CreateArrayInstr* create_array =
+        new CreateArrayInstr(call->token_pos(), type, num_elements);
+    ReplaceCall(call, create_array);
   } else if (Library::PrivateCoreLibName(Symbols::ClassId()).Equals(
       String::Handle(call->function().name()))) {
     // Check for core library get:_classId.
@@ -4206,9 +4315,7 @@
            (cid == kImmutableArrayCid) || (cid == kArrayCid));
     ConstantInstr* cid_instr = new ConstantInstr(Smi::Handle(Smi::New(cid)));
     ReplaceCall(call, cid_instr);
-  }
-
-  if (call->function().IsFactory()) {
+  } else if (call->function().IsFactory()) {
     const Class& function_class = Class::Handle(call->function().Owner());
     if ((function_class.library() == Library::CoreLibrary()) ||
         (function_class.library() == Library::TypedDataLibrary())) {
@@ -4984,6 +5091,7 @@
           Instruction* current = instr_it.Current();
           if (current->MayThrow()) {
             Environment* env = current->env();
+            ASSERT(env != NULL);
             for (intptr_t env_idx = 0; env_idx < cdefs.length(); ++env_idx) {
               if (cdefs[env_idx] != NULL &&
                   env->ValueAt(env_idx)->BindsToConstant()) {
@@ -5101,7 +5209,7 @@
 
 
 // Load instructions handled by load elimination.
-static bool IsCandidateLoad(Instruction* instr) {
+static bool IsLoadEliminationCandidate(Instruction* instr) {
   return instr->IsLoadField()
       || instr->IsLoadIndexed()
       || instr->IsLoadStaticField()
@@ -5112,7 +5220,7 @@
 static bool IsLoopInvariantLoad(ZoneGrowableArray<BitVector*>* sets,
                                 intptr_t loop_header_index,
                                 Instruction* instr) {
-  return IsCandidateLoad(instr) &&
+  return IsLoadEliminationCandidate(instr) &&
       (sets != NULL) &&
       instr->HasPlaceId() &&
       ((*sets)[loop_header_index] != NULL) &&
@@ -5178,14 +5286,6 @@
 }
 
 
-static bool IsLoadEliminationCandidate(Definition* def) {
-  return def->IsLoadField()
-      || def->IsLoadIndexed()
-      || def->IsLoadStaticField()
-      || def->IsCurrentContext();
-}
-
-
 // Alias represents a family of locations. It is used to capture aliasing
 // between stores and loads. Store can alias another load or store if and only
 // if they have the same alias.
@@ -5315,7 +5415,7 @@
 
   // Construct a place from instruction if instruction accesses any place.
   // Otherwise constructs kNone place.
-  Place(Instruction* instr, bool* is_load)
+  Place(Instruction* instr, bool* is_load, bool* is_store)
       : kind_(kNone),
         representation_(kNoRepresentation),
         instance_(NULL),
@@ -5350,6 +5450,7 @@
           kind_ = kVMField;
           offset_in_bytes_ = store->offset_in_bytes();
         }
+        *is_store = true;
         break;
       }
 
@@ -5365,6 +5466,7 @@
         representation_ = instr->AsStoreStaticField()->
             RequiredInputRepresentation(StoreStaticFieldInstr::kValuePos);
         field_ = &instr->AsStoreStaticField()->field();
+        *is_store = true;
         break;
 
       case Instruction::kLoadIndexed: {
@@ -5384,6 +5486,7 @@
             RequiredInputRepresentation(StoreIndexedInstr::kValuePos);
         instance_ = store_indexed->array()->definition()->OriginalDefinition();
         index_ = store_indexed->index()->definition();
+        *is_store = true;
         break;
       }
 
@@ -5399,6 +5502,7 @@
         ASSERT(instr->AsStoreContext()->RequiredInputRepresentation(
             StoreContextInstr::kValuePos) == kTagged);
         representation_ = kTagged;
+        *is_store = true;
         break;
 
       default:
@@ -6172,14 +6276,23 @@
   return phi_moves;
 }
 
+
+enum CSEMode {
+  kOptimizeLoads,
+  kOptimizeStores
+};
+
+
 static AliasedSet* NumberPlaces(
     FlowGraph* graph,
-    DirectChainedHashMap<PointerKeyValueTrait<Place> >* map) {
+    DirectChainedHashMap<PointerKeyValueTrait<Place> >* map,
+    CSEMode mode) {
   // Loads representing different expression ids will be collected and
   // used to build per offset kill sets.
   ZoneGrowableArray<Place*>* places = new ZoneGrowableArray<Place*>(10);
 
   bool has_loads = false;
+  bool has_stores = false;
   for (BlockIterator it = graph->reverse_postorder_iterator();
        !it.Done();
        it.Advance()) {
@@ -6188,8 +6301,7 @@
          !instr_it.Done();
          instr_it.Advance()) {
       Instruction* instr = instr_it.Current();
-
-      Place place(instr, &has_loads);
+      Place place(instr, &has_loads, &has_stores);
       if (place.kind() == Place::kNone) {
         continue;
       }
@@ -6212,7 +6324,10 @@
     }
   }
 
-  if (!has_loads) {
+  if ((mode == kOptimizeLoads) && !has_loads) {
+    return NULL;
+  }
+  if ((mode == kOptimizeStores) && !has_stores) {
     return NULL;
   }
 
@@ -6268,7 +6383,7 @@
     }
 
     DirectChainedHashMap<PointerKeyValueTrait<Place> > map;
-    AliasedSet* aliased_set = NumberPlaces(graph, &map);
+    AliasedSet* aliased_set = NumberPlaces(graph, &map, kOptimizeLoads);
     if ((aliased_set != NULL) && !aliased_set->IsEmpty()) {
       // If any loads were forwarded return true from Optimize to run load
       // forwarding again. This will allow to forward chains of loads.
@@ -6346,9 +6461,9 @@
               (array_store->class_id() == kTypedDataFloat64ArrayCid) ||
               (array_store->class_id() == kTypedDataFloat32ArrayCid) ||
               (array_store->class_id() == kTypedDataFloat32x4ArrayCid)) {
-            bool is_load = false;
-            Place store_place(instr, &is_load);
-            ASSERT(!is_load);
+            bool is_load = false, is_store = false;
+            Place store_place(instr, &is_load, &is_store);
+            ASSERT(!is_load && is_store);
             Place* place = map_->Lookup(&store_place);
             if (place != NULL) {
               // Store has a corresponding numbered place that might have a
@@ -7048,6 +7163,292 @@
 };
 
 
+class StoreOptimizer : public LivenessAnalysis {
+ public:
+  StoreOptimizer(FlowGraph* graph,
+                 AliasedSet* aliased_set,
+                 DirectChainedHashMap<PointerKeyValueTrait<Place> >* map)
+      : LivenessAnalysis(aliased_set->max_place_id(), graph->postorder()),
+        graph_(graph),
+        map_(map),
+        aliased_set_(aliased_set),
+        exposed_stores_(graph_->postorder().length()) {
+    const intptr_t num_blocks = graph_->postorder().length();
+    for (intptr_t i = 0; i < num_blocks; i++) {
+      exposed_stores_.Add(NULL);
+    }
+  }
+
+  static void OptimizeGraph(FlowGraph* graph) {
+    ASSERT(FLAG_load_cse);
+    if (FLAG_trace_load_optimization) {
+      FlowGraphPrinter::PrintGraph("Before StoreOptimizer", graph);
+    }
+
+    DirectChainedHashMap<PointerKeyValueTrait<Place> > map;
+    AliasedSet* aliased_set = NumberPlaces(graph, &map, kOptimizeStores);
+    if ((aliased_set != NULL) && !aliased_set->IsEmpty()) {
+      StoreOptimizer store_optimizer(graph, aliased_set, &map);
+      store_optimizer.Optimize();
+    }
+  }
+
+ private:
+  void Optimize() {
+    Analyze();
+    if (FLAG_trace_load_optimization) {
+      Dump();
+    }
+    EliminateDeadStores();
+    if (FLAG_trace_load_optimization) {
+      FlowGraphPrinter::PrintGraph("After StoreOptimizer", graph_);
+    }
+  }
+
+  bool CanEliminateStore(Instruction* instr) {
+    switch (instr->tag()) {
+      case Instruction::kStoreInstanceField:
+        if (instr->AsStoreInstanceField()->is_initialization()) {
+          // Can't eliminate stores that initialized unboxed fields.
+          return false;
+        }
+      case Instruction::kStoreContext:
+      case Instruction::kStoreIndexed:
+      case Instruction::kStoreStaticField:
+        return true;
+      default:
+        UNREACHABLE();
+        return false;
+    }
+  }
+
+  virtual void ComputeInitialSets() {
+    BitVector* all_places = new BitVector(aliased_set_->max_place_id());
+    all_places->SetAll();
+    for (BlockIterator block_it = graph_->postorder_iterator();
+         !block_it.Done();
+         block_it.Advance()) {
+      BlockEntryInstr* block = block_it.Current();
+      const intptr_t postorder_number = block->postorder_number();
+
+      BitVector* kill = kill_[postorder_number];
+      BitVector* live_in = live_in_[postorder_number];
+      BitVector* live_out = live_out_[postorder_number];
+
+      ZoneGrowableArray<Instruction*>* exposed_stores = NULL;
+
+      // Iterate backwards starting at the last instruction.
+      for (BackwardInstructionIterator instr_it(block);
+           !instr_it.Done();
+           instr_it.Advance()) {
+        Instruction* instr = instr_it.Current();
+
+        bool is_load = false;
+        bool is_store = false;
+        Place place(instr, &is_load, &is_store);
+        if (place.IsFinalField()) {
+          // Loads/stores of final fields do not participate.
+          continue;
+        }
+
+        // Handle stores.
+        if (is_store) {
+          if (kill->Contains(instr->place_id())) {
+            if (!live_in->Contains(instr->place_id()) &&
+                CanEliminateStore(instr)) {
+              if (FLAG_trace_optimization) {
+                OS::Print(
+                    "Removing dead store to place %" Pd " in block B%" Pd "\n",
+                    instr->place_id(), block->block_id());
+              }
+              instr_it.RemoveCurrentFromGraph();
+            }
+          } else if (!live_in->Contains(instr->place_id())) {
+            // Mark this store as down-ward exposed: They are the only
+            // candidates for the global store elimination.
+            if (exposed_stores == NULL) {
+              const intptr_t kMaxExposedStoresInitialSize = 5;
+              exposed_stores = new ZoneGrowableArray<Instruction*>(
+                  Utils::Minimum(kMaxExposedStoresInitialSize,
+                                 aliased_set_->max_place_id()));
+            }
+            exposed_stores->Add(instr);
+          }
+          // Interfering stores kill only loads from the same place.
+          kill->Add(instr->place_id());
+          live_in->Remove(instr->place_id());
+          continue;
+        }
+
+        // Handle side effects, deoptimization and function return.
+        if (!instr->Effects().IsNone() ||
+            instr->CanDeoptimize() ||
+            instr->IsThrow() ||
+            instr->IsReThrow() ||
+            instr->IsReturn()) {
+          // Instructions that return from the function, instructions with side
+          // effects and instructions that can deoptimize are considered as
+          // loads from all places.
+          live_in->CopyFrom(all_places);
+          if (instr->IsThrow() || instr->IsReThrow() || instr->IsReturn()) {
+            // Initialize live-out for exit blocks since it won't be computed
+            // otherwise during the fixed point iteration.
+            live_out->CopyFrom(all_places);
+          }
+          continue;
+        }
+
+        // Handle loads.
+        Definition* defn = instr->AsDefinition();
+        if ((defn != NULL) && IsLoadEliminationCandidate(defn)) {
+          const Alias alias = aliased_set_->ComputeAlias(&place);
+          live_in->AddAll(aliased_set_->Get(alias));
+          continue;
+        }
+      }
+      exposed_stores_[postorder_number] = exposed_stores;
+    }
+    if (FLAG_trace_load_optimization) {
+      Dump();
+      OS::Print("---\n");
+    }
+  }
+
+  void EliminateDeadStores() {
+    // Iteration order does not matter here.
+    for (BlockIterator block_it = graph_->postorder_iterator();
+         !block_it.Done();
+         block_it.Advance()) {
+      BlockEntryInstr* block = block_it.Current();
+      const intptr_t postorder_number = block->postorder_number();
+
+      BitVector* live_out = live_out_[postorder_number];
+
+      ZoneGrowableArray<Instruction*>* exposed_stores =
+        exposed_stores_[postorder_number];
+      if (exposed_stores == NULL) continue;  // No exposed stores.
+
+      // Iterate over candidate stores.
+      for (intptr_t i = 0; i < exposed_stores->length(); ++i) {
+        Instruction* instr = (*exposed_stores)[i];
+        bool is_load = false;
+        bool is_store = false;
+        Place place(instr, &is_load, &is_store);
+        ASSERT(!is_load && is_store);
+        if (place.IsFinalField()) {
+          // Final field do not participate in dead store elimination.
+          continue;
+        }
+        // Eliminate a downward exposed store if the corresponding place is not
+        // in live-out.
+        if (!live_out->Contains(instr->place_id()) &&
+            CanEliminateStore(instr)) {
+          if (FLAG_trace_optimization) {
+            OS::Print("Removing dead store to place %" Pd " block B%" Pd "\n",
+                      instr->place_id(), block->block_id());
+          }
+          instr->RemoveFromGraph(/* ignored */ false);
+        }
+      }
+    }
+  }
+
+  FlowGraph* graph_;
+  DirectChainedHashMap<PointerKeyValueTrait<Place> >* map_;
+
+  // Mapping between field offsets in words and expression ids of loads from
+  // that offset.
+  AliasedSet* aliased_set_;
+
+  // Per block list of downward exposed stores.
+  GrowableArray<ZoneGrowableArray<Instruction*>*> exposed_stores_;
+
+  DISALLOW_COPY_AND_ASSIGN(StoreOptimizer);
+};
+
+
+void DeadStoreElimination::Optimize(FlowGraph* graph) {
+  if (FLAG_dead_store_elimination) {
+    StoreOptimizer::OptimizeGraph(graph);
+  }
+}
+
+
+void DeadCodeElimination::EliminateDeadPhis(FlowGraph* flow_graph) {
+  GrowableArray<PhiInstr*> live_phis;
+  for (BlockIterator b = flow_graph->postorder_iterator();
+       !b.Done();
+       b.Advance()) {
+    JoinEntryInstr* join = b.Current()->AsJoinEntry();
+    if (join != NULL) {
+      for (PhiIterator it(join); !it.Done(); it.Advance()) {
+        PhiInstr* phi = it.Current();
+        // Phis that have uses and phis inside try blocks are
+        // marked as live.
+        if (phi->HasUses() || join->InsideTryBlock()) {
+          live_phis.Add(phi);
+          phi->mark_alive();
+        } else {
+          phi->mark_dead();
+        }
+      }
+    }
+  }
+
+  while (!live_phis.is_empty()) {
+    PhiInstr* phi = live_phis.RemoveLast();
+    for (intptr_t i = 0; i < phi->InputCount(); i++) {
+      Value* val = phi->InputAt(i);
+      PhiInstr* used_phi = val->definition()->AsPhi();
+      if ((used_phi != NULL) && !used_phi->is_alive()) {
+        used_phi->mark_alive();
+        live_phis.Add(used_phi);
+      }
+    }
+  }
+
+  for (BlockIterator it(flow_graph->postorder_iterator());
+       !it.Done();
+       it.Advance()) {
+    JoinEntryInstr* join = it.Current()->AsJoinEntry();
+    if (join != NULL) {
+      if (join->phis_ == NULL) continue;
+
+      // Eliminate dead phis and compact the phis_ array of the block.
+      intptr_t to_index = 0;
+      for (intptr_t i = 0; i < join->phis_->length(); ++i) {
+        PhiInstr* phi = (*join->phis_)[i];
+        if (phi != NULL) {
+          if (!phi->is_alive()) {
+            phi->ReplaceUsesWith(flow_graph->constant_null());
+            phi->UnuseAllInputs();
+            (*join->phis_)[i] = NULL;
+            if (FLAG_trace_optimization) {
+              OS::Print("Removing dead phi v%" Pd "\n", phi->ssa_temp_index());
+            }
+          } else if (phi->IsRedundant()) {
+            phi->ReplaceUsesWith(phi->InputAt(0)->definition());
+            phi->UnuseAllInputs();
+            (*join->phis_)[i] = NULL;
+            if (FLAG_trace_optimization) {
+              OS::Print("Removing redundant phi v%" Pd "\n",
+                         phi->ssa_temp_index());
+            }
+          } else {
+            (*join->phis_)[to_index++] = phi;
+          }
+        }
+      }
+      if (to_index == 0) {
+        join->phis_ = NULL;
+      } else {
+        join->phis_->TruncateTo(to_index);
+      }
+    }
+  }
+}
+
+
 class CSEInstructionMap : public ValueObject {
  public:
   // Right now CSE and LICM track a single effect: possible externalization of
@@ -7763,13 +8164,14 @@
     intptr_t value_cid = instr->value()->Type()->ToCid();
     Representation rep = def->representation();
     if ((checked_type.IsFloat32x4Type() && (rep == kUnboxedFloat32x4)) ||
-        (checked_type.IsInt32x4Type() && (rep == kUnboxedInt32x4))     ||
-        (checked_type.IsDoubleType() && (rep == kUnboxedDouble))       ||
+        (checked_type.IsInt32x4Type() && (rep == kUnboxedInt32x4)) ||
+        (checked_type.IsDoubleType() && (rep == kUnboxedDouble) &&
+         CanUnboxDouble()) ||
         (checked_type.IsIntType() && (rep == kUnboxedMint))) {
       // Ensure that compile time type matches representation.
       ASSERT(((rep == kUnboxedFloat32x4) && (value_cid == kFloat32x4Cid)) ||
-             ((rep == kUnboxedInt32x4) && (value_cid == kInt32x4Cid))     ||
-             ((rep == kUnboxedDouble) && (value_cid == kDoubleCid))       ||
+             ((rep == kUnboxedInt32x4) && (value_cid == kInt32x4Cid)) ||
+             ((rep == kUnboxedDouble) && (value_cid == kDoubleCid)) ||
              ((rep == kUnboxedMint) && (value_cid == kMintCid)));
       // The representation guarantees the type check to be true.
       SetValue(instr, instr->negate_result() ? Bool::False() : Bool::True());
@@ -8552,8 +8954,6 @@
     printer.PrintBlocks();
   }
 
-  GrowableArray<PhiInstr*> redundant_phis(10);
-
   // We will recompute dominators, block ordering, block ids, block last
   // instructions, previous pointers, predecessors, etc. after eliminating
   // unreachable code.  We do not maintain those properties during the
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index c6deefc..02a1e49 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -288,6 +288,18 @@
 };
 
 
+class DeadStoreElimination : public AllStatic {
+ public:
+  static void Optimize(FlowGraph* graph);
+};
+
+
+class DeadCodeElimination : public AllStatic {
+ public:
+  static void EliminateDeadPhis(FlowGraph* graph);
+};
+
+
 // Sparse conditional constant propagation and unreachable code elimination.
 // Assumes that use lists are computed and preserves them.
 class ConstantPropagator : public FlowGraphVisitor {
diff --git a/runtime/vm/freelist_test.cc b/runtime/vm/freelist_test.cc
index b7cfbca..2f29760 100644
--- a/runtime/vm/freelist_test.cc
+++ b/runtime/vm/freelist_test.cc
@@ -159,7 +159,7 @@
   const intptr_t kMinSize = 2 * kWordSize;
   uword* objects = new uword[kBlobSize / kMinSize];
   for (intptr_t i = 0; i < kBlobSize / kMinSize; ++i) {
-    objects[i] = NULL;
+    objects[i] = static_cast<uword>(NULL);
   }
 
   VirtualMemory* blob = VirtualMemory::ReserveAligned(kBlobSize, 4096);
diff --git a/runtime/vm/heap_test.cc b/runtime/vm/heap_test.cc
index 47a25c7..b6be1f3a 100644
--- a/runtime/vm/heap_test.cc
+++ b/runtime/vm/heap_test.cc
@@ -59,10 +59,10 @@
   }
 
   static void DumpClassHeapStats(ClassHeapStats* stats) {
-    printf("%" Pd " ", stats->recent.new_count);
-    printf("%" Pd " ", stats->post_gc.new_count);
-    printf("%" Pd " ", stats->pre_gc.new_count);
-    printf("\n");
+    OS::Print("%" Pd " ", stats->recent.new_count);
+    OS::Print("%" Pd " ", stats->post_gc.new_count);
+    OS::Print("%" Pd " ", stats->pre_gc.new_count);
+    OS::Print("\n");
   }
 };
 
diff --git a/runtime/vm/instructions_arm.cc b/runtime/vm/instructions_arm.cc
index 03aff85..ebaec33 100644
--- a/runtime/vm/instructions_arm.cc
+++ b/runtime/vm/instructions_arm.cc
@@ -35,10 +35,11 @@
 
 
 int CallPattern::LengthInBytes() {
-  if (TargetCPUFeatures::arm_version() == ARMv6) {
+  const ARMVersion version = TargetCPUFeatures::arm_version();
+  if ((version == ARMv5TE) || (version == ARMv6)) {
     return 5 * Instr::kInstrSize;
   } else {
-    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    ASSERT(version == ARMv7);
     return 3 * Instr::kInstrSize;
   }
 }
@@ -80,7 +81,8 @@
   uword start = end - Instr::kInstrSize;
   int32_t instr = Instr::At(start)->InstructionBits();
   intptr_t imm = 0;
-  if (TargetCPUFeatures::arm_version() == ARMv6) {
+  const ARMVersion version = TargetCPUFeatures::arm_version();
+  if ((version == ARMv5TE) || (version == ARMv6)) {
     ASSERT((instr & 0xfff00000) == 0xe3800000);  // orr rd, rd, byte0
     imm |= (instr & 0x000000ff);
 
@@ -102,7 +104,7 @@
     *reg = static_cast<Register>((instr & 0x0000f000) >> 12);
     *value = imm;
   } else {
-    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    ASSERT(version == ARMv7);
     if ((instr & 0xfff00000) == 0xe3400000) {  // movt reg, #imm_hi
       imm |= (instr & 0xf0000) << 12;
       imm |= (instr & 0xfff) << 16;
@@ -203,7 +205,8 @@
 
 
 void CallPattern::InsertAt(uword pc, uword target_address) {
-  if (TargetCPUFeatures::arm_version() == ARMv6) {
+  const ARMVersion version = TargetCPUFeatures::arm_version();
+  if ((version == ARMv5TE) || (version == ARMv6)) {
     const uint32_t byte0 = (target_address & 0x000000ff);
     const uint32_t byte1 = (target_address & 0x0000ff00) >> 8;
     const uint32_t byte2 = (target_address & 0x00ff0000) >> 16;
@@ -224,7 +227,7 @@
     ASSERT(LengthInBytes() == 5 * Instr::kInstrSize);
     CPU::FlushICache(pc, LengthInBytes());
   } else {
-    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    ASSERT(version == ARMv7);
     const uint16_t target_lo = target_address & 0xffff;
     const uint16_t target_hi = target_address >> 16;
 
@@ -248,17 +251,19 @@
 
 
 int JumpPattern::pattern_length_in_bytes() {
-  if (TargetCPUFeatures::arm_version() == ARMv6) {
+  const ARMVersion version = TargetCPUFeatures::arm_version();
+  if ((version == ARMv5TE) || (version == ARMv6)) {
     return 5 * Instr::kInstrSize;
   } else {
-    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    ASSERT(version == ARMv7);
     return 3 * Instr::kInstrSize;
   }
 }
 
 
 bool JumpPattern::IsValid() const {
-  if (TargetCPUFeatures::arm_version() == ARMv6) {
+  const ARMVersion version = TargetCPUFeatures::arm_version();
+  if ((version == ARMv5TE) || (version == ARMv6)) {
     Instr* mov_ip = Instr::At(pc_ + (0 * Instr::kInstrSize));
     Instr* or1_ip = Instr::At(pc_ + (1 * Instr::kInstrSize));
     Instr* or2_ip = Instr::At(pc_ + (2 * Instr::kInstrSize));
@@ -270,7 +275,7 @@
            ((or3_ip->InstructionBits() & 0xffffff00) == 0xe38cc000) &&
            ((bx_ip->InstructionBits() & 0xffffffff) == 0xe12fff1c);
   } else {
-    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    ASSERT(version == ARMv7);
     Instr* movw_ip = Instr::At(pc_ + (0 * Instr::kInstrSize));  // target_lo
     Instr* movt_ip = Instr::At(pc_ + (1 * Instr::kInstrSize));  // target_hi
     Instr* bx_ip = Instr::At(pc_ + (2 * Instr::kInstrSize));
@@ -282,7 +287,8 @@
 
 
 uword JumpPattern::TargetAddress() const {
-  if (TargetCPUFeatures::arm_version() == ARMv6) {
+  const ARMVersion version = TargetCPUFeatures::arm_version();
+  if ((version == ARMv5TE) || (version == ARMv6)) {
     Instr* mov_ip = Instr::At(pc_ + (0 * Instr::kInstrSize));
     Instr* or1_ip = Instr::At(pc_ + (1 * Instr::kInstrSize));
     Instr* or2_ip = Instr::At(pc_ + (2 * Instr::kInstrSize));
@@ -294,7 +300,7 @@
     imm |= mov_ip->Immed8Field() << 24;
     return imm;
   } else {
-    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    ASSERT(version == ARMv7);
     Instr* movw_ip = Instr::At(pc_ + (0 * Instr::kInstrSize));  // target_lo
     Instr* movt_ip = Instr::At(pc_ + (1 * Instr::kInstrSize));  // target_hi
     uint16_t target_lo = movw_ip->MovwField();
@@ -305,7 +311,8 @@
 
 
 void JumpPattern::SetTargetAddress(uword target_address) const {
-  if (TargetCPUFeatures::arm_version() == ARMv6) {
+  const ARMVersion version = TargetCPUFeatures::arm_version();
+  if ((version == ARMv5TE) || (version == ARMv6)) {
     const uint32_t byte0 = (target_address & 0x000000ff);
     const uint32_t byte1 = (target_address & 0x0000ff00) >> 8;
     const uint32_t byte2 = (target_address & 0x00ff0000) >> 16;
@@ -322,7 +329,7 @@
     *reinterpret_cast<uword*>(pc_ + (3 * Instr::kInstrSize)) = or3_ip;
     CPU::FlushICache(pc_, 4 * Instr::kInstrSize);
   } else {
-    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    ASSERT(version == ARMv7);
     const uint16_t target_lo = target_address & 0xffff;
     const uint16_t target_hi = target_address >> 16;
 
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
index 6617537..de513c7 100644
--- a/runtime/vm/instructions_arm64.cc
+++ b/runtime/vm/instructions_arm64.cc
@@ -34,6 +34,11 @@
 }
 
 
+intptr_t InstructionPattern::OffsetFromPPIndex(intptr_t index) {
+  return Array::element_offset(index);
+}
+
+
 // Decodes a load sequence ending at 'end' (the last instruction of the load
 // sequence is the instruction before the one at end).  Returns a pointer to
 // the first instruction in the sequence.  Returns the register being loaded
@@ -147,7 +152,10 @@
                                                  intptr_t* index) {
   // 1. ldr dst, [pp, offset]
   // or
-  // 2. movz dst, low_offset, 0
+  // 2. add dst, pp, #offset_hi12
+  //    ldr dst [dst, #offset_lo12]
+  // or
+  // 3. movz dst, low_offset, 0
   //    movk dst, hi_offset, 1 (optional)
   //    ldr dst, [pp, dst]
   uword start = end - Instr::kInstrSize;
@@ -162,9 +170,17 @@
   *reg = instr->RtField();
 
   if (instr->Bit(24) == 1) {
-    // pp + scaled unsigned 12-bit immediate offset.
+    // base + scaled unsigned 12-bit immediate offset.
     // Case 1.
-    offset = instr->Imm12Field() << 3;
+    offset |= (instr->Imm12Field() << 3);
+    if (instr->RnField() == *reg) {
+      start -= Instr::kInstrSize;
+      instr = Instr::At(start);
+      ASSERT(instr->IsAddSubImmOp());
+      ASSERT(instr->RnField() == PP);
+      ASSERT(instr->RdField() == *reg);
+      offset |= (instr->Imm12Field() << 12);
+    }
   } else {
     ASSERT(instr->Bits(10, 2) == 2);
     // We have to look at the preceding one or two instructions to find the
@@ -198,6 +214,27 @@
 }
 
 
+// Encodes a load sequence ending at 'end'. Encodes a fixed length two
+// instruction load from the pool pointer in PP using the destination
+// register reg as a temporary for the base address.
+// Assumes that the location has already been validated for patching.
+void InstructionPattern::EncodeLoadWordFromPoolFixed(uword end,
+                                                     int32_t offset) {
+  uword start = end - Instr::kInstrSize;
+  Instr* instr = Instr::At(start);
+  const int32_t upper12 = offset & 0x00fff000;
+  const int32_t lower12 = offset & 0x00000fff;
+  ASSERT((offset & 0xff000000) == 0);  // Can't encode > 24 bits.
+  ASSERT(((lower12 >> 3) << 3) == lower12);  // 8-byte aligned.
+  instr->SetImm12Bits(instr->InstructionBits(), lower12 >> 3);
+
+  start -= Instr::kInstrSize;
+  instr = Instr::At(start);
+  instr->SetImm12Bits(instr->InstructionBits(), upper12 >> 12);
+  instr->SetInstructionBits(instr->InstructionBits() | B22);
+}
+
+
 RawICData* CallPattern::IcData() {
   if (ic_data_.IsNull()) {
     Register reg;
diff --git a/runtime/vm/instructions_arm64.h b/runtime/vm/instructions_arm64.h
index d25b378..e6c772e 100644
--- a/runtime/vm/instructions_arm64.h
+++ b/runtime/vm/instructions_arm64.h
@@ -44,6 +44,13 @@
   static uword DecodeLoadWordFromPool(uword end,
                                       Register* reg,
                                       intptr_t* index);
+
+  // Encodes a load sequence ending at 'end'. Encodes a fixed length two
+  // instruction load from the pool pointer in PP using the destination
+  // register reg as a temporary for the base address.
+  static void EncodeLoadWordFromPoolFixed(uword end, int32_t offset);
+
+  static intptr_t OffsetFromPPIndex(intptr_t index);
 };
 
 
diff --git a/runtime/vm/instructions_arm64_test.cc b/runtime/vm/instructions_arm64_test.cc
index 75ae91c..fb97900 100644
--- a/runtime/vm/instructions_arm64_test.cc
+++ b/runtime/vm/instructions_arm64_test.cc
@@ -33,10 +33,8 @@
 
 
 ASSEMBLER_TEST_GENERATE(Jump, assembler) {
-  // TODO(zra): Use BranchPatchable after fixing JumpPattern to match a load
-  // from the object pool.n
-  __ BranchFixed(&StubCode::InvokeDartCodeLabel());
-  __ BranchFixed(&StubCode::AllocateArrayLabel());
+  __ BranchPatchable(&StubCode::InvokeDartCodeLabel());
+  __ BranchPatchable(&StubCode::AllocateArrayLabel());
 }
 
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index cd41415..93c8f84 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -34,6 +34,7 @@
 DECLARE_FLAG(bool, trace_optimization);
 DECLARE_FLAG(bool, trace_constant_propagation);
 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
+DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
 Definition::Definition()
     : range_(NULL),
@@ -410,11 +411,12 @@
 static bool CompareNames(const Library& lib,
                          const char* test_name,
                          const String& name) {
+  ASSERT(Library::kPrivateIdentifierStart == '_');
   const char* kPrivateGetterPrefix = "get:_";
   const char* kPrivateSetterPrefix = "set:_";
 
-  if (test_name[0] == '_') {
-    if (name.CharAt(0) != '_') {
+  if (test_name[0] == Library::kPrivateIdentifierStart) {
+    if (name.CharAt(0) != Library::kPrivateIdentifierStart) {
       return false;
     }
   } else if (strncmp(test_name,
@@ -435,8 +437,18 @@
   }
 
   // Both names are private. Mangle test_name before comparison.
-  const String& test_name_symbol = String::Handle(Symbols::New(test_name));
-  return String::Handle(lib.PrivateName(test_name_symbol)).Equals(name);
+  // Check if this is a constructor (e.g., List,), in which case the mangler
+  // needs some help (see comment in Library::PrivateName).
+  String& test_name_symbol = String::Handle();
+  if (test_name[strlen(test_name) - 1] == '.') {
+    test_name_symbol = Symbols::New(test_name, strlen(test_name) - 1);
+    test_name_symbol = lib.PrivateName(test_name_symbol);
+    test_name_symbol = String::Concat(test_name_symbol, Symbols::Dot());
+  } else {
+    test_name_symbol = Symbols::New(test_name);
+    test_name_symbol = lib.PrivateName(test_name_symbol);
+  }
+  return test_name_symbol.Equals(name);
 }
 
 
@@ -643,6 +655,11 @@
 }
 
 
+void BackwardInstructionIterator::RemoveCurrentFromGraph() {
+  current_ = current_->RemoveFromGraph(false);  // Set current_ to next.
+}
+
+
 // Default implementation of visiting basic blocks.  Can be overridden.
 void FlowGraphVisitor::VisitBlocks() {
   ASSERT(current_iterator_ == NULL);
@@ -2873,6 +2890,17 @@
 }
 
 
+bool PhiInstr::IsRedundant() const {
+  ASSERT(InputCount() > 1);
+  Definition* first = InputAt(0)->definition();
+  for (intptr_t i = 1; i < InputCount(); ++i) {
+    Definition* def = InputAt(i)->definition();
+    if (def != first) return false;
+  }
+  return true;
+}
+
+
 static bool SymbolicSub(const RangeBoundary& a,
                         const RangeBoundary& b,
                         RangeBoundary* result) {
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 1b4b7d8..f1a82f1 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -43,6 +43,7 @@
   V(Object, get:_cid, ObjectCid, 1498751301)                                   \
   V(_TypedListBase, get:_cid, TypedListBaseCid, 1938244762)                    \
   V(_List, get:length, ObjectArrayLength, 215183186)                           \
+  V(_List, _List., ObjectArrayConstructor, 176587978)                          \
   V(_ImmutableList, get:length, ImmutableArrayLength, 578762861)               \
   V(_TypedList, get:length, TypedDataLength, 26646119)                         \
   V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 272598802)                     \
@@ -89,7 +90,7 @@
   V(::, cos, MathCos, 1282146521)                                              \
   V(::, min, MathMin, 1022567780)                                              \
   V(::, max, MathMax, 612058870)                                               \
-  V(::, _doublePow, MathDoublePow, 2125162289)                                 \
+  V(::, _doublePow, MathDoublePow, 342259456)                                  \
   V(Float32x4, Float32x4., Float32x4Constructor, 1314950569)                   \
   V(Float32x4, Float32x4.zero, Float32x4Zero, 1432281809)                      \
   V(Float32x4, Float32x4.splat, Float32x4Splat, 1148280442)                    \
@@ -201,6 +202,7 @@
   V(_GrowableList, forEach, GrowableArrayForEach, 195359970)                   \
   V(_List, [], ObjectArrayGetIndexed, 675155875)                               \
   V(_List, []=, ObjectArraySetIndexed, 1228569706)                             \
+  V(_List, get:isEmpty, ObjectArrayIsEmpty, 1082804442)                        \
   V(_ImmutableList, [], ImmutableArrayGetIndexed, 1768793932)                  \
   V(_GrowableList, [], GrowableArrayGetIndexed, 1282104248)                    \
   V(_GrowableList, []=, GrowableArraySetIndexed, 807019110)                    \
@@ -1473,6 +1475,8 @@
 
   bool Done() const { return current_ == block_entry_; }
 
+  void RemoveCurrentFromGraph();
+
   Instruction* Current() const { return current_; }
 
  private:
@@ -1592,6 +1596,7 @@
 
   // Direct access to phis_ in order to resize it due to phi elimination.
   friend class ConstantPropagator;
+  friend class DeadCodeElimination;
 
   virtual void ClearPredecessors() { predecessors_.Clear(); }
   virtual void AddPredecessor(BlockEntryInstr* predecessor);
@@ -1996,6 +2001,9 @@
 
   virtual bool MayThrow() const { return false; }
 
+  // A phi is redundant if all input operands are the same.
+  bool IsRedundant() const;
+
  private:
   // Direct access to inputs_ in order to resize it due to unreachable
   // predecessors.
@@ -3758,6 +3766,7 @@
 
   Value* instance() const { return inputs_[kInstancePos]; }
   Value* value() const { return inputs_[kValuePos]; }
+  bool is_initialization() const { return is_initialization_; }
   virtual intptr_t token_pos() const { return token_pos_; }
 
   virtual CompileType* ComputeInitialType() const;
@@ -4058,7 +4067,7 @@
   virtual intptr_t token_pos() const { return token_pos_; }
 
   virtual CompileType ComputeType() const;
-  // Issues a static call to Dart code whihc calls toString on objects.
+  // Issues a static call to Dart code which calls toString on objects.
   virtual EffectSet Effects() const { return EffectSet::All(); }
   virtual bool CanDeoptimize() const { return true; }
   virtual bool MayThrow() const { return true; }
@@ -4362,18 +4371,20 @@
   DECLARE_INSTRUCTION(CreateArray)
   virtual CompileType ComputeType() const;
 
-
   virtual intptr_t token_pos() const { return token_pos_; }
   Value* element_type() const { return inputs_[kElementTypePos]; }
   Value* num_elements() const { return inputs_[kLengthPos]; }
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
-  virtual bool CanDeoptimize() const { return false; }
+  // Throw needs environment, which is created only if instruction can
+  // deoptimize.
+  virtual bool CanDeoptimize() const { return MayThrow(); }
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return false; }
+  // OutOfMemoryError can be called.
+  virtual bool MayThrow() const { return true; }
 
   virtual AliasIdentity Identity() const { return identity_; }
   virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
@@ -7437,10 +7448,11 @@
 
   virtual bool MayThrow() const { return false; }
 
- private:
   static const intptr_t kSavedSpTempIndex = 0;
   static const intptr_t kObjectTempIndex = 1;
   static const intptr_t kDoubleTempIndex = 2;
+
+ private:
   virtual void RawSetInputAt(intptr_t i, Value* value) {
     (*inputs_)[i] = value;
   }
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 2d4b5ba..34df2e3 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -290,7 +290,8 @@
 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // The register allocator drops constant definitions that have no uses.
   if (!locs()->out(0).IsInvalid()) {
-    if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
+    if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0) &&
+        TargetCPUFeatures::neon_supported()) {
       const QRegister dst = locs()->out(0).fpu_reg();
       __ veorq(dst, dst, dst);
     } else {
@@ -979,7 +980,7 @@
   Register result = locs()->out(0).reg();
   __ ldr(result, FieldAddress(str, String::length_offset()));
   __ cmp(result, ShifterOperand(Smi::RawValue(1)));
-  __ LoadImmediate(result, Smi::RawValue(-1), NE);
+  __ LoadImmediate(result, -1, NE);
   __ ldrb(result, FieldAddress(str, OneByteString::data_offset()), EQ);
   __ SmiTag(result);
 }
@@ -1135,7 +1136,11 @@
   // The smi index is either untagged (element size == 1), or it is left smi
   // tagged (for all element sizes > 1).
   // TODO(regis): Revisit and see if the index can be immediate.
-  locs->set_in(1, Location::WritableRegister());
+  if (index_scale() == 2 && IsExternal()) {
+    locs->set_in(1, Location::RequiresRegister());
+  } else {
+    locs->set_in(1, Location::WritableRegister());
+  }
   if ((representation() == kUnboxedDouble)    ||
       (representation() == kUnboxedFloat32x4) ||
       (representation() == kUnboxedInt32x4)   ||
@@ -1156,54 +1161,38 @@
 
 
 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register array = locs()->in(0).reg();
-  Location index = locs()->in(1);
-
-  Address element_address(kNoRegister, 0);
-  ASSERT(index.IsRegister());  // TODO(regis): Revisit.
-  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
-  // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
-  // index is expected to be untagged before accessing.
-  ASSERT(kSmiTagShift == 1);
-  switch (index_scale()) {
-    case 1: {
-      __ SmiUntag(index.reg());
-      break;
-    }
-    case 2: {
-      break;
-    }
-    case 4: {
-      __ mov(index.reg(), ShifterOperand(index.reg(), LSL, 1));
-      break;
-    }
-    case 8: {
-      __ mov(index.reg(), ShifterOperand(index.reg(), LSL, 2));
-      break;
-    }
-    case 16: {
-      __ mov(index.reg(), ShifterOperand(index.reg(), LSL, 3));
-      break;
-    }
-    default:
-      UNREACHABLE();
-  }
-
-  if (!IsExternal()) {
-    ASSERT(this->array()->definition()->representation() == kTagged);
-    __ AddImmediate(index.reg(),
-        FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag);
-  }
-  element_address = Address(array, index.reg(), LSL, 0);
-
   if ((representation() == kUnboxedDouble)    ||
       (representation() == kUnboxedMint)      ||
       (representation() == kUnboxedFloat32x4) ||
       (representation() == kUnboxedInt32x4)   ||
       (representation() == kUnboxedFloat64x2)) {
+    Register array = locs()->in(0).reg();
+    Register idx = locs()->in(1).reg();
+    switch (index_scale()) {
+      case 1:
+        __ add(idx, array, ShifterOperand(idx, ASR, kSmiTagSize));
+        break;
+      case 4:
+        __ add(idx, array, ShifterOperand(idx, LSL, 1));
+        break;
+      case 8:
+        __ add(idx, array, ShifterOperand(idx, LSL, 2));
+        break;
+      case 16:
+        __ add(idx, array, ShifterOperand(idx, LSL, 3));
+        break;
+      default:
+        // Case 2 is not reachable: We don't have unboxed 16-bit sized loads.
+        UNREACHABLE();
+    }
+    if (!IsExternal()) {
+      ASSERT(this->array()->definition()->representation() == kTagged);
+      __ AddImmediate(idx,
+          FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag);
+    }
+    Address element_address(idx);
     const QRegister result = locs()->out(0).fpu_reg();
     const DRegister dresult0 = EvenDRegisterOf(result);
-    const Register idx = index.reg();
     switch (class_id()) {
       case kTypedDataInt32ArrayCid:
         __ veorq(result, result, result);
@@ -1225,26 +1214,59 @@
       case kTypedDataFloat32ArrayCid:
         // Load single precision float.
         // vldrs does not support indexed addressing.
-        __ add(index.reg(), index.reg(), ShifterOperand(array));
-        element_address = Address(index.reg(), 0);
         __ vldrs(EvenSRegisterOf(dresult0), element_address);
         break;
       case kTypedDataFloat64ArrayCid:
         // vldrd does not support indexed addressing.
-        __ add(index.reg(), index.reg(), ShifterOperand(array));
-        element_address = Address(index.reg(), 0);
         __ vldrd(dresult0, element_address);
         break;
       case kTypedDataFloat64x2ArrayCid:
       case kTypedDataInt32x4ArrayCid:
       case kTypedDataFloat32x4ArrayCid:
-        __ add(index.reg(), index.reg(), ShifterOperand(array));
-        __ vldmd(IA, index.reg(), dresult0, 2);
+        __ vldmd(IA, idx, dresult0, 2);
         break;
     }
     return;
   }
 
+  Register array = locs()->in(0).reg();
+  Location index = locs()->in(1);
+  ASSERT(index.IsRegister());  // TODO(regis): Revisit.
+  Address element_address(kNoRegister, 0);
+  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
+  // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
+  // index is expected to be untagged before accessing.
+  ASSERT(kSmiTagShift == 1);
+  const intptr_t offset = IsExternal()
+      ? 0
+      : FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag;
+  switch (index_scale()) {
+    case 1: {
+      __ add(index.reg(), array, ShifterOperand(index.reg(), ASR, kSmiTagSize));
+      element_address = Address(index.reg(), offset);
+      break;
+    }
+    case 2: {
+      // No scaling needed, since index is a smi.
+      if (!IsExternal()) {
+        __ AddImmediate(index.reg(), index.reg(),
+            FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag);
+        element_address = Address(array, index.reg(), LSL, 0);
+      } else {
+        element_address = Address(array, index.reg(), LSL, 0);
+      }
+      break;
+    }
+    case 4: {
+      __ add(index.reg(), array, ShifterOperand(index.reg(), LSL, 1));
+      element_address = Address(index.reg(), offset);
+      break;
+    }
+    // Cases 8 and 16 are only for unboxed values and are handled above.
+    default:
+      UNREACHABLE();
+  }
+
   Register result = locs()->out(0).reg();
   switch (class_id()) {
     case kTypedDataInt8ArrayCid:
@@ -1387,6 +1409,61 @@
 
 
 void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if ((class_id() == kTypedDataFloat32ArrayCid) ||
+      (class_id() == kTypedDataFloat64ArrayCid) ||
+      (class_id() == kTypedDataFloat32x4ArrayCid) ||
+      (class_id() == kTypedDataFloat64x2ArrayCid) ||
+      (class_id() == kTypedDataInt32x4ArrayCid)) {
+    Register array = locs()->in(0).reg();
+    Register idx = locs()->in(1).reg();
+    Location value = locs()->in(2);
+    switch (index_scale()) {
+      case 1:
+        __ add(idx, array, ShifterOperand(idx, ASR, kSmiTagSize));
+        break;
+      case 4:
+        __ add(idx, array, ShifterOperand(idx, LSL, 1));
+        break;
+      case 8:
+        __ add(idx, array, ShifterOperand(idx, LSL, 2));
+        break;
+      case 16:
+        __ add(idx, array, ShifterOperand(idx, LSL, 3));
+        break;
+      default:
+        // Case 2 is not reachable: We don't have unboxed 16-bit sized loads.
+        UNREACHABLE();
+    }
+    if (!IsExternal()) {
+      ASSERT(this->array()->definition()->representation() == kTagged);
+      __ AddImmediate(idx,
+          FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag);
+    }
+    switch (class_id()) {
+      case kTypedDataFloat32ArrayCid: {
+        SRegister value_reg =
+            EvenSRegisterOf(EvenDRegisterOf(value.fpu_reg()));
+        __ StoreSToOffset(value_reg, idx, 0);
+        break;
+      }
+      case kTypedDataFloat64ArrayCid: {
+        DRegister value_reg = EvenDRegisterOf(value.fpu_reg());
+        __ StoreDToOffset(value_reg, idx, 0);
+        break;
+      }
+      case kTypedDataFloat64x2ArrayCid:
+      case kTypedDataInt32x4ArrayCid:
+      case kTypedDataFloat32x4ArrayCid: {
+        const DRegister value_reg = EvenDRegisterOf(value.fpu_reg());
+        __ vstmd(IA, idx, value_reg, 2);
+        break;
+      }
+      default:
+        UNREACHABLE();
+    }
+    return;
+  }
+
   Register array = locs()->in(0).reg();
   Location index = locs()->in(1);
 
@@ -1396,35 +1473,34 @@
   // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
   // index is expected to be untagged before accessing.
   ASSERT(kSmiTagShift == 1);
+  const intptr_t offset = IsExternal()
+      ? 0
+      : FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag;
   switch (index_scale()) {
     case 1: {
-      __ SmiUntag(index.reg());
+      __ add(index.reg(), array, ShifterOperand(index.reg(), ASR, kSmiTagSize));
+      element_address = Address(index.reg(), offset);
       break;
     }
     case 2: {
+      // No scaling needed, since index is a smi.
+      if (!IsExternal()) {
+        __ AddImmediate(index.reg(), index.reg(), offset);
+        element_address = Address(array, index.reg(), LSL, 0);
+      } else {
+        element_address = Address(array, index.reg(), LSL, 0);
+      }
       break;
     }
     case 4: {
-      __ mov(index.reg(), ShifterOperand(index.reg(), LSL, 1));
+      __ add(index.reg(), array, ShifterOperand(index.reg(), LSL, 1));
+      element_address = Address(index.reg(), offset);
       break;
     }
-    case 8: {
-      __ mov(index.reg(), ShifterOperand(index.reg(), LSL, 2));
-      break;
-    }
-    case 16: {
-      __ mov(index.reg(), ShifterOperand(index.reg(), LSL, 3));
-      break;
-    }
+    // Cases 8 and 16 are only for unboxed values and are handled above.
     default:
       UNREACHABLE();
   }
-  if (!IsExternal()) {
-    ASSERT(this->array()->definition()->representation() == kTagged);
-    __ AddImmediate(index.reg(),
-        FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag);
-  }
-  element_address = Address(array, index.reg(), LSL, 0);
 
   switch (class_id()) {
     case kArrayCid:
@@ -1504,28 +1580,6 @@
       }
       break;
     }
-    case kTypedDataFloat32ArrayCid: {
-      SRegister value =
-          EvenSRegisterOf(EvenDRegisterOf(locs()->in(2).fpu_reg()));
-      __ add(index.reg(), index.reg(), ShifterOperand(array));
-      __ StoreSToOffset(value, index.reg(), 0);
-      break;
-    }
-    case kTypedDataFloat64ArrayCid: {
-      DRegister in2 = EvenDRegisterOf(locs()->in(2).fpu_reg());
-      __ add(index.reg(), index.reg(), ShifterOperand(array));
-      __ StoreDToOffset(in2, index.reg(), 0);
-      break;
-    }
-    case kTypedDataFloat64x2ArrayCid:
-    case kTypedDataInt32x4ArrayCid:
-    case kTypedDataFloat32x4ArrayCid: {
-      const QRegister in = locs()->in(2).fpu_reg();
-      const DRegister din0 = EvenDRegisterOf(in);
-      __ add(index.reg(), index.reg(), ShifterOperand(array));
-      __ vstmd(IA, index.reg(), din0, 2);
-      break;
-    }
     default:
       UNREACHABLE();
   }
@@ -2046,12 +2100,7 @@
                          FieldAddress(instance_reg, offset_in_bytes_),
                          temp2);
       __ Bind(&copy_double);
-      __ LoadDFromOffset(fpu_temp,
-                         value_reg,
-                         Double::value_offset() - kHeapObjectTag);
-      __ StoreDToOffset(fpu_temp,
-                        temp,
-                        Double::value_offset() - kHeapObjectTag);
+      __ CopyDoubleField(temp, value_reg, TMP, temp2, fpu_temp);
       __ b(&skip_store);
     }
 
@@ -2077,10 +2126,7 @@
                          FieldAddress(instance_reg, offset_in_bytes_),
                          temp2);
       __ Bind(&copy_float32x4);
-      __ LoadMultipleDFromOffset(fpu_temp, 2, value_reg,
-          Float32x4::value_offset() - kHeapObjectTag);
-      __ StoreMultipleDToOffset(fpu_temp, 2, temp,
-          Float32x4::value_offset() - kHeapObjectTag);
+      __ CopyFloat32x4Field(temp, value_reg, TMP, temp2, fpu_temp);
       __ b(&skip_store);
     }
 
@@ -2106,10 +2152,7 @@
                          FieldAddress(instance_reg, offset_in_bytes_),
                          temp2);
       __ Bind(&copy_float64x2);
-      __ LoadMultipleDFromOffset(fpu_temp, 2, value_reg,
-          Float64x2::value_offset() - kHeapObjectTag);
-      __ StoreMultipleDToOffset(fpu_temp, 2, temp,
-          Float64x2::value_offset() - kHeapObjectTag);
+      __ CopyFloat64x2Field(temp, value_reg, TMP, temp2, fpu_temp);
       __ b(&skip_store);
     }
 
@@ -2225,15 +2268,115 @@
 }
 
 
+// Inlines array allocation for known constant values.
+static void InlineArrayAllocation(FlowGraphCompiler* compiler,
+                                   intptr_t num_elements,
+                                   Label* slow_path,
+                                   Label* done) {
+  const Register kLengthReg = R2;
+  const Register kElemTypeReg = R1;
+  const intptr_t kArraySize = Array::InstanceSize(num_elements);
+
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
+
+  __ LoadImmediate(R6, heap->TopAddress());
+  __ ldr(R0, Address(R6, 0));  // Potential new object start.
+  __ AddImmediate(R7, R0, kArraySize);  // Potential next object start.
+  __ b(slow_path, VS);
+
+  // Check if the allocation fits into the remaining space.
+  // R0: potential new object start.
+  // R7: potential next object start.
+  __ LoadImmediate(R3, heap->EndAddress());
+  __ ldr(R3, Address(R3, 0));
+  __ cmp(R7, ShifterOperand(R3));
+  __ b(slow_path, CS);
+
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  __ str(R7, Address(R6, 0));
+  __ add(R0, R0, ShifterOperand(kHeapObjectTag));
+  __ LoadImmediate(R8, heap->TopAddress());
+  __ UpdateAllocationStatsWithSize(kArrayCid, R8, R4);
+
+
+  // Initialize the tags.
+  // R0: new object start as a tagged pointer.
+  {
+    uword tags = 0;
+    tags = RawObject::ClassIdTag::update(kArrayCid, tags);
+    tags = RawObject::SizeTag::update(kArraySize, tags);
+    __ LoadImmediate(R8, tags);
+    __ str(R8, FieldAddress(R0, Array::tags_offset()));  // Store tags.
+  }
+  // R0: new object start as a tagged pointer.
+  // R7: new object end address.
+
+  // Store the type argument field.
+  __ StoreIntoObjectNoBarrier(R0,
+                              FieldAddress(R0, Array::type_arguments_offset()),
+                              kElemTypeReg);
+
+  // Set the length field.
+  __ StoreIntoObjectNoBarrier(R0,
+                              FieldAddress(R0, Array::length_offset()),
+                              kLengthReg);
+
+  // Initialize all array elements to raw_null.
+  // R0: new object start as a tagged pointer.
+  // R7: new object end address.
+  // R8: iterator which initially points to the start of the variable
+  // data area to be initialized.
+  // R3: null
+  __ LoadImmediate(R3, reinterpret_cast<intptr_t>(Object::null()));
+  __ AddImmediate(R8, R0, sizeof(RawArray) - kHeapObjectTag);
+
+  Label init_loop;
+  __ Bind(&init_loop);
+  __ cmp(R8, ShifterOperand(R7));
+  __ str(R3, Address(R8, 0), CC);
+  __ AddImmediate(R8, kWordSize, CC);
+  __ b(&init_loop, CC);
+  __ b(done);
+}
+
+
 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  // Allocate the array.  R2 = length, R1 = element type.
-  ASSERT(locs()->in(kElementTypePos).reg() == R1);
-  ASSERT(locs()->in(kLengthPos).reg() == R2);
+  const Register kLengthReg = R2;
+  const Register kElemTypeReg = R1;
+  const Register kResultReg = R0;
+
+  ASSERT(locs()->in(kElementTypePos).reg() == kElemTypeReg);
+  ASSERT(locs()->in(kLengthPos).reg() == kLengthReg);
+
+  if (num_elements()->BindsToConstant() &&
+      num_elements()->BoundConstant().IsSmi()) {
+    const intptr_t length = Smi::Cast(num_elements()->BoundConstant()).Value();
+    if ((length >= 0) && (length <= Array::kMaxElements)) {
+      Label slow_path, done;
+      InlineArrayAllocation(compiler, length, &slow_path, &done);
+      __ Bind(&slow_path);
+      __ PushObject(Object::ZoneHandle());  // Make room for the result.
+      __ Push(kLengthReg);  // length.
+      __ Push(kElemTypeReg);
+      compiler->GenerateRuntimeCall(token_pos(),
+                                    deopt_id(),
+                                    kAllocateArrayRuntimeEntry,
+                                    2,
+                                    locs());
+      __ Drop(2);
+      __ Pop(kResultReg);
+      __ Bind(&done);
+      return;
+    }
+  }
+
   compiler->GenerateCall(token_pos(),
                          &StubCode::AllocateArrayLabel(),
                          PcDescriptors::kOther,
                          locs());
-  ASSERT(locs()->out(0).reg() == R0);
+  ASSERT(locs()->out(0).reg() == kResultReg);
 }
 
 
@@ -2351,6 +2494,7 @@
     locs->AddTemp(opt ? Location::RequiresFpuRegister()
                       : Location::FpuRegisterLocation(Q1));
     locs->AddTemp(Location::RequiresRegister());
+    locs->AddTemp(Location::RequiresRegister());
   }
   locs->set_out(0, Location::RequiresRegister());
   return locs;
@@ -2358,7 +2502,7 @@
 
 
 void LoadFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register instance_reg = locs()->in(0).reg();
+  const Register instance_reg = locs()->in(0).reg();
   if (IsUnboxedLoad() && compiler->is_optimizing()) {
     const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
     const Register temp = locs()->temp(0).reg();
@@ -2389,8 +2533,9 @@
   Label done;
   Register result_reg = locs()->out(0).reg();
   if (IsPotentialUnboxedLoad()) {
-    const Register temp = locs()->temp(1).reg();
     const DRegister value = EvenDRegisterOf(locs()->temp(0).fpu_reg());
+    const Register temp = locs()->temp(1).reg();
+    const Register temp2 = locs()->temp(2).reg();
 
     Label load_pointer;
     Label load_double;
@@ -2437,10 +2582,7 @@
                      temp);
       __ Bind(slow_path->exit_label());
       __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes()));
-      __ LoadDFromOffset(value, temp, Double::value_offset() - kHeapObjectTag);
-      __ StoreDToOffset(value,
-                        result_reg,
-                        Double::value_offset() - kHeapObjectTag);
+      __ CopyDoubleField(result_reg, temp, TMP, temp2, value);
       __ b(&done);
     }
 
@@ -2455,10 +2597,7 @@
                      temp);
       __ Bind(slow_path->exit_label());
       __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes()));
-      __ LoadMultipleDFromOffset(value, 2, temp,
-          Float32x4::value_offset() - kHeapObjectTag);
-      __ StoreMultipleDToOffset(value, 2, result_reg,
-          Float32x4::value_offset() - kHeapObjectTag);
+      __ CopyFloat32x4Field(result_reg, temp, TMP, temp2, value);
       __ b(&done);
     }
 
@@ -2473,10 +2612,7 @@
                      temp);
       __ Bind(slow_path->exit_label());
       __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes()));
-      __ LoadMultipleDFromOffset(value, 2, temp,
-          Float64x2::value_offset() - kHeapObjectTag);
-      __ StoreMultipleDToOffset(value, 2, result_reg,
-          Float64x2::value_offset() - kHeapObjectTag);
+      __ CopyFloat64x2Field(result_reg, temp, TMP, temp2, value);
       __ b(&done);
     }
 
@@ -2941,12 +3077,8 @@
   if (locs()->in(1).IsConstant()) {
     const Object& constant = locs()->in(1).constant();
     ASSERT(constant.IsSmi());
-    int32_t imm = reinterpret_cast<int32_t>(constant.raw());
+    const int32_t imm = reinterpret_cast<int32_t>(constant.raw());
     switch (op_kind()) {
-      case Token::kSUB: {
-        imm = -imm;  // TODO(regis): What if deopt != NULL && imm == 0x80000000?
-        // Fall through.
-      }
       case Token::kADD: {
         if (deopt == NULL) {
           __ AddImmediate(result, left, imm);
@@ -2956,6 +3088,17 @@
         }
         break;
       }
+      case Token::kSUB: {
+        if (deopt == NULL) {
+          __ AddImmediate(result, left, -imm);
+        } else {
+          // Negating imm and using AddImmediateSetFlags would not detect the
+          // overflow when imm == kMinInt32.
+          __ SubImmediateSetFlags(result, left, imm);
+          __ b(deopt, VS);
+        }
+        break;
+      }
       case Token::kMUL: {
         // Keep left value tagged and untag right value.
         const intptr_t value = Smi::Cast(constant).Value();
@@ -3026,8 +3169,9 @@
         ShifterOperand shifter_op;
         if (ShifterOperand::CanHold(imm, &shifter_op)) {
           __ and_(result, left, shifter_op);
+        } else if (ShifterOperand::CanHold(~imm, &shifter_op)) {
+          __ bic(result, left, shifter_op);
         } else {
-          // TODO(regis): Try to use bic.
           __ LoadImmediate(IP, imm);
           __ and_(result, left, ShifterOperand(IP));
         }
@@ -3039,7 +3183,6 @@
         if (ShifterOperand::CanHold(imm, &shifter_op)) {
           __ orr(result, left, shifter_op);
         } else {
-          // TODO(regis): Try to use orn.
           __ LoadImmediate(IP, imm);
           __ orr(result, left, ShifterOperand(IP));
         }
@@ -3072,7 +3215,9 @@
         }
 
         value = value + kSmiTagSize;
-        if (value >= kCountLimit) value = kCountLimit;
+        if (value >= kCountLimit) {
+          value = kCountLimit;
+        }
 
         __ Asr(result, left, value);
         __ SmiTag(result);
@@ -3256,7 +3401,9 @@
   intptr_t right_cid = right()->Type()->ToCid();
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
-  if (left_cid == kSmiCid) {
+  if (this->left()->definition() == this->right()->definition()) {
+    __ tst(left, ShifterOperand(kSmiTagMask));
+  } else if (left_cid == kSmiCid) {
     __ tst(right, ShifterOperand(kSmiTagMask));
   } else if (right_cid == kSmiCid) {
     __ tst(left, ShifterOperand(kSmiTagMask));
@@ -4749,12 +4896,12 @@
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
     summary->set_in(0, Location::FpuRegisterLocation(Q0));
     summary->set_out(0, Location::FpuRegisterLocation(Q0));
-#if !defined(ARM_FLOAT_ABI_HARD)
-    summary->AddTemp(Location::RegisterLocation(R0));
-    summary->AddTemp(Location::RegisterLocation(R1));
-    summary->AddTemp(Location::RegisterLocation(R2));
-    summary->AddTemp(Location::RegisterLocation(R3));
-#endif
+    if (!TargetCPUFeatures::hardfp_supported()) {
+      summary->AddTemp(Location::RegisterLocation(R0));
+      summary->AddTemp(Location::RegisterLocation(R1));
+      summary->AddTemp(Location::RegisterLocation(R2));
+      summary->AddTemp(Location::RegisterLocation(R3));
+    }
     return summary;
   }
   ASSERT((kind() == MathUnaryInstr::kSqrt) ||
@@ -4781,18 +4928,18 @@
   } else {
     ASSERT((kind() == MathUnaryInstr::kSin) ||
            (kind() == MathUnaryInstr::kCos));
-#if defined(ARM_FLOAT_ABI_HARD)
-    __ CallRuntime(TargetFunction(), InputCount());
-#else
-    // If we aren't doing "hardfp", then we have to move the double arguments
-    // to the integer registers, and take the results from the integer
-    // registers.
-    __ vmovrrd(R0, R1, D0);
-    __ vmovrrd(R2, R3, D1);
-    __ CallRuntime(TargetFunction(), InputCount());
-    __ vmovdrr(D0, R0, R1);
-    __ vmovdrr(D1, R2, R3);
-#endif
+    if (TargetCPUFeatures::hardfp_supported()) {
+      __ CallRuntime(TargetFunction(), InputCount());
+      } else {
+      // If we aren't doing "hardfp", then we have to move the double arguments
+      // to the integer registers, and take the results from the integer
+      // registers.
+      __ vmovrrd(R0, R1, D0);
+      __ vmovrrd(R2, R3, D1);
+      __ CallRuntime(TargetFunction(), InputCount());
+      __ vmovdrr(D0, R0, R1);
+      __ vmovdrr(D1, R2, R3);
+    }
   }
 }
 
@@ -5019,8 +5166,8 @@
 
 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
-  Register result = locs()->out(0).reg();
-  DRegister value = EvenDRegisterOf(locs()->in(0).fpu_reg());
+  const Register result = locs()->out(0).reg();
+  const DRegister value = EvenDRegisterOf(locs()->in(0).fpu_reg());
   // First check for NaN. Checking for minint after the conversion doesn't work
   // on ARM because vcvtid gives 0 for NaN.
   __ vcmpd(value, value);
@@ -5096,115 +5243,175 @@
   }
   if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
     result->AddTemp(Location::RegisterLocation(R2));
-    result->AddTemp(Location::FpuRegisterLocation(Q2));
   }
-#if !defined(ARM_FLOAT_ABI_HARD)
-  result->AddTemp(Location::RegisterLocation(R0));
-  result->AddTemp(Location::RegisterLocation(R1));
-  // Check if R2 is already added.
-  if (recognized_kind() != MethodRecognizer::kMathDoublePow) {
-    result->AddTemp(Location::RegisterLocation(R2));
+  if (!TargetCPUFeatures::hardfp_supported()) {
+    result->AddTemp(Location::RegisterLocation(R0));
+    result->AddTemp(Location::RegisterLocation(R1));
+    // Check if R2 is already added.
+    if (recognized_kind() != MethodRecognizer::kMathDoublePow) {
+      result->AddTemp(Location::RegisterLocation(R2));
+    }
+    result->AddTemp(Location::RegisterLocation(R3));
   }
-  result->AddTemp(Location::RegisterLocation(R3));
-#endif
   result->set_out(0, Location::FpuRegisterLocation(Q0));
   return result;
 }
 
 
+// Pseudo code:
+// if (exponent == 0.0) return 1.0;
+// // Speed up simple cases.
+// if (exponent == 1.0) return base;
+// if (exponent == 2.0) return base * base;
+// if (exponent == 3.0) return base * base * base;
+// if (base == 1.0) return 1.0;
+// if (base.isNaN || exponent.isNaN) {
+//    return double.NAN;
+// }
+// if (base != -Infinity && exponent == 0.5) {
+//   if (base == 0.0) return 0.0;
+//   return sqrt(value);
+// }
+// TODO(srdjan): Move into a stub?
+static void InvokeDoublePow(FlowGraphCompiler* compiler,
+                            InvokeMathCFunctionInstr* instr) {
+  ASSERT(instr->recognized_kind() == MethodRecognizer::kMathDoublePow);
+  const intptr_t kInputCount = 2;
+  ASSERT(instr->InputCount() == kInputCount);
+  LocationSummary* locs = instr->locs();
+
+  const DRegister base = EvenDRegisterOf(locs->in(0).fpu_reg());
+  const DRegister exp = EvenDRegisterOf(locs->in(1).fpu_reg());
+  const DRegister result = EvenDRegisterOf(locs->out(0).fpu_reg());
+  const Register temp = locs->temp(0).reg();
+  const DRegister saved_base = OddDRegisterOf(locs->in(0).fpu_reg());
+  ASSERT((base == result) && (result != saved_base));
+
+  Label skip_call, try_sqrt, check_base, return_nan;
+  __ vmovd(saved_base, base);
+  __ LoadDImmediate(result, 1.0, temp);
+  // exponent == 0.0 -> return 1.0;
+  __ vcmpdz(exp);
+  __ vmstat();
+  __ b(&check_base, VS);  // NaN -> check base.
+  __ b(&skip_call, EQ);  // exp is 0.0, result is 1.0.
+
+  // exponent == 1.0 ?
+  __ vcmpd(exp, result);
+  __ vmstat();
+  Label return_base;
+  __ b(&return_base, EQ);
+
+  // exponent == 2.0 ?
+  __ LoadDImmediate(DTMP, 2.0, temp);
+  __ vcmpd(exp, DTMP);
+  __ vmstat();
+  Label return_base_times_2;
+  __ b(&return_base_times_2, EQ);
+
+  // exponent == 3.0 ?
+  __ LoadDImmediate(DTMP, 3.0, temp);
+  __ vcmpd(exp, DTMP);
+  __ vmstat();
+  __ b(&check_base, NE);
+
+  // base_times_3.
+  __ vmuld(result, saved_base, saved_base);
+  __ vmuld(result, result, saved_base);
+  __ b(&skip_call);
+
+  __ Bind(&return_base);
+  __ vmovd(result, saved_base);
+  __ b(&skip_call);
+
+  __ Bind(&return_base_times_2);
+  __ vmuld(result, saved_base, saved_base);
+  __ b(&skip_call);
+
+  __ Bind(&check_base);
+  // Note: 'exp' could be NaN.
+  // base == 1.0 -> return 1.0;
+  __ vcmpd(saved_base, result);
+  __ vmstat();
+  __ b(&return_nan, VS);
+  __ b(&skip_call, EQ);  // base is 1.0, result is 1.0.
+
+  __ vcmpd(saved_base, exp);
+  __ b(&try_sqrt, VC);  // // Neither 'exp' nor 'base' is NaN.
+
+  __ Bind(&return_nan);
+  __ LoadDImmediate(result, NAN, temp);
+  __ b(&skip_call);
+
+  Label do_pow, return_zero;
+  __ Bind(&try_sqrt);
+
+  // Before calling pow, check if we could use sqrt instead of pow.
+  __ LoadDImmediate(result, -INFINITY, temp);
+
+  // base == -Infinity -> call pow;
+  __ vcmpd(saved_base, result);
+  __ b(&do_pow, EQ);
+
+  // exponent == 0.5 ?
+  __ LoadDImmediate(result, 0.5, temp);
+  __ vcmpd(exp, result);
+  __ b(&do_pow, NE);
+
+  // base == 0 -> return 0;
+  __ vcmpdz(saved_base);
+  __ b(&return_zero, EQ);
+
+  __ vsqrtd(result, saved_base);
+  __ b(&skip_call);
+
+  __ Bind(&return_zero);
+  __ LoadDImmediate(result, 0.0, temp);
+  __ b(&skip_call);
+
+  __ Bind(&do_pow);
+  __ vmovd(base, saved_base);  // Restore base.
+
+  // Args must be in D0 and D1, so move arg from Q1(== D3:D2) to D1.
+  __ vmovd(D1, D2);
+  if (TargetCPUFeatures::hardfp_supported()) {
+    __ CallRuntime(instr->TargetFunction(), kInputCount);
+  } else {
+    // If the ABI is not "hardfp", then we have to move the double arguments
+    // to the integer registers, and take the results from the integer
+    // registers.
+    __ vmovrrd(R0, R1, D0);
+    __ vmovrrd(R2, R3, D1);
+    __ CallRuntime(instr->TargetFunction(), kInputCount);
+    __ vmovdrr(D0, R0, R1);
+    __ vmovdrr(D1, R2, R3);
+  }
+  __ Bind(&skip_call);
+}
+
+
 void InvokeMathCFunctionInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  // For pow-function return NaN if exponent is NaN.
-  Label skip_call;
   if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
-    // Pseudo code:
-    // if (exponent == 0.0) return 1.0;
-    // if (base == 1.0) return 1.0;
-    // if (base.isNaN || exponent.isNaN) {
-    //    return double.NAN;
-    // }
-    // if (base != -Infinity && exponent == 0.5) {
-    //   if (base == 0.0) return 0.0;
-    //   return sqrt(value);
-    // }
-    DRegister base = EvenDRegisterOf(locs()->in(0).fpu_reg());
-    DRegister exp = EvenDRegisterOf(locs()->in(1).fpu_reg());
-    DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
-    Register temp = locs()->temp(0).reg();
-    DRegister saved_base = EvenDRegisterOf(locs()->temp(1).fpu_reg());
-    ASSERT((base == result) && (result != saved_base));
-
-    Label try_sqrt, check_base, return_nan;
-    __ vmovd(saved_base, base);
-    __ LoadDImmediate(DTMP, 0.0, temp);
-    __ LoadDImmediate(result, 1.0, temp);
-    // exponent == 0.0 -> return 1.0;
-    __ vcmpd(exp, DTMP);
-    __ vmstat();
-    __ b(&check_base, VS);  // NaN -> check base.
-    __ b(&skip_call, EQ);  // exp is 0.0, result is 1.0.
-
-    __ Bind(&check_base);
-    // Note: 'exp' could be NaN.
-    // base == 1.0 -> return 1.0;
-    __ vcmpd(saved_base, result);
-    __ vmstat();
-    __ b(&return_nan, VS);
-    __ b(&skip_call, EQ);  // base is 1.0, result is 1.0.
-
-    __ vcmpd(saved_base, exp);
-    __ b(&try_sqrt, VC);  // // Neither 'exp' nor 'base' is NaN.
-
-    __ Bind(&return_nan);
-    __ LoadDImmediate(result, NAN, temp);
-    __ b(&skip_call);
-
-    Label do_pow, return_zero;
-    __ Bind(&try_sqrt);
-
-    // Before calling pow, check if we could use sqrt instead of pow.
-    __ LoadDImmediate(result, -INFINITY, temp);
-
-    // base == -Infinity -> call pow;
-    __ vcmpd(saved_base, result);
-    __ b(&do_pow, EQ);
-
-    // exponent == 0.5 ?
-    __ LoadDImmediate(result, 0.5, temp);
-    __ vcmpd(exp, result);
-    __ b(&do_pow, NE);
-
-    // base == 0 -> return 0;
-    __ vcmpd(base, DTMP);
-    __ b(&return_zero, EQ);
-
-    __ vsqrtd(result, saved_base);
-    __ b(&skip_call);
-
-    __ Bind(&return_zero);
-    __ vmovd(result, DTMP);
-    __ b(&skip_call);
-
-    __ Bind(&do_pow);
-    __ vmovd(base, saved_base);  // Restore base.
+    InvokeDoublePow(compiler, this);
+    return;
   }
 
   if (InputCount() == 2) {
     // Args must be in D0 and D1, so move arg from Q1(== D3:D2) to D1.
     __ vmovd(D1, D2);
   }
-#if defined(ARM_FLOAT_ABI_HARD)
-  __ CallRuntime(TargetFunction(), InputCount());
-#else
-  // If the ABI is not "hardfp", then we have to move the double arguments
-  // to the integer registers, and take the results from the integer
-  // registers.
-  __ vmovrrd(R0, R1, D0);
-  __ vmovrrd(R2, R3, D1);
-  __ CallRuntime(TargetFunction(), InputCount());
-  __ vmovdrr(D0, R0, R1);
-  __ vmovdrr(D1, R2, R3);
-#endif
-  __ Bind(&skip_call);
+  if (TargetCPUFeatures::hardfp_supported()) {
+    __ CallRuntime(TargetFunction(), InputCount());
+  } else {
+    // If the ABI is not "hardfp", then we have to move the double arguments
+    // to the integer registers, and take the results from the integer
+    // registers.
+    __ vmovrrd(R0, R1, D0);
+    __ vmovrrd(R2, R3, D1);
+    __ CallRuntime(TargetFunction(), InputCount());
+    __ vmovdrr(D0, R0, R1);
+    __ vmovdrr(D1, R2, R3);
+  }
 }
 
 
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index bcec0ae..ae87f74 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -55,7 +55,7 @@
     } else {
       ASSERT(value.IsStackSlot());
       const intptr_t value_offset = value.ToStackSlotOffset();
-      __ LoadFromOffset(TMP, FP, value_offset);
+      __ LoadFromOffset(TMP, FP, value_offset, PP);
       __ Push(TMP);
     }
   }
@@ -169,7 +169,7 @@
     __ Lsl(result, result, shift + kSmiTagSize);
   } else {
     __ sub(result, result, Operand(1));
-    const int32_t val =
+    const int64_t val =
         Smi::RawValue(true_value) - Smi::RawValue(false_value);
     __ AndImmediate(result, result, val, PP);
     if (false_value != 0) {
@@ -201,12 +201,12 @@
   // R4: Arguments descriptor.
   // R0: Function.
   ASSERT(locs()->in(0).reg() == R0);
-  __ LoadFieldFromOffset(R2, R0, Function::code_offset());
+  __ LoadFieldFromOffset(R2, R0, Function::code_offset(), PP);
 
   // R2: code.
   // R5: Smi 0 (no IC data; the lazy-compile stub expects a GC-safe value).
   __ LoadImmediate(R5, 0, PP);
-  __ LoadFieldFromOffset(R2, R2, Code::instructions_offset());
+  __ LoadFieldFromOffset(R2, R2, Code::instructions_offset(), PP);
   __ AddImmediate(R2, R2, Instructions::HeaderSize() - kHeapObjectTag, PP);
   __ blr(R2);
   compiler->AddCurrentDescriptor(PcDescriptors::kClosureCall,
@@ -238,7 +238,7 @@
 
 void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register result = locs()->out(0).reg();
-  __ LoadFromOffset(result, FP, local().index() * kWordSize);
+  __ LoadFromOffset(result, FP, local().index() * kWordSize, PP);
 }
 
 
@@ -253,7 +253,7 @@
   Register value = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   ASSERT(result == value);  // Assert that register assignment is correct.
-  __ StoreToOffset(value, FP, local().index() * kWordSize);
+  __ StoreToOffset(value, FP, local().index() * kWordSize, PP);
 }
 
 
@@ -470,8 +470,8 @@
 static Condition EmitDoubleComparisonOp(FlowGraphCompiler* compiler,
                                         LocationSummary* locs,
                                         Token::Kind kind) {
-  VRegister left = locs->in(0).fpu_reg();
-  VRegister right = locs->in(1).fpu_reg();
+  const VRegister left = locs->in(0).fpu_reg();
+  const VRegister right = locs->in(1).fpu_reg();
   __ fcmpd(left, right);
   Condition true_condition = TokenKindToDoubleCondition(kind);
   return true_condition;
@@ -491,12 +491,15 @@
 
 void EqualityCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT((kind() == Token::kEQ) || (kind() == Token::kNE));
-
   Label is_true, is_false;
   BranchLabels labels = { &is_true, &is_false, &is_false };
   Condition true_condition = EmitComparisonCode(compiler, labels);
+  if ((operation_cid() == kDoubleCid) && (true_condition != NE)) {
+    // Special case for NaN comparison. Result is always false unless
+    // relational operator is !=.
+    __ b(&is_false, VS);
+  }
   EmitBranchOnCondition(compiler, true_condition, labels);
-
   // TODO(zra): instead of branching, use the csel instruction to get
   // True or False into result.
   Register result = locs()->out(0).reg();
@@ -516,6 +519,11 @@
 
   BranchLabels labels = compiler->CreateBranchLabels(branch);
   Condition true_condition = EmitComparisonCode(compiler, labels);
+  if ((operation_cid() == kDoubleCid) && (true_condition != NE)) {
+    // Special case for NaN comparison. Result is always false unless
+    // relational operator is !=.
+    __ b(labels.false_label, VS);
+  }
   EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
@@ -539,7 +547,7 @@
   Location right = locs()->in(1);
   if (right.IsConstant()) {
     ASSERT(right.constant().IsSmi());
-    const int32_t imm =
+    const int64_t imm =
         reinterpret_cast<int64_t>(right.constant().raw());
     __ TestImmediate(left, imm, PP);
   } else {
@@ -591,7 +599,7 @@
   bool result = data[1] == true_result;
   __ tsti(val_reg, kSmiTagMask);
   __ b(result ? labels.true_label : labels.false_label, EQ);
-  __ LoadClassId(cid_reg, val_reg);
+  __ LoadClassId(cid_reg, val_reg, PP);
 
   for (intptr_t i = 2; i < data.length(); i += 2) {
     const intptr_t test_cid = data[i];
@@ -668,8 +676,8 @@
   if (operation_cid() == kSmiCid) {
     return EmitSmiComparisonOp(compiler, locs(), kind());
   } else {
-    UNIMPLEMENTED();
-    return VS;
+    ASSERT(operation_cid() == kDoubleCid);
+    return EmitDoubleComparisonOp(compiler, locs(), kind());
   }
 }
 
@@ -678,6 +686,11 @@
   Label is_true, is_false;
   BranchLabels labels = { &is_true, &is_false, &is_false };
   Condition true_condition = EmitComparisonCode(compiler, labels);
+  if ((operation_cid() == kDoubleCid) && (true_condition != NE)) {
+    // Special case for NaN comparison. Result is always false unless
+    // relational operator is !=.
+    __ b(&is_false, VS);
+  }
   EmitBranchOnCondition(compiler, true_condition, labels);
   // TODO(zra): instead of branching, use the csel instruction to get
   // True or False into result.
@@ -696,6 +709,11 @@
                                        BranchInstr* branch) {
   BranchLabels labels = compiler->CreateBranchLabels(branch);
   Condition true_condition = EmitComparisonCode(compiler, labels);
+  if ((operation_cid() == kDoubleCid) && (true_condition != NE)) {
+    // Special case for NaN comparison. Result is always false unless
+    // relational operator is !=.
+    __ b(labels.false_label, VS);
+  }
   EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
@@ -771,10 +789,10 @@
 
 
 void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register char_code = locs()->in(0).reg();
-  Register result = locs()->out(0).reg();
-  __ LoadImmediate(result,
-                   reinterpret_cast<uword>(Symbols::PredefinedAddress()), PP);
+  const Register char_code = locs()->in(0).reg();
+  const Register result = locs()->out(0).reg();
+  __ LoadImmediate(
+      result, reinterpret_cast<uword>(Symbols::PredefinedAddress()), PP);
   __ AddImmediate(
       result, result, Symbols::kNullCharCodeSymbolOffset * kWordSize, PP);
   __ Asr(TMP, char_code, kSmiTagShift);  // Untag to use scaled adress mode.
@@ -792,14 +810,13 @@
 
 void StringToCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(cid_ == kOneByteStringCid);
-  Register str = locs()->in(0).reg();
-  Register result = locs()->out(0).reg();
-  __ LoadFieldFromOffset(result, str, String::length_offset());
+  const Register str = locs()->in(0).reg();
+  const Register result = locs()->out(0).reg();
+  __ LoadFieldFromOffset(result, str, String::length_offset(), PP);
+  __ ldr(TMP, FieldAddress(str, OneByteString::data_offset()), kUnsignedByte);
   __ CompareImmediate(result, Smi::RawValue(1), PP);
-  __ LoadImmediate(TMP, Smi::RawValue(-1), PP);
-  __ ldr(TMP2, FieldAddress(str, OneByteString::data_offset()), kUnsignedByte);
-  __ csel(result, TMP, result, NE);
-  __ csel(result, TMP2, result, EQ);
+  __ LoadImmediate(result, -1, PP);
+  __ csel(result, TMP, result, EQ);
   __ SmiTag(result);
 }
 
@@ -831,13 +848,17 @@
 
 
 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  return LocationSummary::Make(kNumInputs,
+                               Location::RequiresRegister(),
+                               LocationSummary::kNoCall);
 }
 
 
 void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register object = locs()->in(0).reg();
+  Register result = locs()->out(0).reg();
+  __ LoadFieldFromOffset(result, object, offset(), PP);
 }
 
 
@@ -858,7 +879,7 @@
   __ LoadImmediate(result, Smi::RawValue(kSmiCid), PP);
   __ b(&done);
   __ Bind(&load);
-  __ LoadClassId(result, object);
+  __ LoadClassId(result, object, PP);
   __ SmiTag(result);
   __ Bind(&done);
 }
@@ -956,61 +977,60 @@
 
 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register array = locs()->in(0).reg();
-  Location index = locs()->in(1);
+  ASSERT(locs()->in(1).IsRegister());  // TODO(regis): Revisit.
+  Register index = locs()->in(1).reg();
 
   Address element_address(kNoRegister, 0);
-  ASSERT(index.IsRegister());  // TODO(regis): Revisit.
+
+  // The array register points to the backing store for external arrays.
+  intptr_t offset = 0;
+  if (!IsExternal()) {
+    ASSERT(this->array()->definition()->representation() == kTagged);
+    offset = FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag;
+  }
+
   // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
   // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
   // index is expected to be untagged before accessing.
   ASSERT(kSmiTagShift == 1);
   switch (index_scale()) {
-    case 1: {
-      __ SmiUntag(index.reg());
+    case 1:
+      __ add(index, array, Operand(index, ASR, kSmiTagSize));
+      element_address = Address(index, offset);
       break;
-    }
-    case 2: {
+    case 2:
+      if (offset != 0) {
+        __ add(index, array, Operand(index));
+        element_address = Address(index, offset);
+      } else {
+        element_address = Address(array, index, UXTX, Address::Unscaled);
+      }
       break;
-    }
-    case 4: {
-      __ Lsl(index.reg(), index.reg(), 1);
+    case 4:
+      __ add(index, array, Operand(index, LSL, 1));
+      element_address = Address(index, offset);
       break;
-    }
-    case 8: {
-      __ Lsl(index.reg(), index.reg(), 2);
+    case 8:
+      __ add(index, array, Operand(index, LSL, 2));
+      element_address = Address(index, offset);
       break;
-    }
-    case 16: {
-      __ Lsl(index.reg(), index.reg(), 3);
+    case 16:
+      __ add(index, array, Operand(index, LSL, 3));
+      element_address = Address(index, offset);
       break;
-    }
     default:
       UNREACHABLE();
   }
 
-  if (!IsExternal()) {
-    ASSERT(this->array()->definition()->representation() == kTagged);
-    __ AddImmediate(index.reg(), index.reg(),
-        FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag, PP);
-  }
-  element_address = Address(array, index.reg(), UXTX, Address::Unscaled);
-
   if ((representation() == kUnboxedDouble)    ||
-      (representation() == kUnboxedMint)      ||
       (representation() == kUnboxedFloat32x4) ||
       (representation() == kUnboxedInt32x4)   ||
       (representation() == kUnboxedFloat64x2)) {
     const VRegister result = locs()->out(0).fpu_reg();
     switch (class_id()) {
-      case kTypedDataInt32ArrayCid:
-      case kTypedDataUint32ArrayCid:
-        // TODO(zra): Add when we have simd.
-        UNIMPLEMENTED();
-        break;
       case kTypedDataFloat32ArrayCid:
         // Load single precision float.
-        // TODO(zra): Add when we add single precision floats.
-        UNIMPLEMENTED();
+        __ fldrs(result, element_address);
         break;
       case kTypedDataFloat64ArrayCid:
         // Load double precision float.
@@ -1019,8 +1039,7 @@
       case kTypedDataFloat64x2ArrayCid:
       case kTypedDataInt32x4ArrayCid:
       case kTypedDataFloat32x4ArrayCid:
-        // TODO(zra): Add when we have simd.
-        UNIMPLEMENTED();
+        __ fldrq(result, element_address);
         break;
     }
     return;
@@ -1083,10 +1102,9 @@
     case kExternalTypedDataUint8ClampedArrayCid:
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid:
-      return kTagged;
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      return value()->IsSmiValue() ? kTagged : kUnboxedMint;
+      return kTagged;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
@@ -1131,27 +1149,16 @@
       break;
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      // Mints are stored in Q registers. For smis, use a writable register
-      // because the value must be untagged before storing.
-      if (value()->IsSmiValue()) {
-        locs->set_in(2, Location::WritableRegister());
-      } else {
-        // TODO(zra): Implement when we add simd loads and stores.
-        UNIMPLEMENTED();
-      }
+      locs->set_in(2, Location::WritableRegister());
       break;
     case kTypedDataFloat32ArrayCid:
-      // TODO(zra): Implement when we add float store.
-      UNIMPLEMENTED();
-      break;
     case kTypedDataFloat64ArrayCid:  // TODO(srdjan): Support Float64 constants.
       locs->set_in(2, Location::RequiresFpuRegister());
       break;
     case kTypedDataInt32x4ArrayCid:
     case kTypedDataFloat32x4ArrayCid:
     case kTypedDataFloat64x2ArrayCid:
-      // TODO(zra): Implement when we add simd loads and stores.
-      UNIMPLEMENTED();
+      locs->set_in(2, Location::RequiresFpuRegister());
       break;
     default:
       UNREACHABLE();
@@ -1162,55 +1169,67 @@
 
 
 void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register array = locs()->in(0).reg();
-  Location index = locs()->in(1);
+  const Register array = locs()->in(0).reg();
+  ASSERT(locs()->in(1).IsRegister());  // TODO(regis): Revisit.
+  Register index = locs()->in(1).reg();
 
   Address element_address(kNoRegister, 0);
-  ASSERT(index.IsRegister());  // TODO(regis): Revisit.
+
+  // The array register points to the backing store for external arrays.
+  intptr_t offset = 0;
+  if (!IsExternal()) {
+    ASSERT(this->array()->definition()->representation() == kTagged);
+    offset = FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag;
+  }
+
   // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
   // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
   // index is expected to be untagged before accessing.
   ASSERT(kSmiTagShift == 1);
   switch (index_scale()) {
     case 1: {
-      __ SmiUntag(index.reg());
+      __ add(index, array, Operand(index, ASR, kSmiTagSize));
+      element_address = Address(index, offset);
       break;
     }
     case 2: {
+      if (offset != 0) {
+        __ add(index, array, Operand(index));
+        element_address = Address(index, offset);
+      } else {
+        element_address = Address(array, index, UXTX, Address::Unscaled);
+      }
       break;
     }
     case 4: {
-      __ Lsl(index.reg(), index.reg(), 1);
+      __ add(index, array, Operand(index, LSL, 1));
+      element_address = Address(index, offset);
       break;
     }
     case 8: {
-      __ Lsl(index.reg(), index.reg(), 2);
+      __ add(index, array, Operand(index, LSL, 2));
+      element_address = Address(index, offset);
       break;
     }
     case 16: {
-      __ Lsl(index.reg(), index.reg(), 3);
+      __ add(index, array, Operand(index, LSL, 3));
+      element_address = Address(index, offset);
       break;
     }
     default:
       UNREACHABLE();
   }
-  if (!IsExternal()) {
-    ASSERT(this->array()->definition()->representation() == kTagged);
-    __ AddImmediate(index.reg(), index.reg(),
-        FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag, PP);
-  }
-  element_address = Address(array, index.reg(), UXTX, Address::Unscaled);
 
   switch (class_id()) {
     case kArrayCid:
       if (ShouldEmitStoreBarrier()) {
-        Register value = locs()->in(2).reg();
+        const Register value = locs()->in(2).reg();
         __ StoreIntoObject(array, element_address, value);
       } else if (locs()->in(2).IsConstant()) {
         const Object& constant = locs()->in(2).constant();
         __ StoreIntoObjectNoBarrier(array, element_address, constant);
       } else {
-        Register value = locs()->in(2).reg();
+        const Register value = locs()->in(2).reg();
         __ StoreIntoObjectNoBarrier(array, element_address, value);
       }
       break;
@@ -1223,7 +1242,7 @@
         __ LoadImmediate(TMP, static_cast<int8_t>(constant.Value()), PP);
         __ str(TMP, element_address, kUnsignedByte);
       } else {
-        Register value = locs()->in(2).reg();
+        const Register value = locs()->in(2).reg();
         __ SmiUntag(value);
         __ str(value, element_address, kUnsignedByte);
       }
@@ -1243,7 +1262,7 @@
         __ LoadImmediate(TMP, static_cast<int8_t>(value), PP);
         __ str(TMP, element_address, kUnsignedByte);
       } else {
-        Register value = locs()->in(2).reg();
+        const Register value = locs()->in(2).reg();
         Label store_value;
         __ SmiUntag(value);
         __ CompareImmediate(value, 0xFF, PP);
@@ -1260,39 +1279,33 @@
     }
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid: {
-      Register value = locs()->in(2).reg();
+      const Register value = locs()->in(2).reg();
       __ SmiUntag(value);
       __ str(value, element_address, kUnsignedHalfword);
       break;
     }
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid: {
-      if (value()->IsSmiValue()) {
-        ASSERT(RequiredInputRepresentation(2) == kTagged);
-        Register value = locs()->in(2).reg();
-        __ SmiUntag(value);
-        __ str(value, element_address);
-      } else {
-        // TODO(zra): Implement when we add simd loads and stores.
-        UNIMPLEMENTED();
-      }
+      const Register value = locs()->in(2).reg();
+      __ SmiUntag(value);
+      __ str(value, element_address, kUnsignedWord);
       break;
     }
-    case kTypedDataFloat32ArrayCid:
-      // TODO(zra): Implement when we add float store.
-      UNIMPLEMENTED();
+    case kTypedDataFloat32ArrayCid: {
+      const VRegister value_reg = locs()->in(2).fpu_reg();
+      __ fstrs(value_reg, element_address);
       break;
+    }
     case kTypedDataFloat64ArrayCid: {
-      VRegister in2 = locs()->in(2).fpu_reg();
-      __ add(index.reg(), index.reg(), Operand(array));
-      __ StoreDToOffset(in2, index.reg(), 0);
+      const VRegister value_reg = locs()->in(2).fpu_reg();
+      __ fstrd(value_reg, element_address);
       break;
     }
     case kTypedDataFloat64x2ArrayCid:
     case kTypedDataInt32x4ArrayCid:
     case kTypedDataFloat32x4ArrayCid: {
-      // TODO(zra): Implement when we add simd loads and stores.
-      UNIMPLEMENTED();
+      const VRegister value_reg = locs()->in(2).fpu_reg();
+      __ fstrq(value_reg, element_address);
       break;
     }
     default:
@@ -1315,7 +1328,7 @@
   } else {
     __ b(value_is_smi, EQ);
   }
-  __ LoadClassId(value_cid_reg, value_reg);
+  __ LoadClassId(value_cid_reg, value_reg, PP);
   __ Bind(&done);
 }
 
@@ -1403,11 +1416,12 @@
         ASSERT(temp_reg != kNoRegister);
         // Field guard may have remembered list length, check it.
         if ((field_cid == kArrayCid) || (field_cid == kImmutableArrayCid)) {
-          __ LoadFieldFromOffset(temp_reg, value_reg, Array::length_offset());
+          __ LoadFieldFromOffset(
+              temp_reg, value_reg, Array::length_offset(), PP);
           __ CompareImmediate(temp_reg, Smi::RawValue(field_length), PP);
         } else if (RawObject::IsTypedDataClassId(field_cid)) {
           __ LoadFieldFromOffset(
-              temp_reg, value_reg, TypedData::length_offset());
+              temp_reg, value_reg, TypedData::length_offset(), PP);
           __ CompareImmediate(temp_reg, Smi::RawValue(field_length), PP);
         } else {
           ASSERT(field_cid == kIllegalCid);
@@ -1433,7 +1447,7 @@
           // Could still be a regular array.
           __ b(&check_array, LT);
           __ LoadFieldFromOffset(
-              temp_reg, value_reg, TypedData::length_offset());
+              temp_reg, value_reg, TypedData::length_offset(), PP);
           __ ldr(TMP, field_length_operand);
           __ CompareRegisters(temp_reg, TMP);
           __ b(&length_compared);
@@ -1443,7 +1457,8 @@
           __ b(&no_fixed_length, GT);
           __ CompareImmediate(value_cid_reg, kArrayCid, PP);
           __ b(&no_fixed_length, LT);
-          __ LoadFieldFromOffset(temp_reg, value_reg, Array::length_offset());
+          __ LoadFieldFromOffset(
+              temp_reg, value_reg, Array::length_offset(), PP);
           __ ldr(TMP, field_length_operand);
           __ CompareRegisters(temp_reg, TMP);
           __ b(&length_compared);
@@ -1469,11 +1484,12 @@
         ASSERT(value_cid_reg != kNoRegister);
         ASSERT(temp_reg != kNoRegister);
         if ((value_cid == kArrayCid) || (value_cid == kImmutableArrayCid)) {
-          __ LoadFieldFromOffset(temp_reg, value_reg, Array::length_offset());
+          __ LoadFieldFromOffset(
+              temp_reg, value_reg, Array::length_offset(), PP);
           __ CompareImmediate(temp_reg, Smi::RawValue(field_length), PP);
         } else if (RawObject::IsTypedDataClassId(value_cid)) {
           __ LoadFieldFromOffset(
-              temp_reg, value_reg, TypedData::length_offset());
+              temp_reg, value_reg, TypedData::length_offset(), PP);
           __ CompareImmediate(temp_reg, Smi::RawValue(field_length), PP);
         } else if (field_cid != kIllegalCid) {
           ASSERT(field_cid != value_cid);
@@ -1512,7 +1528,7 @@
         __ b(&check_array, LT);
         // Destroy value_cid_reg (safe because we are finished with it).
         __ LoadFieldFromOffset(
-            value_cid_reg, value_reg, TypedData::length_offset());
+            value_cid_reg, value_reg, TypedData::length_offset(), PP);
         __ str(value_cid_reg, field_length_operand);
         __ b(&length_set);  // Updated field length typed data array.
         // Check for regular array.
@@ -1523,7 +1539,7 @@
         __ b(&no_fixed_length, LT);
         // Destroy value_cid_reg (safe because we are finished with it).
         __ LoadFieldFromOffset(
-            value_cid_reg, value_reg, Array::length_offset());
+            value_cid_reg, value_reg, Array::length_offset(), PP);
         __ str(value_cid_reg, field_length_operand);
         // Updated field length from regular array.
         __ b(&length_set);
@@ -1540,12 +1556,12 @@
         if ((value_cid == kArrayCid) || (value_cid == kImmutableArrayCid)) {
           // Destroy value_cid_reg (safe because we are finished with it).
           __ LoadFieldFromOffset(
-              value_cid_reg, value_reg, Array::length_offset());
+              value_cid_reg, value_reg, Array::length_offset(), PP);
           __ str(value_cid_reg, field_length_operand);
         } else if (RawObject::IsTypedDataClassId(value_cid)) {
           // Destroy value_cid_reg (safe because we are finished with it).
           __ LoadFieldFromOffset(
-              value_cid_reg, value_reg, TypedData::length_offset());
+              value_cid_reg, value_reg, TypedData::length_offset(), PP);
           __ str(value_cid_reg, field_length_operand);
         } else {
           __ LoadImmediate(TMP, Smi::RawValue(Field::kNoFixedLength), PP);
@@ -1559,7 +1575,7 @@
       __ b(&ok);
       __ Bind(fail);
 
-      __ LoadFieldFromOffset(TMP, field_reg, Field::guarded_cid_offset());
+      __ LoadFieldFromOffset(TMP, field_reg, Field::guarded_cid_offset(), PP);
       __ CompareImmediate(TMP, kDynamicCid, PP);
       __ b(&ok, EQ);
 
@@ -1581,7 +1597,7 @@
 
       if (field_cid != kSmiCid) {
         __ b(fail, EQ);
-        __ LoadClassId(value_cid_reg, value_reg);
+        __ LoadClassId(value_cid_reg, value_reg, PP);
         __ CompareImmediate(value_cid_reg, field_cid, PP);
       }
 
@@ -1595,11 +1611,11 @@
         if ((field_cid == kArrayCid) || (field_cid == kImmutableArrayCid)) {
           // Destroy value_cid_reg (safe because we are finished with it).
           __ LoadFieldFromOffset(
-              value_cid_reg, value_reg, Array::length_offset());
+              value_cid_reg, value_reg, Array::length_offset(), PP);
         } else if (RawObject::IsTypedDataClassId(field_cid)) {
           // Destroy value_cid_reg (safe because we are finished with it).
           __ LoadFieldFromOffset(
-              value_cid_reg, value_reg, TypedData::length_offset());
+              value_cid_reg, value_reg, TypedData::length_offset(), PP);
         }
         __ ldr(TMP, field_length_operand);
         __ CompareRegisters(value_cid_reg, TMP);
@@ -1619,11 +1635,11 @@
         if ((field_cid == kArrayCid) || (field_cid == kImmutableArrayCid)) {
           // Destroy value_cid_reg (safe because we are finished with it).
           __ LoadFieldFromOffset(
-              value_cid_reg, value_reg, Array::length_offset());
+              value_cid_reg, value_reg, Array::length_offset(), PP);
         } else if (RawObject::IsTypedDataClassId(field_cid)) {
           // Destroy value_cid_reg (safe because we are finished with it).
           __ LoadFieldFromOffset(
-              value_cid_reg, value_reg, TypedData::length_offset());
+              value_cid_reg, value_reg, TypedData::length_offset(), PP);
         }
         __ CompareImmediate(value_cid_reg, field_length, PP);
         __ b(fail, NE);
@@ -1719,10 +1735,11 @@
         case kDoubleCid:
           cls = &compiler->double_class();
           break;
-        // TODO(zra): Implement these when we add fpu loads and stores.
         case kFloat32x4Cid:
+          cls = &compiler->float32x4_class();
+          break;
         case kFloat64x2Cid:
-          UNIMPLEMENTED();
+          cls = &compiler->float64x2_class();
           break;
         default:
           UNREACHABLE();
@@ -1739,20 +1756,22 @@
                      PP);
       __ Bind(slow_path->exit_label());
       __ mov(temp2, temp);
-      __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2, PP);
     } else {
-      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes_);
+      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes_, PP);
     }
     switch (cid) {
       case kDoubleCid:
         __ Comment("UnboxedDoubleStoreInstanceFieldInstr");
-        __ StoreDFieldToOffset(value, temp, Double::value_offset());
+        __ StoreDFieldToOffset(value, temp, Double::value_offset(), PP);
         break;
       case kFloat32x4Cid:
+        __ Comment("UnboxedFloat32x4StoreInstanceFieldInstr");
+        __ StoreQFieldToOffset(value, temp, Float32x4::value_offset(), PP);
+        break;
       case kFloat64x2Cid:
-        UNIMPLEMENTED();
+        __ Comment("UnboxedFloat64x2StoreInstanceFieldInstr");
+        __ StoreQFieldToOffset(value, temp, Float64x2::value_offset(), PP);
         break;
       default:
         UNREACHABLE();
@@ -1774,24 +1793,25 @@
 
     __ LoadObject(temp, Field::ZoneHandle(field().raw()), PP);
 
-    __ LoadFieldFromOffset(temp2, temp, Field::is_nullable_offset());
+    __ LoadFieldFromOffset(temp2, temp, Field::is_nullable_offset(), PP);
     __ CompareImmediate(temp2, kNullCid, PP);
     __ b(&store_pointer, EQ);
 
     __ LoadFromOffset(
-        temp2, temp, Field::kind_bits_offset() - kHeapObjectTag, kUnsignedByte);
+        temp2, temp, Field::kind_bits_offset() - kHeapObjectTag,
+        PP, kUnsignedByte);
     __ tsti(temp2, 1 << Field::kUnboxingCandidateBit);
     __ b(&store_pointer, EQ);
 
-    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset());
+    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP);
     __ CompareImmediate(temp2, kDoubleCid, PP);
     __ b(&store_double, EQ);
 
-    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset());
+    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP);
     __ CompareImmediate(temp2, kFloat32x4Cid, PP);
     __ b(&store_float32x4, EQ);
 
-    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset());
+    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP);
     __ CompareImmediate(temp2, kFloat64x2Cid, PP);
     __ b(&store_float64x2, EQ);
 
@@ -1810,7 +1830,7 @@
           new StoreInstanceFieldSlowPath(this, compiler->double_class());
       compiler->AddSlowPathCode(slow_path);
 
-      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes_);
+      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes_, PP);
       __ CompareObject(temp, Object::null_object(), PP);
       __ b(&copy_double, NE);
 
@@ -1821,45 +1841,88 @@
                      PP);
       __ Bind(slow_path->exit_label());
       __ mov(temp2, temp);
-      __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2, PP);
       __ Bind(&copy_double);
-      __ LoadDFieldFromOffset(fpu_temp, value_reg, Double::value_offset());
-      __ StoreDFieldToOffset(fpu_temp, temp, Double::value_offset());
+      __ LoadDFieldFromOffset(fpu_temp, value_reg, Double::value_offset(), PP);
+      __ StoreDFieldToOffset(fpu_temp, temp, Double::value_offset(), PP);
       __ b(&skip_store);
     }
 
-    // TODO(zra): Implement these when we add simd loads and stores.
     {
       __ Bind(&store_float32x4);
-      __ hlt(0);  // Unimplemented.
+      Label copy_float32x4;
+      StoreInstanceFieldSlowPath* slow_path =
+          new StoreInstanceFieldSlowPath(this, compiler->float32x4_class());
+      compiler->AddSlowPathCode(slow_path);
+
+      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes_, PP);
+      __ CompareObject(temp, Object::null_object(), PP);
+      __ b(&copy_float32x4, NE);
+
+      __ TryAllocate(compiler->float32x4_class(),
+                     slow_path->entry_label(),
+                     temp,
+                     temp2,
+                     PP);
+      __ Bind(slow_path->exit_label());
+      __ mov(temp2, temp);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2, PP);
+      __ Bind(&copy_float32x4);
+      __ LoadQFieldFromOffset(
+          fpu_temp, value_reg, Float32x4::value_offset(), PP);
+      __ StoreQFieldToOffset(
+          fpu_temp, value_reg, Float32x4::value_offset(), PP);
+      __ b(&skip_store);
     }
 
     {
       __ Bind(&store_float64x2);
-      __ hlt(0);  // Unimplemented.
+      Label copy_float64x2;
+      StoreInstanceFieldSlowPath* slow_path =
+          new StoreInstanceFieldSlowPath(this, compiler->float64x2_class());
+      compiler->AddSlowPathCode(slow_path);
+
+      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes_, PP);
+      __ CompareObject(temp, Object::null_object(), PP);
+      __ b(&copy_float64x2, NE);
+
+      __ TryAllocate(compiler->float64x2_class(),
+                     slow_path->entry_label(),
+                     temp,
+                     temp2,
+                     PP);
+      __ Bind(slow_path->exit_label());
+      __ mov(temp2, temp);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2, PP);
+      __ Bind(&copy_float64x2);
+      __ LoadQFieldFromOffset(
+          fpu_temp, value_reg, Float64x2::value_offset(), PP);
+      __ StoreQFieldToOffset(
+          fpu_temp, value_reg, Float64x2::value_offset(), PP);
+      __ b(&skip_store);
     }
 
     __ Bind(&store_pointer);
   }
 
   if (ShouldEmitStoreBarrier()) {
-    Register value_reg = locs()->in(1).reg();
-    __ StoreIntoObject(instance_reg,
-                       FieldAddress(instance_reg, offset_in_bytes_),
-                       value_reg,
-                       CanValueBeSmi());
+    const Register value_reg = locs()->in(1).reg();
+    __ StoreIntoObjectOffset(
+        instance_reg, offset_in_bytes_, value_reg, PP, CanValueBeSmi());
   } else {
     if (locs()->in(1).IsConstant()) {
-      __ StoreIntoObjectNoBarrier(
+      __ StoreIntoObjectOffsetNoBarrier(
           instance_reg,
-          FieldAddress(instance_reg, offset_in_bytes_),
-          locs()->in(1).constant());
+          offset_in_bytes_,
+          locs()->in(1).constant(),
+          PP);
     } else {
-      Register value_reg = locs()->in(1).reg();
-      __ StoreIntoObjectNoBarrier(instance_reg,
-          FieldAddress(instance_reg, offset_in_bytes_), value_reg);
+      const Register value_reg = locs()->in(1).reg();
+      __ StoreIntoObjectOffsetNoBarrier(
+          instance_reg,
+          offset_in_bytes_,
+          value_reg,
+          PP);
     }
   }
   __ Bind(&skip_store);
@@ -1885,7 +1948,7 @@
 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register field = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  __ LoadFieldFromOffset(result, field, Field::value_offset());
+  __ LoadFieldFromOffset(result, field, Field::value_offset(), PP);
 }
 
 
@@ -1904,11 +1967,10 @@
 
   __ LoadObject(temp, field(), PP);
   if (this->value()->NeedsStoreBuffer()) {
-    __ StoreIntoObject(temp,
-        FieldAddress(temp, Field::value_offset()), value, CanValueBeSmi());
+    __ StoreIntoObjectOffset(
+        temp, Field::value_offset(), value, PP, CanValueBeSmi());
   } else {
-    __ StoreIntoObjectNoBarrier(
-        temp, FieldAddress(temp, Field::value_offset()), value);
+    __ StoreIntoObjectOffsetNoBarrier(temp, Field::value_offset(), value, PP);
   }
 }
 
@@ -2025,12 +2087,12 @@
   if (IsUnboxedLoad() && compiler->is_optimizing()) {
     const VRegister result = locs()->out(0).fpu_reg();
     const Register temp = locs()->temp(0).reg();
-    __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes());
+    __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes(), PP);
     const intptr_t cid = field()->UnboxedFieldCid();
     switch (cid) {
       case kDoubleCid:
         __ Comment("UnboxedDoubleLoadFieldInstr");
-        __ LoadDFieldFromOffset(result, temp, Double::value_offset());
+        __ LoadDFieldFromOffset(result, temp, Double::value_offset(), PP);
         break;
       case kFloat32x4Cid:
       case kFloat64x2Cid:
@@ -2093,26 +2155,26 @@
                      temp,
                      PP);
       __ Bind(slow_path->exit_label());
-      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes());
-      __ LoadDFieldFromOffset(value, temp, Double::value_offset());
-      __ StoreDFieldToOffset(value, result_reg, Double::value_offset());
+      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes(), PP);
+      __ LoadDFieldFromOffset(value, temp, Double::value_offset(), PP);
+      __ StoreDFieldToOffset(value, result_reg, Double::value_offset(), PP);
       __ b(&done);
     }
 
     // TODO(zra): Implement these when we add simd loads and stores.
     {
       __ Bind(&load_float32x4);
-      __ hlt(0);  // Unimplemented.
+      __ Stop("Float32x4 Unimplemented");
     }
 
     {
       __ Bind(&load_float64x2);
-      __ hlt(0);  // Unimplemented.
+      __ Stop("Float64x2 Unimplemented");
     }
 
     __ Bind(&load_pointer);
   }
-  __ LoadFieldFromOffset(result_reg, instance_reg, offset_in_bytes());
+  __ LoadFieldFromOffset(result_reg, instance_reg, offset_in_bytes(), PP);
   __ Bind(&done);
 }
 
@@ -2182,13 +2244,13 @@
   }
 
   __ LoadObject(R2, type_arguments(), PP);
-  __ LoadFieldFromOffset(R2, R2, TypeArguments::instantiations_offset());
+  __ LoadFieldFromOffset(R2, R2, TypeArguments::instantiations_offset(), PP);
   __ AddImmediate(R2, R2, Array::data_offset() - kHeapObjectTag, PP);
   // The instantiations cache is initialized with Object::zero_array() and is
   // therefore guaranteed to contain kNoInstantiator. No length check needed.
   Label loop, found, slow_case;
   __ Bind(&loop);
-  __ LoadFromOffset(R1, R2, 0 * kWordSize);  // Cached instantiator.
+  __ LoadFromOffset(R1, R2, 0 * kWordSize, PP);  // Cached instantiator.
   __ CompareRegisters(R1, R0);
   __ b(&found, EQ);
   __ AddImmediate(R2, R2, 2 * kWordSize, PP);
@@ -2196,7 +2258,7 @@
   __ b(&loop, NE);
   __ b(&slow_case);
   __ Bind(&found);
-  __ LoadFromOffset(R0, R2, 1 * kWordSize);  // Cached instantiated args.
+  __ LoadFromOffset(R0, R2, 1 * kWordSize, PP);  // Cached instantiated args.
   __ b(&type_arguments_instantiated);
 
   __ Bind(&slow_case);
@@ -2299,9 +2361,9 @@
   // Restore stack and initialize the two exception variables:
   // exception and stack trace variables.
   __ StoreToOffset(kExceptionObjectReg,
-                   FP, exception_var().index() * kWordSize);
+                   FP, exception_var().index() * kWordSize, PP);
   __ StoreToOffset(kStackTraceObjectReg,
-                   FP, stacktrace_var().index() * kWordSize);
+                   FP, stacktrace_var().index() * kWordSize, PP);
 }
 
 
@@ -2384,7 +2446,7 @@
     __ LoadObject(temp, compiler->parsed_function().function(), PP);
     intptr_t threshold =
         FLAG_optimization_counter_threshold * (loop_depth() + 1);
-    __ LoadFieldFromOffset(temp, temp, Function::usage_counter_offset());
+    __ LoadFieldFromOffset(temp, temp, Function::usage_counter_offset(), PP);
     __ CompareImmediate(temp, threshold, PP);
     __ b(slow_path->osr_entry_label(), GE);
   }
@@ -2395,6 +2457,20 @@
 }
 
 
+static void EmitJavascriptOverflowCheck(FlowGraphCompiler* compiler,
+                                        Range* range,
+                                        Label* overflow,
+                                        Register result) {
+  if (!range->IsWithin(-0x20000000000000LL, 0x20000000000000LL)) {
+    ASSERT(overflow != NULL);
+    __ LoadImmediate(TMP, 0x20000000000000LL, PP);
+    __ add(TMP2, result, Operand(TMP));
+    __ cmp(TMP2, Operand(TMP, LSL, 1));
+    __ b(overflow, HI);
+  }
+}
+
+
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
   const bool is_truncating = shift_left->is_truncating();
@@ -2431,6 +2507,9 @@
       // Shift for result now we know there is no overflow.
       __ Lsl(result, left, value);
     }
+    if (FLAG_throw_on_javascript_int_overflow) {
+      EmitJavascriptOverflowCheck(compiler, shift_left->range(), deopt, result);
+    }
     return;
   }
 
@@ -2461,6 +2540,9 @@
       __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
       __ lslv(result, left, TMP);
     }
+    if (FLAG_throw_on_javascript_int_overflow) {
+      EmitJavascriptOverflowCheck(compiler, shift_left->range(), deopt, result);
+    }
     return;
   }
 
@@ -2496,8 +2578,8 @@
     }
     // Left is not a constant.
     // Check if count too large for handling it inlined.
-    __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into IP.
-    // Overflow test (preserve left, right, and IP);
+    __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+    // Overflow test (preserve left, right, and TMP);
     Register temp = locs.temp(0).reg();
     __ lslv(temp, left, TMP);
     __ asrv(TMP2, temp, TMP);
@@ -2506,6 +2588,9 @@
     // Shift for result now we know there is no overflow.
     __ lslv(result, left, TMP);
   }
+  if (FLAG_throw_on_javascript_int_overflow) {
+    EmitJavascriptOverflowCheck(compiler, shift_left->range(), deopt, result);
+  }
 }
 
 
@@ -2561,18 +2646,26 @@
   if (locs()->in(1).IsConstant()) {
     const Object& constant = locs()->in(1).constant();
     ASSERT(constant.IsSmi());
-    int64_t imm = reinterpret_cast<int64_t>(constant.raw());
+    const int64_t imm = reinterpret_cast<int64_t>(constant.raw());
     switch (op_kind()) {
-      case Token::kSUB: {
-        imm = -imm;  // TODO(regis): What if deopt != NULL && imm == 0x80000000?
-        // Fall through.
-      }
       case Token::kADD: {
         if (deopt == NULL) {
           __ AddImmediate(result, left, imm, PP);
         } else {
           __ AddImmediateSetFlags(result, left, imm, PP);
-          __ b(deopt, VS);        }
+          __ b(deopt, VS);
+        }
+        break;
+      }
+      case Token::kSUB: {
+        if (deopt == NULL) {
+          __ AddImmediate(result, left, -imm, PP);
+        } else {
+          // Negating imm and using AddImmediateSetFlags would not detect the
+          // overflow when imm == kMinInt64.
+          __ SubImmediateSetFlags(result, left, imm, PP);
+          __ b(deopt, VS);
+        }
         break;
       }
       case Token::kMUL: {
@@ -2672,6 +2765,9 @@
         UNREACHABLE();
         break;
     }
+    if (FLAG_throw_on_javascript_int_overflow) {
+      EmitJavascriptOverflowCheck(compiler, range(), deopt, result);
+    }
     return;
   }
 
@@ -2793,7 +2889,7 @@
       }
       Register temp = locs()->temp(0).reg();
       __ Asr(temp, left, kSmiTagSize);  // SmiUntag left into temp.
-      __ Asr(result, temp, TMP);
+      __ asrv(result, temp, TMP);
       __ SmiTag(result);
       break;
     }
@@ -2814,6 +2910,9 @@
       UNREACHABLE();
       break;
   }
+  if (FLAG_throw_on_javascript_int_overflow) {
+    EmitJavascriptOverflowCheck(compiler, range(), deopt, result);
+  }
 }
 
 
@@ -2877,7 +2976,7 @@
                  locs()->temp(0).reg(),
                  PP);
   __ Bind(slow_path->exit_label());
-  __ StoreDFieldToOffset(value, out_reg, Double::value_offset());
+  __ StoreDFieldToOffset(value, out_reg, Double::value_offset(), PP);
 }
 
 
@@ -2899,7 +2998,7 @@
   const VRegister result = locs()->out(0).fpu_reg();
 
   if (value_cid == kDoubleCid) {
-    __ LoadDFieldFromOffset(result, value, Double::value_offset());
+    __ LoadDFieldFromOffset(result, value, Double::value_offset(), PP);
   } else if (value_cid == kSmiCid) {
     __ Asr(TMP, value, kSmiTagSize);  // Untag input before conversion.
     __ scvtfd(result, TMP);
@@ -2911,14 +3010,14 @@
       __ CompareObject(value, Object::null_object(), PP);
       __ b(deopt, EQ);
       // It must be double now.
-      __ LoadDFieldFromOffset(result, value, Double::value_offset());
+      __ LoadDFieldFromOffset(result, value, Double::value_offset(), PP);
     } else {
       Label is_smi, done;
       __ tsti(value, kSmiTagMask);
       __ b(&is_smi, EQ);
-      __ CompareClassId(value, kDoubleCid);
+      __ CompareClassId(value, kDoubleCid, PP);
       __ b(deopt, NE);
-      __ LoadDFieldFromOffset(result, value, Double::value_offset());
+      __ LoadDFieldFromOffset(result, value, Double::value_offset(), PP);
       __ b(&done);
       __ Bind(&is_smi);
       __ Asr(TMP, value, kSmiTagSize);  // Copy and untag.
@@ -3357,24 +3456,126 @@
 
 
 LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
+    const intptr_t kNumInputs = 1;
+    const intptr_t kNumTemps = 0;
+    LocationSummary* summary =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    summary->set_in(0, Location::FpuRegisterLocation(V0));
+    summary->set_out(0, Location::FpuRegisterLocation(V0));
+    return summary;
+  }
+  ASSERT((kind() == MathUnaryInstr::kSqrt) ||
+         (kind() == MathUnaryInstr::kDoubleSquare));
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  if (kind() == MathUnaryInstr::kSqrt) {
+    VRegister val = locs()->in(0).fpu_reg();
+    VRegister result = locs()->out(0).fpu_reg();
+    __ fsqrtd(result, val);
+  } else if (kind() == MathUnaryInstr::kDoubleSquare) {
+    VRegister val = locs()->in(0).fpu_reg();
+    VRegister result = locs()->out(0).fpu_reg();
+    __ fmuld(result, val, val);
+  } else {
+    ASSERT((kind() == MathUnaryInstr::kSin) ||
+           (kind() == MathUnaryInstr::kCos));
+    __ CallRuntime(TargetFunction(), InputCount());
+  }
 }
 
 
 LocationSummary* MathMinMaxInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  if (result_cid() == kDoubleCid) {
+    const intptr_t kNumInputs = 2;
+    const intptr_t kNumTemps = 0;
+    LocationSummary* summary =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    summary->set_in(0, Location::RequiresFpuRegister());
+    summary->set_in(1, Location::RequiresFpuRegister());
+    // Reuse the left register so that code can be made shorter.
+    summary->set_out(0, Location::SameAsFirstInput());
+    return summary;
+  }
+  ASSERT(result_cid() == kSmiCid);
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RequiresRegister());
+  // Reuse the left register so that code can be made shorter.
+  summary->set_out(0, Location::SameAsFirstInput());
+  return summary;
 }
 
 
 void MathMinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  ASSERT((op_kind() == MethodRecognizer::kMathMin) ||
+         (op_kind() == MethodRecognizer::kMathMax));
+  const intptr_t is_min = (op_kind() == MethodRecognizer::kMathMin);
+  if (result_cid() == kDoubleCid) {
+    Label done, returns_nan, are_equal;
+    const VRegister left = locs()->in(0).fpu_reg();
+    const VRegister right = locs()->in(1).fpu_reg();
+    const VRegister result = locs()->out(0).fpu_reg();
+    __ fcmpd(left, right);
+    __ b(&returns_nan, VS);
+    __ b(&are_equal, EQ);
+    const Condition double_condition =
+        is_min ? TokenKindToDoubleCondition(Token::kLTE)
+               : TokenKindToDoubleCondition(Token::kGTE);
+    ASSERT(left == result);
+    __ b(&done, double_condition);
+    __ fmovdd(result, right);
+    __ b(&done);
+
+    __ Bind(&returns_nan);
+    __ LoadDImmediate(result, NAN, PP);
+    __ b(&done);
+
+    __ Bind(&are_equal);
+    // Check for negative zero: -0.0 is equal 0.0 but min or max must return
+    // -0.0 or 0.0 respectively.
+    // Check for negative left value (get the sign bit):
+    // - min -> left is negative ? left : right.
+    // - max -> left is negative ? right : left
+    // Check the sign bit.
+    __ fmovrd(TMP, left);  // Sign bit is in bit 63 of TMP.
+    __ CompareImmediate(TMP, 0, PP);
+    if (is_min) {
+      ASSERT(left == result);
+      __ b(&done, LT);
+      __ fmovdd(result, right);
+    } else {
+      __ b(&done, GE);
+      __ fmovdd(result, right);
+      ASSERT(left == result);
+    }
+    __ Bind(&done);
+    return;
+  }
+
+  ASSERT(result_cid() == kSmiCid);
+  Register left = locs()->in(0).reg();
+  Register right = locs()->in(1).reg();
+  Register result = locs()->out(0).reg();
+  __ CompareRegisters(left, right);
+  ASSERT(result == left);
+  if (is_min) {
+    __ csel(result, right, left, GT);
+  } else {
+    __ csel(result, right, left, LT);
+  }
 }
 
 
@@ -3399,6 +3600,9 @@
       Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
       __ subs(result, ZR, Operand(value));
       __ b(deopt, VS);
+      if (FLAG_throw_on_javascript_int_overflow) {
+        EmitJavascriptOverflowCheck(compiler, range(), deopt, value);
+      }
       break;
     }
     case Token::kBIT_NOT:
@@ -3413,46 +3617,124 @@
 
 
 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  VRegister result = locs()->out(0).fpu_reg();
+  VRegister value = locs()->in(0).fpu_reg();
+  __ fnegd(result, value);
 }
 
 
 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* result =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  result->set_in(0, Location::WritableRegister());
+  result->set_out(0, Location::RequiresFpuRegister());
+  return result;
 }
 
 
 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register value = locs()->in(0).reg();
+  VRegister result = locs()->out(0).fpu_reg();
+  __ SmiUntag(value);
+  __ scvtfd(result, value);
 }
 
 
 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* result =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  result->set_in(0, Location::RegisterLocation(R1));
+  result->set_out(0, Location::RegisterLocation(R0));
+  return result;
 }
 
 
 void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const Register result = locs()->out(0).reg();
+  const Register value_obj = locs()->in(0).reg();
+  ASSERT(result == R0);
+  ASSERT(result != value_obj);
+  __ LoadDFieldFromOffset(VTMP, value_obj, Double::value_offset(), PP);
+
+  Label do_call, done;
+  // First check for NaN. Checking for minint after the conversion doesn't work
+  // on ARM64 because fcvtzds gives 0 for NaN.
+  __ fcmpd(VTMP, VTMP);
+  __ b(&do_call, VS);
+
+  __ fcvtzds(result, VTMP);
+  // Overflow is signaled with minint.
+
+  // Check for overflow and that it fits into Smi.
+  __ CompareImmediate(result, 0xC000000000000000, PP);
+  __ b(&do_call, MI);
+  __ SmiTag(result);
+  if (FLAG_throw_on_javascript_int_overflow) {
+    EmitJavascriptOverflowCheck(compiler, range(), &do_call, result);
+  }
+  __ b(&done);
+  __ Bind(&do_call);
+  __ Push(value_obj);
+  ASSERT(instance_call()->HasICData());
+  const ICData& ic_data = *instance_call()->ic_data();
+  ASSERT((ic_data.NumberOfChecks() == 1));
+  const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(0));
+
+  const intptr_t kNumberOfArguments = 1;
+  compiler->GenerateStaticCall(deopt_id(),
+                               instance_call()->token_pos(),
+                               target,
+                               kNumberOfArguments,
+                               Object::null_array(),  // No argument names.,
+                               locs());
+  __ Bind(&done);
 }
 
 
 LocationSummary* DoubleToSmiInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* result = new LocationSummary(
+      kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  result->set_in(0, Location::RequiresFpuRegister());
+  result->set_out(0, Location::RequiresRegister());
+  return result;
 }
 
 
 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
+  const Register result = locs()->out(0).reg();
+  const VRegister value = locs()->in(0).fpu_reg();
+  // First check for NaN. Checking for minint after the conversion doesn't work
+  // on ARM64 because fcvtzds gives 0 for NaN.
+  // TODO(zra): Check spec that this is true.
+  __ fcmpd(value, value);
+  __ b(deopt, VS);
+
+  __ fcvtzds(result, value);
+  // Check for overflow and that it fits into Smi.
+  __ CompareImmediate(result, 0xC000000000000000, PP);
+  __ b(deopt, MI);
+  __ SmiTag(result);
+  if (FLAG_throw_on_javascript_int_overflow) {
+    EmitJavascriptOverflowCheck(compiler, range(), deopt, result);
+  }
 }
 
 
@@ -3468,35 +3750,177 @@
 
 
 LocationSummary* DoubleToFloatInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* result =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  result->set_in(0, Location::RequiresFpuRegister());
+  result->set_out(0, Location::RequiresFpuRegister());
+  return result;
 }
 
 
 void DoubleToFloatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister value = locs()->in(0).fpu_reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+  __ fcvtsd(result, value);
 }
 
 
 LocationSummary* FloatToDoubleInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* result =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  result->set_in(0, Location::RequiresFpuRegister());
+  result->set_out(0, Location::RequiresFpuRegister());
+  return result;
 }
 
 
 void FloatToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister value = locs()->in(0).fpu_reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+  __ fcvtds(result, value);
 }
 
 
 LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  ASSERT((InputCount() == 1) || (InputCount() == 2));
+  const intptr_t kNumTemps = 0;
+  LocationSummary* result =
+      new LocationSummary(InputCount(), kNumTemps, LocationSummary::kCall);
+  result->set_in(0, Location::FpuRegisterLocation(V0));
+  if (InputCount() == 2) {
+    result->set_in(1, Location::FpuRegisterLocation(V1));
+  }
+  if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
+    result->AddTemp(Location::FpuRegisterLocation(V30));
+  }
+  result->set_out(0, Location::FpuRegisterLocation(V0));
+  return result;
+}
+
+
+// Pseudo code:
+// if (exponent == 0.0) return 1.0;
+// // Speed up simple cases.
+// if (exponent == 1.0) return base;
+// if (exponent == 2.0) return base * base;
+// if (exponent == 3.0) return base * base * base;
+// if (base == 1.0) return 1.0;
+// if (base.isNaN || exponent.isNaN) {
+//    return double.NAN;
+// }
+// if (base != -Infinity && exponent == 0.5) {
+//   if (base == 0.0) return 0.0;
+//   return sqrt(value);
+// }
+// TODO(srdjan): Move into a stub?
+static void InvokeDoublePow(FlowGraphCompiler* compiler,
+                            InvokeMathCFunctionInstr* instr) {
+  ASSERT(instr->recognized_kind() == MethodRecognizer::kMathDoublePow);
+  const intptr_t kInputCount = 2;
+  ASSERT(instr->InputCount() == kInputCount);
+  LocationSummary* locs = instr->locs();
+
+  const VRegister base = locs->in(0).fpu_reg();
+  const VRegister exp = locs->in(1).fpu_reg();
+  const VRegister result = locs->out(0).fpu_reg();
+  const VRegister saved_base = locs->temp(0).fpu_reg();
+  ASSERT((base == result) && (result != saved_base));
+
+  Label skip_call, try_sqrt, check_base, return_nan, do_pow;
+  __ fmovdd(saved_base, base);
+  __ LoadDImmediate(result, 1.0, PP);
+  // exponent == 0.0 -> return 1.0;
+  __ fcmpdz(exp);
+  __ b(&check_base, VS);  // NaN -> check base.
+  __ b(&skip_call, EQ);  // exp is 0.0, result is 1.0.
+
+  // exponent == 1.0 ?
+  __ fcmpd(exp, result);
+  Label return_base;
+  __ b(&return_base, EQ);
+
+  // exponent == 2.0 ?
+  __ LoadDImmediate(VTMP, 2.0, PP);
+  __ fcmpd(exp, VTMP);
+  Label return_base_times_2;
+  __ b(&return_base_times_2, EQ);
+
+  // exponent == 3.0 ?
+  __ LoadDImmediate(VTMP, 3.0, PP);
+  __ fcmpd(exp, VTMP);
+  __ b(&check_base, NE);
+
+  // base_times_3.
+  __ fmuld(result, saved_base, saved_base);
+  __ fmuld(result, result, saved_base);
+  __ b(&skip_call);
+
+  __ Bind(&return_base);
+  __ fmovdd(result, saved_base);
+  __ b(&skip_call);
+
+  __ Bind(&return_base_times_2);
+  __ fmuld(result, saved_base, saved_base);
+  __ b(&skip_call);
+
+  __ Bind(&check_base);
+  // Note: 'exp' could be NaN.
+  // base == 1.0 -> return 1.0;
+  __ fcmpd(saved_base, result);
+  __ b(&return_nan, VS);
+  __ b(&skip_call, EQ);  // base is 1.0, result is 1.0.
+
+  __ fcmpd(saved_base, exp);
+  __ b(&try_sqrt, VC);  // // Neither 'exp' nor 'base' is NaN.
+
+  __ Bind(&return_nan);
+  __ LoadDImmediate(result, NAN, PP);
+  __ b(&skip_call);
+
+  Label return_zero;
+  __ Bind(&try_sqrt);
+
+  // Before calling pow, check if we could use sqrt instead of pow.
+  __ LoadDImmediate(result, -INFINITY, PP);
+
+  // base == -Infinity -> call pow;
+  __ fcmpd(saved_base, result);
+  __ b(&do_pow, EQ);
+
+  // exponent == 0.5 ?
+  __ LoadDImmediate(result, 0.5, PP);
+  __ fcmpd(exp, result);
+  __ b(&do_pow, NE);
+
+  // base == 0 -> return 0;
+  __ fcmpdz(saved_base);
+  __ b(&return_zero, EQ);
+
+  __ fsqrtd(result, saved_base);
+  __ b(&skip_call);
+
+  __ Bind(&return_zero);
+  __ LoadDImmediate(result, 0.0, PP);
+  __ b(&skip_call);
+
+  __ Bind(&do_pow);
+  __ fmovdd(base, saved_base);  // Restore base.
+
+  __ CallRuntime(instr->TargetFunction(), kInputCount);
+  __ Bind(&skip_call);
 }
 
 
 void InvokeMathCFunctionInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
+    InvokeDoublePow(compiler, this);
+    return;
+  }
+  __ CallRuntime(TargetFunction(), InputCount());
 }
 
 
@@ -3550,12 +3974,81 @@
 
 
 LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const {
+  if (kind() == MergedMathInstr::kTruncDivMod) {
+    const intptr_t kNumInputs = 2;
+    const intptr_t kNumTemps = 0;
+    LocationSummary* summary =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_in(1, Location::RequiresRegister());
+    // Output is a pair of registers.
+    summary->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                       Location::RequiresRegister()));
+    return summary;
+  }
   UNIMPLEMENTED();
   return NULL;
 }
 
 
 void MergedMathInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Label* deopt = NULL;
+  if (CanDeoptimize()) {
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
+  }
+  if (kind() == MergedMathInstr::kTruncDivMod) {
+    const Register left = locs()->in(0).reg();
+    const Register right = locs()->in(1).reg();
+    ASSERT(locs()->out(0).IsPairLocation());
+    const PairLocation* pair = locs()->out(0).AsPairLocation();
+    const Register result_div = pair->At(0).reg();
+    const Register result_mod = pair->At(1).reg();
+    const Range* right_range = InputAt(1)->definition()->range();
+    if ((right_range == NULL) || right_range->Overlaps(0, 0)) {
+      // Handle divide by zero in runtime.
+      __ CompareRegisters(right, ZR);
+      __ b(deopt, EQ);
+    }
+
+    __ Asr(result_mod, left, kSmiTagSize);  // SmiUntag left.
+    __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right.
+
+    __ sdiv(result_div, result_mod, TMP);
+
+    // Check the corner case of dividing the 'MIN_SMI' with -1, in which
+    // case we cannot tag the result.
+    __ CompareImmediate(result_div, 0x4000000000000000, PP);
+    __ b(deopt, EQ);
+    // result_mod <- left - right * result_div.
+    __ msub(result_mod, TMP, result_div, result_mod);
+    __ SmiTag(result_div);
+    __ SmiTag(result_mod);
+    // Correct MOD result:
+    //  res = left % right;
+    //  if (res < 0) {
+    //    if (right < 0) {
+    //      res = res - right;
+    //    } else {
+    //      res = res + right;
+    //    }
+    //  }
+    Label done;
+    __ CompareRegisters(result_mod, ZR);;
+    __ b(&done, GE);
+    // Result is negative, adjust it.
+    __ CompareRegisters(right, ZR);
+    __ sub(TMP2, result_mod, Operand(right));
+    __ add(TMP, result_mod, Operand(right));
+    __ csel(result_mod, TMP, TMP2, GE);
+    __ Bind(&done);
+    // FLAG_throw_on_javascript_int_overflow: not needed.
+    // Note that the result of an integer division/modulo of two
+    // in-range arguments, cannot create out-of-range result.
+    return;
+  }
+  if (kind() == MergedMathInstr::kSinCos) {
+    UNIMPLEMENTED();
+  }
   UNIMPLEMENTED();
 }
 
@@ -3588,7 +4081,7 @@
 
   // Load receiver into R0.
   __ LoadFromOffset(
-      R0, SP, (instance_call()->ArgumentCount() - 1) * kWordSize);
+      R0, SP, (instance_call()->ArgumentCount() - 1) * kWordSize, PP);
 
   LoadValueCid(compiler, R2, R0,
                (ic_data().GetReceiverClassIdAt(0) == kSmiCid) ? NULL : deopt);
@@ -3655,7 +4148,7 @@
     __ tsti(value, kSmiTagMask);
     __ b(deopt, EQ);
   }
-  __ LoadClassId(temp, value);
+  __ LoadClassId(temp, value, PP);
   const intptr_t num_checks = unary_checks().NumberOfChecks();
   for (intptr_t i = cix; i < num_checks; i++) {
     ASSERT(unary_checks().GetReceiverClassIdAt(i) != kSmiCid);
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 8a4c801..6ff2f13 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -2058,6 +2058,8 @@
 }
 
 
+// TODO(srdjan): In case of constant inputs make CreateArray kNoCall and
+// use slow path stub.
 LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
@@ -2070,15 +2072,110 @@
 }
 
 
+// Inlines array allocation for known constant values.
+static void InlineArrayAllocation(FlowGraphCompiler* compiler,
+                                   intptr_t num_elements,
+                                   Label* slow_path,
+                                   Label* done) {
+  const Register kLengthReg = EDX;
+  const Register kElemTypeReg = ECX;
+  const intptr_t kArraySize = Array::InstanceSize(num_elements);
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
+
+  __ movl(EAX, Address::Absolute(heap->TopAddress()));
+  __ movl(EBX, EAX);
+
+  __ addl(EBX, Immediate(kArraySize));
+  __ j(CARRY, slow_path);
+
+  // Check if the allocation fits into the remaining space.
+  // EAX: potential new object start.
+  // EBX: potential next object start.
+  __ cmpl(EBX, Address::Absolute(heap->EndAddress()));
+  __ j(ABOVE_EQUAL, slow_path);
+
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  __ movl(Address::Absolute(heap->TopAddress()), EBX);
+  __ addl(EAX, Immediate(kHeapObjectTag));
+  __ UpdateAllocationStatsWithSize(kArrayCid, kArraySize, kNoRegister);
+
+  // Initialize the tags.
+  // EAX: new object start as a tagged pointer.
+  {
+    uword tags = 0;
+    tags = RawObject::ClassIdTag::update(kArrayCid, tags);
+    tags = RawObject::SizeTag::update(kArraySize, tags);
+    __ movl(FieldAddress(EAX, Array::tags_offset()), Immediate(tags));
+  }
+
+  // Store the type argument field.
+  __ StoreIntoObjectNoBarrier(EAX,
+                              FieldAddress(EAX, Array::type_arguments_offset()),
+                              kElemTypeReg);
+
+  // Set the length field.
+  __ StoreIntoObjectNoBarrier(EAX,
+                              FieldAddress(EAX, Array::length_offset()),
+                              kLengthReg);
+
+  // Initialize all array elements to raw_null.
+  // EAX: new object start as a tagged pointer.
+  // EBX: new object end address.
+  // EDI: iterator which initially points to the start of the variable
+  // data area to be initialized.
+  const Immediate& raw_null =
+      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  __ leal(EDI, FieldAddress(EAX, sizeof(RawArray)));
+  Label init_loop;
+  __ Bind(&init_loop);
+  __ cmpl(EDI, EBX);
+  __ j(ABOVE_EQUAL, done, Assembler::kNearJump);
+  __ movl(Address(EDI, 0), raw_null);
+  __ addl(EDI, Immediate(kWordSize));
+  __ jmp(&init_loop, Assembler::kNearJump);
+}
+
+
 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // Allocate the array.  EDX = length, ECX = element type.
-  ASSERT(locs()->in(0).reg() == ECX);
-  ASSERT(locs()->in(1).reg() == EDX);
+  const Register kLengthReg = EDX;
+  const Register kElemTypeReg = ECX;
+  const Register kResultReg = EAX;
+  ASSERT(locs()->in(0).reg() == kElemTypeReg);
+  ASSERT(locs()->in(1).reg() == kLengthReg);
+
+  Label slow_path, done;
+  if (num_elements()->BindsToConstant() &&
+      num_elements()->BoundConstant().IsSmi()) {
+    const intptr_t length = Smi::Cast(num_elements()->BoundConstant()).Value();
+    if ((length >= 0) && (length <= Array::kMaxElements)) {
+      Label slow_path, done;
+      InlineArrayAllocation(compiler, length, &slow_path, &done);
+      __ Bind(&slow_path);
+      __ PushObject(Object::ZoneHandle());  // Make room for the result.
+      __ pushl(kLengthReg);
+      __ pushl(kElemTypeReg);
+      compiler->GenerateRuntimeCall(token_pos(),
+                                    deopt_id(),
+                                    kAllocateArrayRuntimeEntry,
+                                    2,
+                                    locs());
+      __ Drop(2);
+      __ popl(kResultReg);
+      __ Bind(&done);
+      return;
+    }
+  }
+
+  __ Bind(&slow_path);
   compiler->GenerateCall(token_pos(),
                          &StubCode::AllocateArrayLabel(),
                          PcDescriptors::kOther,
                          locs());
-  ASSERT(locs()->out(0).reg() == EAX);
+  __ Bind(&done);
+  ASSERT(locs()->out(0).reg() == kResultReg);
 }
 
 
@@ -2919,16 +3016,21 @@
   if (locs()->in(1).IsConstant()) {
     const Object& constant = locs()->in(1).constant();
     ASSERT(constant.IsSmi());
-    const int32_t imm =
-        reinterpret_cast<int32_t>(constant.raw());
+    const int32_t imm = reinterpret_cast<int32_t>(constant.raw());
     switch (op_kind()) {
-      case Token::kADD:
-        __ addl(left, Immediate(imm));
-        if (deopt != NULL) __ j(OVERFLOW, deopt);
+    case Token::kADD:
+        if (imm != 0) {
+          // Checking overflow without emitting an instruction would be wrong.
+          __ addl(left, Immediate(imm));
+          if (deopt != NULL) __ j(OVERFLOW, deopt);
+        }
         break;
       case Token::kSUB: {
-        __ subl(left, Immediate(imm));
-        if (deopt != NULL) __ j(OVERFLOW, deopt);
+        if (imm != 0) {
+          // Checking overflow without emitting an instruction would be wrong.
+          __ subl(left, Immediate(imm));
+          if (deopt != NULL) __ j(OVERFLOW, deopt);
+        }
         break;
       }
       case Token::kMUL: {
@@ -3207,7 +3309,9 @@
   intptr_t right_cid = right()->Type()->ToCid();
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
   const intptr_t kNumInputs = 2;
-  const bool need_temp = (left_cid != kSmiCid) && (right_cid != kSmiCid);
+  const bool need_temp = (left()->definition() != right()->definition())
+                      &&(left_cid != kSmiCid)
+                      && (right_cid != kSmiCid);
   const intptr_t kNumTemps = need_temp ? 1 : 0;
   LocationSummary* summary =
     new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
@@ -3225,7 +3329,9 @@
   intptr_t right_cid = right()->Type()->ToCid();
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
-  if (left_cid == kSmiCid) {
+  if (this->left()->definition() == this->right()->definition()) {
+    __ testl(left, Immediate(kSmiTagMask));
+  } else  if (left_cid == kSmiCid) {
     __ testl(right, Immediate(kSmiTagMask));
   } else if (right_cid == kSmiCid) {
     __ testl(left, Immediate(kSmiTagMask));
@@ -4896,92 +5002,154 @@
 }
 
 
+// Pseudo code:
+// if (exponent == 0.0) return 1.0;
+// // Speed up simple cases.
+// if (exponent == 1.0) return base;
+// if (exponent == 2.0) return base * base;
+// if (exponent == 3.0) return base * base * base;
+// if (base == 1.0) return 1.0;
+// if (base.isNaN || exponent.isNaN) {
+//    return double.NAN;
+// }
+// if (base != -Infinity && exponent == 0.5) {
+//   if (base == 0.0) return 0.0;
+//   return sqrt(value);
+// }
+// TODO(srdjan): Move into a stub?
+static void InvokeDoublePow(FlowGraphCompiler* compiler,
+                            InvokeMathCFunctionInstr* instr) {
+  ASSERT(instr->recognized_kind() == MethodRecognizer::kMathDoublePow);
+  const intptr_t kInputCount = 2;
+  ASSERT(instr->InputCount() == kInputCount);
+  LocationSummary* locs = instr->locs();
+
+  XmmRegister base = locs->in(0).fpu_reg();
+  XmmRegister exp = locs->in(1).fpu_reg();
+  XmmRegister result = locs->out(0).fpu_reg();
+  Register temp = locs->temp(InvokeMathCFunctionInstr::kObjectTempIndex).reg();
+  XmmRegister zero_temp =
+      locs->temp(InvokeMathCFunctionInstr::kDoubleTempIndex).fpu_reg();
+
+  __ xorps(zero_temp, zero_temp);   // 0.0.
+  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(1.0)));
+  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+
+  Label check_base, skip_call;
+  // exponent == 0.0 -> return 1.0;
+  __ comisd(exp, zero_temp);
+  __ j(PARITY_EVEN, &check_base);
+  __ j(EQUAL, &skip_call);  // 'result' is 1.0.
+
+  // exponent == 1.0 ?
+  __ comisd(exp, result);
+  Label return_base;
+  __ j(EQUAL, &return_base, Assembler::kNearJump);
+
+  // exponent == 2.0 ?
+  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(2.0)));
+  __ movsd(XMM0, FieldAddress(temp, Double::value_offset()));
+  __ comisd(exp, XMM0);
+  Label return_base_times_2;
+  __ j(EQUAL, &return_base_times_2, Assembler::kNearJump);
+
+  // exponent == 3.0 ?
+  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(3.0)));
+  __ movsd(XMM0, FieldAddress(temp, Double::value_offset()));
+  __ comisd(exp, XMM0);
+  __ j(NOT_EQUAL, &check_base);
+
+  // Base times 3.
+  __ movsd(result, base);
+  __ mulsd(result, base);
+  __ mulsd(result, base);
+  __ jmp(&skip_call);
+
+  __ Bind(&return_base);
+  __ movsd(result, base);
+  __ jmp(&skip_call);
+
+  __ Bind(&return_base_times_2);
+  __ movsd(result, base);
+  __ mulsd(result, base);
+  __ jmp(&skip_call);
+
+  __ Bind(&check_base);
+  // Note: 'exp' could be NaN.
+
+  // base == 1.0 -> return 1.0;
+  __ comisd(base, result);
+  Label return_nan;
+  __ j(PARITY_EVEN, &return_nan, Assembler::kNearJump);
+  __ j(EQUAL, &skip_call, Assembler::kNearJump);
+  // Note: 'base' could be NaN.
+  __ comisd(exp, base);
+  // Neither 'exp' nor 'base' is NaN.
+  Label try_sqrt;
+  __ j(PARITY_ODD, &try_sqrt, Assembler::kNearJump);
+  // Return NaN.
+  __ Bind(&return_nan);
+  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(NAN)));
+  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+  __ jmp(&skip_call);
+
+  Label do_pow, return_zero;
+  __ Bind(&try_sqrt);
+  // Before calling pow, check if we could use sqrt instead of pow.
+  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(-INFINITY)));
+  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+  // base == -Infinity -> call pow;
+  __ comisd(base, result);
+  __ j(EQUAL, &do_pow, Assembler::kNearJump);
+
+  // exponent == 0.5 ?
+  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(0.5)));
+  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+  __ comisd(exp, result);
+  __ j(NOT_EQUAL, &do_pow, Assembler::kNearJump);
+
+  // base == 0 -> return 0;
+  __ comisd(base, zero_temp);
+  __ j(EQUAL, &return_zero, Assembler::kNearJump);
+
+  __ sqrtsd(result, base);
+  __ jmp(&skip_call, Assembler::kNearJump);
+
+  __ Bind(&return_zero);
+  __ movsd(result, zero_temp);
+  __ jmp(&skip_call);
+
+  __ Bind(&do_pow);
+  // Save ESP.
+  __ movl(locs->temp(InvokeMathCFunctionInstr::kSavedSpTempIndex).reg(), ESP);
+  __ ReserveAlignedFrameSpace(kDoubleSize * kInputCount);
+  for (intptr_t i = 0; i < kInputCount; i++) {
+    __ movsd(Address(ESP, kDoubleSize * i), locs->in(i).fpu_reg());
+  }
+  __ CallRuntime(instr->TargetFunction(), kInputCount);
+  __ fstpl(Address(ESP, 0));
+  __ movsd(locs->out(0).fpu_reg(), Address(ESP, 0));
+  // Restore ESP.
+  __ movl(ESP, locs->temp(InvokeMathCFunctionInstr::kSavedSpTempIndex).reg());
+  __ Bind(&skip_call);
+}
+
+
 void InvokeMathCFunctionInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
+    InvokeDoublePow(compiler, this);
+    return;
+  }
   // Save ESP.
   __ movl(locs()->temp(kSavedSpTempIndex).reg(), ESP);
   __ ReserveAlignedFrameSpace(kDoubleSize * InputCount());
   for (intptr_t i = 0; i < InputCount(); i++) {
     __ movsd(Address(ESP, kDoubleSize * i), locs()->in(i).fpu_reg());
   }
-  Label skip_call;
-  if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
-    // Pseudo code:
-    // if (exponent == 0.0) return 1.0;
-    // if (base == 1.0) return 1.0;
-    // if (base.isNaN || exponent.isNaN) {
-    //    return double.NAN;
-    // }
-    // if (base != -Infinity && exponent == 0.5) {
-    //   if (base == 0.0) return 0.0;
-    //   return sqrt(value);
-    // }
-    XmmRegister base = locs()->in(0).fpu_reg();
-    XmmRegister exp = locs()->in(1).fpu_reg();
-    XmmRegister result = locs()->out(0).fpu_reg();
-    Register temp = locs()->temp(kObjectTempIndex).reg();
-    XmmRegister zero_temp = locs()->temp(kDoubleTempIndex).fpu_reg();
-
-    Label try_sqrt, check_base, return_nan;
-    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(0)));
-    __ movsd(zero_temp, FieldAddress(temp, Double::value_offset()));
-    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(1)));
-    __ movsd(result, FieldAddress(temp, Double::value_offset()));
-
-    // exponent == 0.0 -> return 1.0;
-    __ comisd(exp, zero_temp);
-    __ j(PARITY_EVEN, &check_base, Assembler::kNearJump);
-    __ j(EQUAL, &skip_call, Assembler::kNearJump);  // 'result' is 1.0.
-
-    __ Bind(&check_base);
-    // Note: 'exp' could be NaN.
-
-    // base == 1.0 -> return 1.0;
-    __ comisd(base, result);
-    __ j(PARITY_EVEN, &return_nan, Assembler::kNearJump);
-    __ j(EQUAL, &skip_call, Assembler::kNearJump);
-    // Note: 'base' could be NaN.
-    __ comisd(exp, base);
-    // Neither 'exp' nor 'base' is NaN.
-    __ j(PARITY_ODD, &try_sqrt, Assembler::kNearJump);
-    // Return NaN.
-    __ Bind(&return_nan);
-    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(NAN)));
-    __ movsd(result, FieldAddress(temp, Double::value_offset()));
-    __ jmp(&skip_call);
-
-    Label do_pow, return_zero;
-    __ Bind(&try_sqrt);
-    // Before calling pow, check if we could use sqrt instead of pow.
-    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(-INFINITY)));
-    __ movsd(result, FieldAddress(temp, Double::value_offset()));
-    // base == -Infinity -> call pow;
-    __ comisd(base, result);
-    __ j(EQUAL, &do_pow, Assembler::kNearJump);
-
-    // exponent == 0.5 ?
-    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(0.5)));
-    __ movsd(result, FieldAddress(temp, Double::value_offset()));
-    __ comisd(exp, result);
-    __ j(NOT_EQUAL, &do_pow, Assembler::kNearJump);
-
-    // base == 0 -> return 0;
-    __ comisd(base, zero_temp);
-    __ j(EQUAL, &return_zero, Assembler::kNearJump);
-
-    __ sqrtsd(result, base);
-    __ jmp(&skip_call, Assembler::kNearJump);
-
-    __ Bind(&return_zero);
-    __ movsd(result, zero_temp);
-    __ jmp(&skip_call);
-
-    __ Bind(&do_pow);
-  }
 
   __ CallRuntime(TargetFunction(), InputCount());
   __ fstpl(Address(ESP, 0));
   __ movsd(locs()->out(0).fpu_reg(), Address(ESP, 0));
-  __ Bind(&skip_call);
   // Restore ESP.
   __ movl(ESP, locs()->temp(kSavedSpTempIndex).reg());
 }
@@ -5931,7 +6099,7 @@
         Utils::ShiftForPowerOfTwo(Utils::Maximum(true_value, false_value));
     __ shll(EDX, Immediate(shift + kSmiTagSize));
   } else {
-    __ subl(EDX, Immediate(1));
+    __ decl(EDX);
     __ andl(EDX, Immediate(
         Smi::RawValue(true_value) - Smi::RawValue(false_value)));
     if (false_value != 0) {
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 7f3f531..55e2020 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -570,7 +570,7 @@
     case GT: __ coltd(right, left); break;
     case GE: __ coled(right, left); break;
     default: {
-      // Should only passing the above conditions to this function.
+      // We should only be passing the above conditions to this function.
       UNREACHABLE();
       break;
     }
@@ -2056,16 +2056,117 @@
 }
 
 
+// Inlines array allocation for known constant values.
+static void InlineArrayAllocation(FlowGraphCompiler* compiler,
+                                   intptr_t num_elements,
+                                   Label* slow_path,
+                                   Label* done) {
+  const Register kLengthReg = A1;
+  const Register kElemTypeReg = A0;
+  const intptr_t kArraySize = Array::InstanceSize(num_elements);
+
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
+
+  __ LoadImmediate(T3, heap->TopAddress());
+  __ lw(V0, Address(T3, 0));  // Potential new object start.
+  // Potential next object start.
+  __ AddImmediateDetectOverflow(T1, V0, kArraySize, CMPRES1);
+  __ bltz(CMPRES1, slow_path);  // CMPRES1 < 0 on overflow.
+
+  // Check if the allocation fits into the remaining space.
+  // V0: potential new object start.
+  // T1: potential next object start.
+  __ LoadImmediate(T4, heap->EndAddress());
+  __ lw(T4, Address(T4, 0));
+  __ BranchUnsignedGreaterEqual(T1, T4, slow_path);
+
+
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  __ sw(T1, Address(T3, 0));
+  __ addiu(V0, V0, Immediate(kHeapObjectTag));
+  __ LoadImmediate(T2, kArraySize);
+  __ UpdateAllocationStatsWithSize(kArrayCid, T2, T4);
+
+  // Initialize the tags.
+  // V0: new object start as a tagged pointer.
+  {
+    uword tags = 0;
+    tags = RawObject::ClassIdTag::update(kArrayCid, tags);
+    tags = RawObject::SizeTag::update(kArraySize, tags);
+    __ LoadImmediate(T2, tags);
+    __ sw(T2, FieldAddress(V0, Array::tags_offset()));  // Store tags.
+  }
+  // V0: new object start as a tagged pointer.
+  // T1: new object end address.
+
+  // Store the type argument field.
+  __ StoreIntoObjectNoBarrier(V0,
+                              FieldAddress(V0, Array::type_arguments_offset()),
+                              kElemTypeReg);
+
+  // Set the length field.
+  __ StoreIntoObjectNoBarrier(V0,
+                              FieldAddress(V0, Array::length_offset()),
+                              kLengthReg);
+
+  __ LoadImmediate(T7, reinterpret_cast<int32_t>(Object::null()));
+  // Initialize all array elements to raw_null.
+  // V0: new object start as a tagged pointer.
+  // T1: new object end address.
+  // T2: iterator which initially points to the start of the variable
+  // data area to be initialized.
+  // T7: null.
+  __ AddImmediate(T2, V0, sizeof(RawArray) - kHeapObjectTag);
+
+  Label init_loop;
+  __ Bind(&init_loop);
+  __ BranchUnsignedGreaterEqual(T2, T1, done);
+  __ sw(T7, Address(T2, 0));
+  __ b(&init_loop);
+  __ delay_slot()->addiu(T2, T2, Immediate(kWordSize));
+}
+
+
 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ TraceSimMsg("CreateArrayInstr");
-  // Allocate the array.  A1 = length, A0 = element type.
-  ASSERT(locs()->in(0).reg() == A0);
-  ASSERT(locs()->in(1).reg() == A1);
+  const Register kLengthReg = A1;
+  const Register kElemTypeReg = A0;
+  const Register kResultReg = V0;
+  ASSERT(locs()->in(0).reg() == kElemTypeReg);
+  ASSERT(locs()->in(1).reg() == kLengthReg);
+
+  Label slow_path, done;
+  if (num_elements()->BindsToConstant() &&
+      num_elements()->BoundConstant().IsSmi()) {
+    const intptr_t length = Smi::Cast(num_elements()->BoundConstant()).Value();
+    if ((length >= 0) && (length <= Array::kMaxElements)) {
+      Label slow_path, done;
+      InlineArrayAllocation(compiler, length, &slow_path, &done);
+      __ Bind(&slow_path);
+      __ PushObject(Object::ZoneHandle());  // Make room for the result.
+      __ Push(kLengthReg);  // length.
+      __ Push(kElemTypeReg);
+      compiler->GenerateRuntimeCall(token_pos(),
+                                    deopt_id(),
+                                    kAllocateArrayRuntimeEntry,
+                                    2,
+                                    locs());
+      __ Drop(2);
+      __ Pop(kResultReg);
+      __ Bind(&done);
+      return;
+    }
+  }
+
+  __ Bind(&slow_path);
   compiler->GenerateCall(token_pos(),
                          &StubCode::AllocateArrayLabel(),
                          PcDescriptors::kOther,
                          locs());
-  ASSERT(locs()->out(0).reg() == V0);
+  __ Bind(&done);
+  ASSERT(locs()->out(0).reg() == kResultReg);
 }
 
 
@@ -2675,18 +2776,8 @@
   if (locs()->in(1).IsConstant()) {
     const Object& constant = locs()->in(1).constant();
     ASSERT(constant.IsSmi());
-    int32_t imm = reinterpret_cast<int32_t>(constant.raw());
+    const int32_t imm = reinterpret_cast<int32_t>(constant.raw());
     switch (op_kind()) {
-      case Token::kSUB: {
-        __ TraceSimMsg("kSUB imm");
-        if (deopt == NULL) {
-          __ AddImmediate(result, left, -imm);
-        } else {
-          __ SubImmediateDetectOverflow(result, left, imm, CMPRES1);
-          __ bltz(CMPRES1, deopt);
-        }
-        break;
-      }
       case Token::kADD: {
         if (deopt == NULL) {
           __ AddImmediate(result, left, imm);
@@ -2697,6 +2788,16 @@
         }
         break;
       }
+      case Token::kSUB: {
+        __ TraceSimMsg("kSUB imm");
+        if (deopt == NULL) {
+          __ AddImmediate(result, left, -imm);
+        } else {
+          __ SubImmediateDetectOverflow(result, left, imm, CMPRES1);
+          __ bltz(CMPRES1, deopt);
+        }
+        break;
+      }
       case Token::kMUL: {
         // Keep left value tagged and untag right value.
         const intptr_t value = Smi::Cast(constant).Value();
@@ -2804,7 +2905,9 @@
         }
 
         value = value + kSmiTagSize;
-        if (value >= kCountLimit) value = kCountLimit;
+        if (value >= kCountLimit) {
+          value = kCountLimit;
+        }
 
         __ sra(result, left, value);
         __ SmiTag(result);
@@ -2984,7 +3087,9 @@
   intptr_t right_cid = right()->Type()->ToCid();
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
-  if (left_cid == kSmiCid) {
+  if (this->left()->definition() == this->right()->definition()) {
+    __ andi(CMPRES1, left, Immediate(kSmiTagMask));
+  } else if (left_cid == kSmiCid) {
     __ andi(CMPRES1, right, Immediate(kSmiTagMask));
   } else if (right_cid == kSmiCid) {
     __ andi(CMPRES1, left, Immediate(kSmiTagMask));
@@ -3850,77 +3955,127 @@
 }
 
 
+// Pseudo code:
+// if (exponent == 0.0) return 1.0;
+// // Speed up simple cases.
+// if (exponent == 1.0) return base;
+// if (exponent == 2.0) return base * base;
+// if (exponent == 3.0) return base * base * base;
+// if (base == 1.0) return 1.0;
+// if (base.isNaN || exponent.isNaN) {
+//    return double.NAN;
+// }
+// if (base != -Infinity && exponent == 0.5) {
+//   if (base == 0.0) return 0.0;
+//   return sqrt(value);
+// }
+// TODO(srdjan): Move into a stub?
+static void InvokeDoublePow(FlowGraphCompiler* compiler,
+                            InvokeMathCFunctionInstr* instr) {
+  ASSERT(instr->recognized_kind() == MethodRecognizer::kMathDoublePow);
+  const intptr_t kInputCount = 2;
+  ASSERT(instr->InputCount() == kInputCount);
+  LocationSummary* locs = instr->locs();
+
+  DRegister base = locs->in(0).fpu_reg();
+  DRegister exp = locs->in(1).fpu_reg();
+  DRegister result = locs->out(0).fpu_reg();
+
+  Label check_base, skip_call;
+  __ LoadImmediate(DTMP, 0.0);
+  __ LoadImmediate(result, 1.0);
+  // exponent == 0.0 -> return 1.0;
+  __ cund(exp, exp);
+  __ bc1t(&check_base);  // NaN -> check base.
+  __ ceqd(exp, DTMP);
+  __ bc1t(&skip_call);  // exp is 0.0, result is 1.0.
+
+  // exponent == 1.0 ?
+  __ ceqd(exp, result);
+  Label return_base;
+  __ bc1t(&return_base);
+  // exponent == 2.0 ?
+  __ LoadImmediate(DTMP, 2.0);
+  __ ceqd(exp, DTMP);
+  Label return_base_times_2;
+  __ bc1t(&return_base_times_2);
+  // exponent == 3.0 ?
+  __ LoadImmediate(DTMP, 3.0);
+  __ ceqd(exp, DTMP);
+  __ bc1f(&check_base);
+
+  // base_times_3.
+  __ muld(result, base, base);
+  __ muld(result, result, base);
+  __ b(&skip_call);
+
+  __ Bind(&return_base);
+  __ movd(result, base);
+  __ b(&skip_call);
+
+  __ Bind(&return_base_times_2);
+  __ muld(result, base, base);
+  __ b(&skip_call);
+
+  __ Bind(&check_base);
+  // Note: 'exp' could be NaN.
+  // base == 1.0 -> return 1.0;
+  __ cund(base, base);
+  Label return_nan;
+  __ bc1t(&return_nan);
+  __ ceqd(base, result);
+  __ bc1t(&skip_call);  // base and result are 1.0.
+
+  __ cund(exp, exp);
+  Label try_sqrt;
+  __ bc1f(&try_sqrt);  // Neither 'exp' nor 'base' are NaN.
+
+  __ Bind(&return_nan);
+  __ LoadImmediate(result, NAN);
+  __ b(&skip_call);
+
+  __ Bind(&try_sqrt);
+  // Before calling pow, check if we could use sqrt instead of pow.
+  __ LoadImmediate(result, INFINITY);
+  // base == -Infinity -> call pow;
+  __ ceqd(base, result);
+  Label do_pow;
+  __ b(&do_pow);
+
+  // exponent == 0.5 ?
+  __ LoadImmediate(result, 0.5);
+  __ ceqd(base, result);
+  __ bc1f(&do_pow);
+
+  // base == 0 -> return 0;
+  __ LoadImmediate(DTMP, 0.0);
+  __ ceqd(base, DTMP);
+  Label return_zero;
+  __ bc1t(&return_zero);
+
+  __ sqrtd(result, base);
+  __ b(&skip_call);
+
+  __ Bind(&return_zero);
+  __ movd(result, DTMP);
+  __ b(&skip_call);
+
+  __ Bind(&do_pow);
+
+  // double values are passed and returned in vfp registers.
+  __ CallRuntime(instr->TargetFunction(), kInputCount);
+  __ Bind(&skip_call);
+}
+
+
 void InvokeMathCFunctionInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // For pow-function return NaN if exponent is NaN.
-  Label skip_call;
   if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
-    // Pseudo code:
-    // if (exponent == 0.0) return 1.0;
-    // if (base == 1.0) return 1.0;
-    // if (base.isNaN || exponent.isNaN) {
-    //    return double.NAN;
-    // }
-    // if (base != -Infinity && exponent == 0.5) {
-    //   if (base == 0.0) return 0.0;
-    //   return sqrt(value);
-    // }
-    DRegister base = locs()->in(0).fpu_reg();
-    DRegister exp = locs()->in(1).fpu_reg();
-    DRegister result = locs()->out(0).fpu_reg();
-
-    Label try_sqrt, check_base, return_nan;
-    __ LoadImmediate(DTMP, 0.0);
-    __ LoadImmediate(result, 1.0);
-    // exponent == 0.0 -> return 1.0;
-    __ cund(exp, exp);
-    __ bc1t(&check_base);  // NaN -> check base.
-    __ ceqd(exp, DTMP);
-    __ bc1t(&skip_call);  // exp is 0.0, result is 1.0.
-
-    __ Bind(&check_base);
-    // Note: 'exp' could be NaN.
-    // base == 1.0 -> return 1.0;
-    __ cund(base, base);
-    __ bc1t(&return_nan);
-    __ ceqd(base, result);
-    __ bc1t(&skip_call);  // base and result are 1.0.
-
-    __ cund(exp, exp);
-    __ bc1f(&try_sqrt);  // Neither 'exp' nor 'base' are NaN.
-
-    __ Bind(&return_nan);
-    __ LoadImmediate(result, NAN);
-    __ b(&skip_call);
-
-    __ Bind(&try_sqrt);
-    // Before calling pow, check if we could use sqrt instead of pow.
-    Label do_pow, return_zero;
-    __ LoadImmediate(result, INFINITY);
-    // base == -Infinity -> call pow;
-    __ ceqd(base, result);
-    __ b(&do_pow);
-
-    // exponent == 0.5 ?
-    __ LoadImmediate(result, 0.5);
-    __ ceqd(base, result);
-    __ bc1f(&do_pow);
-
-    // base == 0 -> return 0;
-    __ ceqd(base, DTMP);
-    __ bc1t(&return_zero);
-
-    __ sqrtd(result, base);
-    __ b(&skip_call);
-
-    __ Bind(&return_zero);
-    __ movd(result, DTMP);
-    __ b(&skip_call);
-
-    __ Bind(&do_pow);
+    InvokeDoublePow(compiler, this);
+    return;
   }
   // double values are passed and returned in vfp registers.
   __ CallRuntime(TargetFunction(), InputCount());
-  __ Bind(&skip_call);
 }
 
 
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 3574404..3c03cae 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -168,7 +168,7 @@
         Utils::ShiftForPowerOfTwo(Utils::Maximum(true_value, false_value));
     __ shlq(RDX, Immediate(shift + kSmiTagSize));
   } else {
-    __ AddImmediate(RDX, Immediate(-1), PP);
+    __ decq(RDX);
     __ AndImmediate(RDX,
         Immediate(Smi::RawValue(true_value) - Smi::RawValue(false_value)), PP);
     if (false_value != 0) {
@@ -1940,6 +1940,8 @@
 }
 
 
+// TODO(srdjan): In case of constant inputs make CreateArray kNoCall and
+// use slow path stub.
 LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
@@ -1952,15 +1954,115 @@
 }
 
 
+// Inlines array allocation for known constant values.
+static void InlineArrayAllocation(FlowGraphCompiler* compiler,
+                                   intptr_t num_elements,
+                                   Label* slow_path,
+                                   Label* done) {
+  const Register kLengthReg = R10;
+  const Register kElemTypeReg = RBX;
+  const intptr_t kArraySize = Array::InstanceSize(num_elements);
+
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
+
+  __ movq(RAX, Immediate(heap->TopAddress()));
+  __ movq(RAX, Address(RAX, 0));
+  __ movq(RCX, RAX);
+
+  __ addq(RCX, Immediate(kArraySize));
+  __ j(CARRY, slow_path);
+
+  // Check if the allocation fits into the remaining space.
+  // RAX: potential new object start.
+  // RCX: potential next object start.
+  __ movq(R13, Immediate(heap->EndAddress()));
+  __ cmpq(RCX, Address(R13, 0));
+  __ j(ABOVE_EQUAL, slow_path);
+
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  __ movq(R13, Immediate(heap->TopAddress()));
+  __ movq(Address(R13, 0), RCX);
+  __ addq(RAX, Immediate(kHeapObjectTag));
+  __ movq(R13, Immediate(kArraySize));
+  __ UpdateAllocationStatsWithSize(kArrayCid, R13);
+
+  // Initialize the tags.
+  // RAX: new object start as a tagged pointer.
+  {
+    uword tags = 0;
+    tags = RawObject::ClassIdTag::update(kArrayCid, tags);
+    tags = RawObject::SizeTag::update(kArraySize, tags);
+    __ movq(FieldAddress(RAX, Array::tags_offset()), Immediate(tags));
+  }
+
+  // RAX: new object start as a tagged pointer.
+  // Store the type argument field.
+  __ StoreIntoObjectNoBarrier(RAX,
+                              FieldAddress(RAX, Array::type_arguments_offset()),
+                              kElemTypeReg);
+
+  // Set the length field.
+  __ StoreIntoObjectNoBarrier(RAX,
+                              FieldAddress(RAX, Array::length_offset()),
+                              kLengthReg);
+
+  // Initialize all array elements to raw_null.
+  // RAX: new object start as a tagged pointer.
+  // RCX: new object end address.
+  // RDI: iterator which initially points to the start of the variable
+  // data area to be initialized.
+  __ LoadObject(R12, Object::null_object(), PP);
+  __ leaq(RDI, FieldAddress(RAX, sizeof(RawArray)));
+  Label init_loop;
+  __ Bind(&init_loop);
+  __ cmpq(RDI, RCX);
+  __ j(ABOVE_EQUAL, done, Assembler::kNearJump);
+  __ movq(Address(RDI, 0), R12);
+  __ addq(RDI, Immediate(kWordSize));
+  __ jmp(&init_loop, Assembler::kNearJump);
+}
+
+
 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // Allocate the array.  R10 = length, RBX = element type.
-  ASSERT(locs()->in(0).reg() == RBX);
-  ASSERT(locs()->in(1).reg() == R10);
+  const Register kLengthReg = R10;
+  const Register kElemTypeReg = RBX;
+  const Register kResultReg = RAX;
+  ASSERT(locs()->in(0).reg() == kElemTypeReg);
+  ASSERT(locs()->in(1).reg() == kLengthReg);
+
+  Label slow_path, done;
+  if (num_elements()->BindsToConstant() &&
+      num_elements()->BoundConstant().IsSmi()) {
+    const intptr_t length = Smi::Cast(num_elements()->BoundConstant()).Value();
+    if ((length >= 0) && (length <= Array::kMaxElements)) {
+      Label slow_path, done;
+      InlineArrayAllocation(compiler, length, &slow_path, &done);
+      __ Bind(&slow_path);
+      __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+      __ pushq(kLengthReg);
+      __ pushq(kElemTypeReg);
+      compiler->GenerateRuntimeCall(token_pos(),
+                                    deopt_id(),
+                                    kAllocateArrayRuntimeEntry,
+                                    2,
+                                    locs());
+      __ Drop(2);
+      __ popq(kResultReg);
+      __ Bind(&done);
+      return;
+    }
+  }
+
+  __ Bind(&slow_path);
   compiler->GenerateCall(token_pos(),
                          &StubCode::AllocateArrayLabel(),
                          PcDescriptors::kOther,
                          locs());
-  ASSERT(locs()->out(0).reg() == RAX);
+  __ Bind(&done);
+  ASSERT(locs()->out(0).reg() == kResultReg);
 }
 
 
@@ -2492,6 +2594,8 @@
                                         Register result) {
   if (!range->IsWithin(-0x20000000000000LL, 0x20000000000000LL)) {
     ASSERT(overflow != NULL);
+    // TODO(zra): This can be tightened to one compare/branch using:
+    // overflow = (result + 2^52) > 2^53 with an unsigned comparison.
     __ CompareImmediate(result, Immediate(-0x20000000000000LL), PP);
     __ j(LESS, overflow);
     __ CompareImmediate(result, Immediate(0x20000000000000LL), PP);
@@ -2739,17 +2843,22 @@
   if (locs()->in(1).IsConstant()) {
     const Object& constant = locs()->in(1).constant();
     ASSERT(constant.IsSmi());
-    const int64_t imm =
-        reinterpret_cast<int64_t>(constant.raw());
+    const int64_t imm = reinterpret_cast<int64_t>(constant.raw());
     switch (op_kind()) {
       case Token::kADD: {
-        __ AddImmediate(left, Immediate(imm), PP);
-        if (deopt != NULL) __ j(OVERFLOW, deopt);
+        if (imm != 0) {
+          // Checking overflow without emitting an instruction would be wrong.
+          __ AddImmediate(left, Immediate(imm), PP);
+          if (deopt != NULL) __ j(OVERFLOW, deopt);
+        }
         break;
       }
       case Token::kSUB: {
-        __ AddImmediate(left, Immediate(-imm), PP);
-        if (deopt != NULL) __ j(OVERFLOW, deopt);
+        if (imm != 0) {
+          // Checking overflow without emitting an instruction would be wrong.
+          __ SubImmediate(left, Immediate(imm), PP);
+          if (deopt != NULL) __ j(OVERFLOW, deopt);
+        }
         break;
       }
       case Token::kMUL: {
@@ -3092,7 +3201,9 @@
   intptr_t right_cid = right()->Type()->ToCid();
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
   const intptr_t kNumInputs = 2;
-  const bool need_temp = (left_cid != kSmiCid) && (right_cid != kSmiCid);
+  const bool need_temp = (left()->definition() != right()->definition())
+                      && (left_cid != kSmiCid)
+                      && (right_cid != kSmiCid);
   const intptr_t kNumTemps = need_temp ? 1 : 0;
   LocationSummary* summary =
     new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
@@ -3110,7 +3221,9 @@
   intptr_t right_cid = right()->Type()->ToCid();
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
-  if (left_cid == kSmiCid) {
+  if (this->left()->definition() == this->right()->definition()) {
+    __ testq(left, Immediate(kSmiTagMask));
+  } else if (left_cid == kSmiCid) {
     __ testq(right, Immediate(kSmiTagMask));
   } else if (right_cid == kSmiCid) {
     __ testq(left, Immediate(kSmiTagMask));
@@ -4794,7 +4907,146 @@
 }
 
 
+// Pseudo code:
+// if (exponent == 0.0) return 1.0;
+// // Speed up simple cases.
+// if (exponent == 1.0) return base;
+// if (exponent == 2.0) return base * base;
+// if (exponent == 3.0) return base * base * base;
+// if (base == 1.0) return 1.0;
+// if (base.isNaN || exponent.isNaN) {
+//    return double.NAN;
+// }
+// if (base != -Infinity && exponent == 0.5) {
+//   if (base == 0.0) return 0.0;
+//   return sqrt(value);
+// }
+// TODO(srdjan): Move into a stub?
+static void InvokeDoublePow(FlowGraphCompiler* compiler,
+                            InvokeMathCFunctionInstr* instr) {
+  ASSERT(instr->recognized_kind() == MethodRecognizer::kMathDoublePow);
+  const intptr_t kInputCount = 2;
+  ASSERT(instr->InputCount() == kInputCount);
+  LocationSummary* locs = instr->locs();
+
+  XmmRegister base = locs->in(0).fpu_reg();
+  XmmRegister exp = locs->in(1).fpu_reg();
+  XmmRegister result = locs->out(0).fpu_reg();
+  Register temp =
+      locs->temp(InvokeMathCFunctionInstr::kObjectTempIndex).reg();
+  XmmRegister zero_temp =
+      locs->temp(InvokeMathCFunctionInstr::kDoubleTempIndex).fpu_reg();
+
+  __ xorps(zero_temp, zero_temp);
+  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(1)), PP);
+  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+
+  Label check_base, skip_call;
+  // exponent == 0.0 -> return 1.0;
+  __ comisd(exp, zero_temp);
+  __ j(PARITY_EVEN, &check_base, Assembler::kNearJump);
+  __ j(EQUAL, &skip_call);  // 'result' is 1.0.
+
+  // exponent == 1.0 ?
+  __ comisd(exp, result);
+  Label return_base;
+  __ j(EQUAL, &return_base, Assembler::kNearJump);
+
+  // exponent == 2.0 ?
+  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(2.0)), PP);
+  __ movsd(XMM0, FieldAddress(temp, Double::value_offset()));
+  __ comisd(exp, XMM0);
+  Label return_base_times_2;
+  __ j(EQUAL, &return_base_times_2, Assembler::kNearJump);
+
+  // exponent == 3.0 ?
+  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(3.0)), PP);
+  __ movsd(XMM0, FieldAddress(temp, Double::value_offset()));
+  __ comisd(exp, XMM0);
+  __ j(NOT_EQUAL, &check_base);
+
+  // Base times 3.
+  __ movsd(result, base);
+  __ mulsd(result, base);
+  __ mulsd(result, base);
+  __ jmp(&skip_call);
+
+  __ Bind(&return_base);
+  __ movsd(result, base);
+  __ jmp(&skip_call);
+
+  __ Bind(&return_base_times_2);
+  __ movsd(result, base);
+  __ mulsd(result, base);
+  __ jmp(&skip_call);
+
+  __ Bind(&check_base);
+  // Note: 'exp' could be NaN.
+
+  Label return_nan;
+  // base == 1.0 -> return 1.0;
+  __ comisd(base, result);
+  __ j(PARITY_EVEN, &return_nan, Assembler::kNearJump);
+  __ j(EQUAL, &skip_call, Assembler::kNearJump);
+  // Note: 'base' could be NaN.
+  __ comisd(exp, base);
+  // Neither 'exp' nor 'base' is NaN.
+  Label try_sqrt;
+  __ j(PARITY_ODD, &try_sqrt, Assembler::kNearJump);
+  // Return NaN.
+  __ Bind(&return_nan);
+  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(NAN)), PP);
+  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+  __ jmp(&skip_call);
+
+  Label do_pow, return_zero;
+  __ Bind(&try_sqrt);
+  // Before calling pow, check if we could use sqrt instead of pow.
+  __ LoadObject(temp,
+      Double::ZoneHandle(Double::NewCanonical(-INFINITY)), PP);
+  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+  // base == -Infinity -> call pow;
+  __ comisd(base, result);
+  __ j(EQUAL, &do_pow, Assembler::kNearJump);
+
+  // exponent == 0.5 ?
+  __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(0.5)), PP);
+  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+  __ comisd(exp, result);
+  __ j(NOT_EQUAL, &do_pow, Assembler::kNearJump);
+
+  // base == 0 -> return 0;
+  __ comisd(base, zero_temp);
+  __ j(EQUAL, &return_zero, Assembler::kNearJump);
+
+  __ sqrtsd(result, base);
+  __ jmp(&skip_call, Assembler::kNearJump);
+
+  __ Bind(&return_zero);
+  __ movsd(result, zero_temp);
+  __ jmp(&skip_call);
+
+  __ Bind(&do_pow);
+
+  // Save RSP.
+  __ movq(locs->temp(InvokeMathCFunctionInstr::kSavedSpTempIndex).reg(), RSP);
+  __ ReserveAlignedFrameSpace(0);
+  __ movaps(XMM0, locs->in(0).fpu_reg());
+  ASSERT(locs->in(1).fpu_reg() == XMM1);
+
+  __ CallRuntime(instr->TargetFunction(), kInputCount);
+  __ movaps(locs->out(0).fpu_reg(), XMM0);
+  // Restore RSP.
+  __ movq(RSP, locs->temp(InvokeMathCFunctionInstr::kSavedSpTempIndex).reg());
+  __ Bind(&skip_call);
+}
+
+
 void InvokeMathCFunctionInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
+    InvokeDoublePow(compiler, this);
+    return;
+  }
   // Save RSP.
   __ movq(locs()->temp(kSavedSpTempIndex).reg(), RSP);
   __ ReserveAlignedFrameSpace(0);
@@ -4803,84 +5055,8 @@
     ASSERT(locs()->in(1).fpu_reg() == XMM1);
   }
 
-  Label skip_call;
-  if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
-    // Pseudo code:
-    // if (exponent == 0.0) return 1.0;
-    // if (base == 1.0) return 1.0;
-    // if (base.isNaN || exponent.isNaN) {
-    //    return double.NAN;
-    // }
-    // if (base != -Infinity && exponent == 0.5) {
-    //   if (base == 0.0) return 0.0;
-    //   return sqrt(value);
-    // }
-    XmmRegister base = locs()->in(0).fpu_reg();
-    XmmRegister exp = locs()->in(1).fpu_reg();
-    XmmRegister result = locs()->out(0).fpu_reg();
-    Register temp = locs()->temp(kObjectTempIndex).reg();
-    XmmRegister zero_temp = locs()->temp(kDoubleTempIndex).fpu_reg();
-
-    Label try_sqrt, check_base, return_nan;
-    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(0)), PP);
-    __ movsd(zero_temp, FieldAddress(temp, Double::value_offset()));
-    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(1)), PP);
-    __ movsd(result, FieldAddress(temp, Double::value_offset()));
-
-    // exponent == 0.0 -> return 1.0;
-    __ comisd(exp, zero_temp);
-    __ j(PARITY_EVEN, &check_base, Assembler::kNearJump);
-    __ j(EQUAL, &skip_call, Assembler::kNearJump);  // 'result' is 1.0.
-
-    __ Bind(&check_base);
-    // Note: 'exp' could be NaN.
-
-    // base == 1.0 -> return 1.0;
-    __ comisd(base, result);
-    __ j(PARITY_EVEN, &return_nan, Assembler::kNearJump);
-    __ j(EQUAL, &skip_call, Assembler::kNearJump);
-    // Note: 'base' could be NaN.
-    __ comisd(exp, base);
-    // Neither 'exp' nor 'base' is NaN.
-    __ j(PARITY_ODD, &try_sqrt, Assembler::kNearJump);
-    // Return NaN.
-    __ Bind(&return_nan);
-    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(NAN)), PP);
-    __ movsd(result, FieldAddress(temp, Double::value_offset()));
-    __ jmp(&skip_call);
-
-    Label do_pow, return_zero;
-    __ Bind(&try_sqrt);
-    // Before calling pow, check if we could use sqrt instead of pow.
-    __ LoadObject(temp,
-        Double::ZoneHandle(Double::NewCanonical(-INFINITY)), PP);
-    __ movsd(result, FieldAddress(temp, Double::value_offset()));
-    // base == -Infinity -> call pow;
-    __ comisd(base, result);
-    __ j(EQUAL, &do_pow, Assembler::kNearJump);
-
-    // exponent == 0.5 ?
-    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(0.5)), PP);
-    __ movsd(result, FieldAddress(temp, Double::value_offset()));
-    __ comisd(exp, result);
-    __ j(NOT_EQUAL, &do_pow, Assembler::kNearJump);
-
-    // base == 0 -> return 0;
-    __ comisd(base, zero_temp);
-    __ j(EQUAL, &return_zero, Assembler::kNearJump);
-
-    __ sqrtsd(result, base);
-    __ jmp(&skip_call, Assembler::kNearJump);
-
-    __ Bind(&return_zero);
-    __ movsd(result, zero_temp);
-    __ jmp(&skip_call);
-
-    __ Bind(&do_pow);
-  }
   __ CallRuntime(TargetFunction(), InputCount());
   __ movaps(locs()->out(0).fpu_reg(), XMM0);
-  __ Bind(&skip_call);
   // Restore RSP.
   __ movq(RSP, locs()->temp(kSavedSpTempIndex).reg());
 }
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index 5f68d68..98b2267 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -31,7 +31,6 @@
   V(_Double, get:isNegative, Double_getIsNegative, 1711421660)                 \
   V(_Double, _mulFromInteger, Double_mulFromInteger, 1392340623)               \
   V(_Double, .fromInteger, Double_fromInteger, 2033384877)                     \
-  V(_List, ., List_Allocate, 176587978)                                        \
   V(_List, get:length, Array_getLength, 215183186)                             \
   V(_List, [], Array_getIndexed, 675155875)                                    \
   V(_List, []=, Array_setIndexed, 1228569706)                                  \
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 0af28a0..f55b91c 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -21,112 +21,6 @@
 
 #define __ assembler->
 
-void Intrinsifier::List_Allocate(Assembler* assembler) {
-  const intptr_t kTypeArgumentsOffset = 1 * kWordSize;
-  const intptr_t kArrayLengthOffset = 0 * kWordSize;
-  Label fall_through;
-
-  // Compute the size to be allocated, it is based on the array length
-  // and is computed as:
-  // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
-  __ ldr(R3, Address(SP, kArrayLengthOffset));  // Array length.
-
-  // Check that length is a positive Smi.
-  __ tst(R3, ShifterOperand(kSmiTagMask));
-  __ b(&fall_through, NE);
-  __ cmp(R3, ShifterOperand(0));
-  __ b(&fall_through, LT);
-
-  // Check for maximum allowed length.
-  const intptr_t max_len =
-      reinterpret_cast<int32_t>(Smi::New(Array::kMaxElements));
-  __ CompareImmediate(R3, max_len);
-  __ b(&fall_through, GT);
-
-  const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
-  __ LoadImmediate(R2, fixed_size);
-  __ add(R2, R2, ShifterOperand(R3, LSL, 1));  // R3 is  a Smi.
-  ASSERT(kSmiTagShift == 1);
-  __ bic(R2, R2, ShifterOperand(kObjectAlignment - 1));
-
-  // R2: Allocation size.
-
-  Isolate* isolate = Isolate::Current();
-  Heap* heap = isolate->heap();
-
-  __ LoadImmediate(R6, heap->TopAddress());
-  __ ldr(R0, Address(R6, 0));  // Potential new object start.
-  __ adds(R1, R0, ShifterOperand(R2));  // Potential next object start.
-  __ b(&fall_through, VS);
-
-  // Check if the allocation fits into the remaining space.
-  // R0: potential new object start.
-  // R1: potential next object start.
-  // R2: allocation size.
-  __ LoadImmediate(R3, heap->EndAddress());
-  __ ldr(R3, Address(R3, 0));
-  __ cmp(R1, ShifterOperand(R3));
-  __ b(&fall_through, CS);
-
-  // Successfully allocated the object(s), now update top to point to
-  // next object start and initialize the object.
-  __ str(R1, Address(R6, 0));
-  __ add(R0, R0, ShifterOperand(kHeapObjectTag));
-  __ UpdateAllocationStatsWithSize(kArrayCid, R2, R4);
-
-  // Initialize the tags.
-  // R0: new object start as a tagged pointer.
-  // R1: new object end address.
-  // R2: allocation size.
-  {
-    const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
-    const Class& cls = Class::Handle(isolate->object_store()->array_class());
-
-    __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag);
-    __ mov(R2, ShifterOperand(R2, LSL, shift), LS);
-    __ mov(R2, ShifterOperand(0), HI);
-
-    // Get the class index and insert it into the tags.
-    // R2: size and bit tags.
-    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cls.id()));
-    __ orr(R2, R2, ShifterOperand(TMP));
-    __ str(R2, FieldAddress(R0, Array::tags_offset()));  // Store tags.
-  }
-
-  // R0: new object start as a tagged pointer.
-  // R1: new object end address.
-  // Store the type argument field.
-  __ ldr(R2, Address(SP, kTypeArgumentsOffset));  // Type argument.
-  __ StoreIntoObjectNoBarrier(R0,
-                              FieldAddress(R0, Array::type_arguments_offset()),
-                              R2);
-
-  // Set the length field.
-  __ ldr(R2, Address(SP, kArrayLengthOffset));  // Array Length.
-  __ StoreIntoObjectNoBarrier(R0,
-                              FieldAddress(R0, Array::length_offset()),
-                              R2);
-
-  // Initialize all array elements to raw_null.
-  // R0: new object start as a tagged pointer.
-  // R1: new object end address.
-  // R2: iterator which initially points to the start of the variable
-  // data area to be initialized.
-  // R3: null
-  __ LoadImmediate(R3, reinterpret_cast<intptr_t>(Object::null()));
-  __ AddImmediate(R2, R0, sizeof(RawArray) - kHeapObjectTag);
-
-  Label init_loop;
-  __ Bind(&init_loop);
-  __ cmp(R2, ShifterOperand(R1));
-  __ str(R3, Address(R2, 0), CC);
-  __ AddImmediate(R2, kWordSize, CC);
-  __ b(&init_loop, CC);
-
-  __ Ret();  // Returns the newly allocated object in R0.
-  __ Bind(&fall_through);
-}
-
 
 void Intrinsifier::Array_getLength(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
@@ -136,7 +30,7 @@
 
 
 void Intrinsifier::ImmutableList_getLength(Assembler* assembler) {
-  return Array_getLength(assembler);
+  Array_getLength(assembler);
 }
 
 
@@ -163,7 +57,7 @@
 
 
 void Intrinsifier::ImmutableList_getIndexed(Assembler* assembler) {
-  return Array_getIndexed(assembler);
+  Array_getIndexed(assembler);
 }
 
 
@@ -419,7 +313,9 @@
 // On stack: growable array (+1), value (+0).
 void Intrinsifier::GrowableList_add(Assembler* assembler) {
   // In checked mode we need to type-check the incoming argument.
-  if (FLAG_enable_type_checks) return;
+  if (FLAG_enable_type_checks) {
+    return;
+  }
   Label fall_through;
   // R0: Array.
   __ ldr(R0, Address(SP, 1 * kWordSize));
@@ -551,7 +447,7 @@
   }
   UNREACHABLE();
   return -1;
-};
+}
 
 
 #define TYPED_DATA_ALLOCATOR(clazz)                                            \
@@ -594,7 +490,7 @@
 
 
 void Intrinsifier::Integer_add(Assembler* assembler) {
-  return Integer_addFromInteger(assembler);
+  Integer_addFromInteger(assembler);
 }
 
 
@@ -622,7 +518,7 @@
   Label fall_through;
 
   TestBothArgumentsSmis(assembler, &fall_through);  // checks two smis
-  __ SmiUntag(R0);  // untags R6. only want result shifted by one
+  __ SmiUntag(R0);  // Untags R6. We only want result shifted by one.
 
   if (TargetCPUFeatures::arm_version() == ARMv7) {
     __ smull(R0, IP, R0, R1);  // IP:R0 <- R0 * R1.
@@ -639,7 +535,7 @@
 
 
 void Intrinsifier::Integer_mul(Assembler* assembler) {
-  return Integer_mulFromInteger(assembler);
+  Integer_mulFromInteger(assembler);
 }
 
 
@@ -701,7 +597,7 @@
 //  }
 void Intrinsifier::Integer_moduloFromInteger(Assembler* assembler) {
   // Check to see if we have integer division
-  Label fall_through, subtract;
+  Label fall_through;
   __ ldr(R1, Address(SP, + 0 * kWordSize));
   __ ldr(R0, Address(SP, + 1 * kWordSize));
   __ orr(TMP, R0, ShifterOperand(R1));
@@ -776,7 +672,7 @@
 
 
 void Intrinsifier::Integer_bitAnd(Assembler* assembler) {
-  return Integer_bitAndFromInteger(assembler);
+  Integer_bitAndFromInteger(assembler);
 }
 
 
@@ -792,7 +688,7 @@
 
 
 void Intrinsifier::Integer_bitOr(Assembler* assembler) {
-  return Integer_bitOrFromInteger(assembler);
+  Integer_bitOrFromInteger(assembler);
 }
 
 
@@ -808,7 +704,7 @@
 
 
 void Intrinsifier::Integer_bitXor(Assembler* assembler) {
-  return Integer_bitXorFromInteger(assembler);
+  Integer_bitXorFromInteger(assembler);
 }
 
 
@@ -947,27 +843,27 @@
 
 
 void Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) {
-  return CompareIntegers(assembler, LT);
+  CompareIntegers(assembler, LT);
 }
 
 
 void Intrinsifier::Integer_lessThan(Assembler* assembler) {
-  return Integer_greaterThanFromInt(assembler);
+  Integer_greaterThanFromInt(assembler);
 }
 
 
 void Intrinsifier::Integer_greaterThan(Assembler* assembler) {
-  return CompareIntegers(assembler, GT);
+  CompareIntegers(assembler, GT);
 }
 
 
 void Intrinsifier::Integer_lessEqualThan(Assembler* assembler) {
-  return CompareIntegers(assembler, LE);
+  CompareIntegers(assembler, LE);
 }
 
 
 void Intrinsifier::Integer_greaterEqualThan(Assembler* assembler) {
-  return CompareIntegers(assembler, GE);
+  CompareIntegers(assembler, GE);
 }
 
 
@@ -1025,7 +921,7 @@
 
 
 void Intrinsifier::Integer_equal(Assembler* assembler) {
-  return Integer_equalToInteger(assembler);
+  Integer_equalToInteger(assembler);
 }
 
 
@@ -1084,229 +980,244 @@
 // returns false. Any non-double arg1 causes control flow to fall through to the
 // slow case (compiled method body).
 static void CompareDoubles(Assembler* assembler, Condition true_condition) {
-  Label fall_through, is_smi, double_op;
+  if (TargetCPUFeatures::vfp_supported()) {
+    Label fall_through, is_smi, double_op;
 
-  TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
-  // Both arguments are double, right operand is in R0.
+    TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
+    // Both arguments are double, right operand is in R0.
 
-  __ LoadDFromOffset(D1, R0, Double::value_offset() - kHeapObjectTag);
-  __ Bind(&double_op);
-  __ ldr(R0, Address(SP, 1 * kWordSize));  // Left argument.
-  __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
+    __ LoadDFromOffset(D1, R0, Double::value_offset() - kHeapObjectTag);
+    __ Bind(&double_op);
+    __ ldr(R0, Address(SP, 1 * kWordSize));  // Left argument.
+    __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
 
-  __ vcmpd(D0, D1);
-  __ vmstat();
-  __ LoadObject(R0, Bool::False());
-  // Return false if D0 or D1 was NaN before checking true condition.
-  __ bx(LR, VS);
-  __ LoadObject(R0, Bool::True(), true_condition);
-  __ Ret();
+    __ vcmpd(D0, D1);
+    __ vmstat();
+    __ LoadObject(R0, Bool::False());
+    // Return false if D0 or D1 was NaN before checking true condition.
+    __ bx(LR, VS);
+    __ LoadObject(R0, Bool::True(), true_condition);
+    __ Ret();
 
-  __ Bind(&is_smi);  // Convert R0 to a double.
-  __ SmiUntag(R0);
-  __ vmovsr(S0, R0);
-  __ vcvtdi(D1, S0);
-  __ b(&double_op);  // Then do the comparison.
-  __ Bind(&fall_through);
+    __ Bind(&is_smi);  // Convert R0 to a double.
+    __ SmiUntag(R0);
+    __ vmovsr(S0, R0);
+    __ vcvtdi(D1, S0);
+    __ b(&double_op);  // Then do the comparison.
+    __ Bind(&fall_through);
+  }
 }
 
 
 void Intrinsifier::Double_greaterThan(Assembler* assembler) {
-  return CompareDoubles(assembler, HI);
+  CompareDoubles(assembler, HI);
 }
 
 
 void Intrinsifier::Double_greaterEqualThan(Assembler* assembler) {
-  return CompareDoubles(assembler, CS);
+  CompareDoubles(assembler, CS);
 }
 
 
 void Intrinsifier::Double_lessThan(Assembler* assembler) {
-  return CompareDoubles(assembler, CC);
+  CompareDoubles(assembler, CC);
 }
 
 
 void Intrinsifier::Double_equal(Assembler* assembler) {
-  return CompareDoubles(assembler, EQ);
+  CompareDoubles(assembler, EQ);
 }
 
 
 void Intrinsifier::Double_lessEqualThan(Assembler* assembler) {
-  return CompareDoubles(assembler, LS);
+  CompareDoubles(assembler, LS);
 }
 
 
 // Expects left argument to be double (receiver). Right argument is unknown.
 // Both arguments are on stack.
 static void DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
-  Label fall_through;
+  if (TargetCPUFeatures::vfp_supported()) {
+    Label fall_through;
 
-  TestLastArgumentIsDouble(assembler, &fall_through, &fall_through);
-  // Both arguments are double, right operand is in R0.
-  __ LoadDFromOffset(D1, R0, Double::value_offset() - kHeapObjectTag);
-  __ ldr(R0, Address(SP, 1 * kWordSize));  // Left argument.
-  __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
-  switch (kind) {
-    case Token::kADD: __ vaddd(D0, D0, D1); break;
-    case Token::kSUB: __ vsubd(D0, D0, D1); break;
-    case Token::kMUL: __ vmuld(D0, D0, D1); break;
-    case Token::kDIV: __ vdivd(D0, D0, D1); break;
-    default: UNREACHABLE();
+    TestLastArgumentIsDouble(assembler, &fall_through, &fall_through);
+    // Both arguments are double, right operand is in R0.
+    __ LoadDFromOffset(D1, R0, Double::value_offset() - kHeapObjectTag);
+    __ ldr(R0, Address(SP, 1 * kWordSize));  // Left argument.
+    __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
+    switch (kind) {
+      case Token::kADD: __ vaddd(D0, D0, D1); break;
+      case Token::kSUB: __ vsubd(D0, D0, D1); break;
+      case Token::kMUL: __ vmuld(D0, D0, D1); break;
+      case Token::kDIV: __ vdivd(D0, D0, D1); break;
+      default: UNREACHABLE();
+    }
+    const Class& double_class = Class::Handle(
+        Isolate::Current()->object_store()->double_class());
+    __ TryAllocate(double_class, &fall_through, R0, R1);  // Result register.
+    __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
+    __ Ret();
+    __ Bind(&fall_through);
   }
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class, &fall_through, R0, R1);  // Result register.
-  __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
-  __ Ret();
-  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Double_add(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kADD);
+  DoubleArithmeticOperations(assembler, Token::kADD);
 }
 
 
 void Intrinsifier::Double_mul(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kMUL);
+  DoubleArithmeticOperations(assembler, Token::kMUL);
 }
 
 
 void Intrinsifier::Double_sub(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kSUB);
+  DoubleArithmeticOperations(assembler, Token::kSUB);
 }
 
 
 void Intrinsifier::Double_div(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kDIV);
+  DoubleArithmeticOperations(assembler, Token::kDIV);
 }
 
 
 // Left is double right is integer (Bigint, Mint or Smi)
 void Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
-  Label fall_through;
-  // Only smis allowed.
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ tst(R0, ShifterOperand(kSmiTagMask));
-  __ b(&fall_through, NE);
-  // Is Smi.
-  __ SmiUntag(R0);
-  __ vmovsr(S0, R0);
-  __ vcvtdi(D1, S0);
-  __ ldr(R0, Address(SP, 1 * kWordSize));
-  __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
-  __ vmuld(D0, D0, D1);
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class, &fall_through, R0, R1);  // Result register.
-  __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
-  __ Ret();
-  __ Bind(&fall_through);
+  if (TargetCPUFeatures::vfp_supported()) {
+    Label fall_through;
+    // Only smis allowed.
+    __ ldr(R0, Address(SP, 0 * kWordSize));
+    __ tst(R0, ShifterOperand(kSmiTagMask));
+    __ b(&fall_through, NE);
+    // Is Smi.
+    __ SmiUntag(R0);
+    __ vmovsr(S0, R0);
+    __ vcvtdi(D1, S0);
+    __ ldr(R0, Address(SP, 1 * kWordSize));
+    __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
+    __ vmuld(D0, D0, D1);
+    const Class& double_class = Class::Handle(
+        Isolate::Current()->object_store()->double_class());
+    __ TryAllocate(double_class, &fall_through, R0, R1);  // Result register.
+    __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
+    __ Ret();
+    __ Bind(&fall_through);
+  }
 }
 
 
 void Intrinsifier::Double_fromInteger(Assembler* assembler) {
-  Label fall_through;
+  if (TargetCPUFeatures::vfp_supported()) {
+    Label fall_through;
 
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ tst(R0, ShifterOperand(kSmiTagMask));
-  __ b(&fall_through, NE);
-  // Is Smi.
-  __ SmiUntag(R0);
-  __ vmovsr(S0, R0);
-  __ vcvtdi(D0, S0);
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class, &fall_through, R0, R1);  // Result register.
-  __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
-  __ Ret();
-  __ Bind(&fall_through);
+    __ ldr(R0, Address(SP, 0 * kWordSize));
+    __ tst(R0, ShifterOperand(kSmiTagMask));
+    __ b(&fall_through, NE);
+    // Is Smi.
+    __ SmiUntag(R0);
+    __ vmovsr(S0, R0);
+    __ vcvtdi(D0, S0);
+    const Class& double_class = Class::Handle(
+        Isolate::Current()->object_store()->double_class());
+    __ TryAllocate(double_class, &fall_through, R0, R1);  // Result register.
+    __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
+    __ Ret();
+    __ Bind(&fall_through);
+  }
 }
 
 
 void Intrinsifier::Double_getIsNaN(Assembler* assembler) {
-  Label is_true;
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
-  __ vcmpd(D0, D0);
-  __ vmstat();
-  __ LoadObject(R0, Bool::False(), VC);
-  __ LoadObject(R0, Bool::True(), VS);
-  __ Ret();
+  if (TargetCPUFeatures::vfp_supported()) {
+    Label is_true;
+    __ ldr(R0, Address(SP, 0 * kWordSize));
+    __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
+    __ vcmpd(D0, D0);
+    __ vmstat();
+    __ LoadObject(R0, Bool::False(), VC);
+    __ LoadObject(R0, Bool::True(), VS);
+    __ Ret();
+  }
 }
 
 
 void Intrinsifier::Double_getIsNegative(Assembler* assembler) {
-  Label is_false, is_true, is_zero;
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
-  __ LoadDImmediate(D1, 0.0, R1);
-  __ vcmpd(D0, D1);
-  __ vmstat();
-  __ b(&is_false, VS);  // NaN -> false.
-  __ b(&is_zero, EQ);  // Check for negative zero.
-  __ b(&is_false, CS);  // >= 0 -> false.
+  if (TargetCPUFeatures::vfp_supported()) {
+    Label is_false, is_true, is_zero;
+    __ ldr(R0, Address(SP, 0 * kWordSize));
+    __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
+    __ vcmpdz(D0);
+    __ vmstat();
+    __ b(&is_false, VS);  // NaN -> false.
+    __ b(&is_zero, EQ);  // Check for negative zero.
+    __ b(&is_false, CS);  // >= 0 -> false.
 
-  __ Bind(&is_true);
-  __ LoadObject(R0, Bool::True());
-  __ Ret();
+    __ Bind(&is_true);
+    __ LoadObject(R0, Bool::True());
+    __ Ret();
 
-  __ Bind(&is_false);
-  __ LoadObject(R0, Bool::False());
-  __ Ret();
+    __ Bind(&is_false);
+    __ LoadObject(R0, Bool::False());
+    __ Ret();
 
-  __ Bind(&is_zero);
-  // Check for negative zero by looking at the sign bit.
-  __ vmovrrd(R0, R1, D0);  // R1:R0 <- D0, so sign bit is in bit 31 of R1.
-  __ mov(R1, ShifterOperand(R1, LSR, 31));
-  __ tst(R1, ShifterOperand(1));
-  __ b(&is_true, NE);  // Sign bit set.
-  __ b(&is_false);
+    __ Bind(&is_zero);
+    // Check for negative zero by looking at the sign bit.
+    __ vmovrrd(R0, R1, D0);  // R1:R0 <- D0, so sign bit is in bit 31 of R1.
+    __ mov(R1, ShifterOperand(R1, LSR, 31));
+    __ tst(R1, ShifterOperand(1));
+    __ b(&is_true, NE);  // Sign bit set.
+    __ b(&is_false);
+  }
 }
 
 
 void Intrinsifier::Double_toInt(Assembler* assembler) {
-  Label fall_through;
+  if (TargetCPUFeatures::vfp_supported()) {
+    Label fall_through;
 
-  __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
+    __ ldr(R0, Address(SP, 0 * kWordSize));
+    __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
 
-  // Explicit NaN check, since ARM gives an FPU exception if you try to
-  // convert NaN to an int.
-  __ vcmpd(D0, D0);
-  __ vmstat();
-  __ b(&fall_through, VS);
+    // Explicit NaN check, since ARM gives an FPU exception if you try to
+    // convert NaN to an int.
+    __ vcmpd(D0, D0);
+    __ vmstat();
+    __ b(&fall_through, VS);
 
-  __ vcvtid(S0, D0);
-  __ vmovrs(R0, S0);
-  // Overflow is signaled with minint.
-  // Check for overflow and that it fits into Smi.
-  __ CompareImmediate(R0, 0xC0000000);
-  __ b(&fall_through, MI);
-  __ SmiTag(R0);
-  __ Ret();
-  __ Bind(&fall_through);
+    __ vcvtid(S0, D0);
+    __ vmovrs(R0, S0);
+    // Overflow is signaled with minint.
+    // Check for overflow and that it fits into Smi.
+    __ CompareImmediate(R0, 0xC0000000);
+    __ b(&fall_through, MI);
+    __ SmiTag(R0);
+    __ Ret();
+    __ Bind(&fall_through);
+  }
 }
 
 
 void Intrinsifier::Math_sqrt(Assembler* assembler) {
-  Label fall_through, is_smi, double_op;
-  TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
-  // Argument is double and is in R0.
-  __ LoadDFromOffset(D1, R0, Double::value_offset() - kHeapObjectTag);
-  __ Bind(&double_op);
-  __ vsqrtd(D0, D1);
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  __ TryAllocate(double_class, &fall_through, R0, R1);  // Result register.
-  __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
-  __ Ret();
-  __ Bind(&is_smi);
-  __ SmiUntag(R0);
-  __ vmovsr(S0, R0);
-  __ vcvtdi(D1, S0);
-  __ b(&double_op);
-  __ Bind(&fall_through);
+  if (TargetCPUFeatures::vfp_supported()) {
+    Label fall_through, is_smi, double_op;
+    TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
+    // Argument is double and is in R0.
+    __ LoadDFromOffset(D1, R0, Double::value_offset() - kHeapObjectTag);
+    __ Bind(&double_op);
+    __ vsqrtd(D0, D1);
+    const Class& double_class = Class::Handle(
+        Isolate::Current()->object_store()->double_class());
+    __ TryAllocate(double_class, &fall_through, R0, R1);  // Result register.
+    __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
+    __ Ret();
+    __ Bind(&is_smi);
+    __ SmiUntag(R0);
+    __ vmovsr(S0, R0);
+    __ vcvtdi(D1, S0);
+    __ b(&double_op);
+    __ Bind(&fall_through);
+  }
 }
 
 
diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
index 8bf6c6a..b34ebaf 100644
--- a/runtime/vm/intrinsifier_arm64.cc
+++ b/runtime/vm/intrinsifier_arm64.cc
@@ -15,64 +15,260 @@
 
 namespace dart {
 
-#define __ assembler->
+DECLARE_FLAG(bool, enable_type_checks);
 
-void Intrinsifier::List_Allocate(Assembler* assembler) {
-  return;
-}
+#define __ assembler->
 
 
 void Intrinsifier::Array_getLength(Assembler* assembler) {
-  return;
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ ldr(R0, FieldAddress(R0, Array::length_offset()));
+  __ ret();
 }
 
 
 void Intrinsifier::ImmutableList_getLength(Assembler* assembler) {
-  return;
+  Array_getLength(assembler);
 }
 
 
 void Intrinsifier::Array_getIndexed(Assembler* assembler) {
-  return;
+  Label fall_through;
+
+  __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index
+  __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array
+
+  __ tsti(R0, kSmiTagMask);
+  __ b(&fall_through, NE);  // Index is not an smi, fall through.
+
+  // range check
+  __ ldr(R6, FieldAddress(R1, Array::length_offset()));
+  __ cmp(R0, Operand(R6));
+  __ b(&fall_through, CS);
+
+  ASSERT(kSmiTagShift == 1);
+  // array element at R1 + R0*4 + Array::data_offset - 1
+  __ add(R6, R1, Operand(R0, LSL, 2));
+  __ ldr(R0, FieldAddress(R6, Array::data_offset()));
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::ImmutableList_getIndexed(Assembler* assembler) {
-  return;
+  Array_getIndexed(assembler);
 }
 
 
+static intptr_t ComputeObjectArrayTypeArgumentsOffset() {
+  const Library& core_lib = Library::Handle(Library::CoreLibrary());
+  const Class& cls = Class::Handle(
+      core_lib.LookupClassAllowPrivate(Symbols::_List()));
+  ASSERT(!cls.IsNull());
+  ASSERT(cls.NumTypeArguments() == 1);
+  const intptr_t field_offset = cls.type_arguments_field_offset();
+  ASSERT(field_offset != Class::kNoTypeArguments);
+  return field_offset;
+}
+
+
+// Intrinsify only for Smi value and index. Non-smi values need a store buffer
+// update. Array length is always a Smi.
 void Intrinsifier::Array_setIndexed(Assembler* assembler) {
-  return;
+  Label fall_through;
+
+  if (FLAG_enable_type_checks) {
+    const intptr_t type_args_field_offset =
+        ComputeObjectArrayTypeArgumentsOffset();
+    // Inline simple tests (Smi, null), fallthrough if not positive.
+    Label checked_ok;
+    __ ldr(R2, Address(SP, 0 * kWordSize));  // Value.
+
+    // Null value is valid for any type.
+    __ CompareObject(R2, Object::null_object(), PP);
+    __ b(&checked_ok, EQ);
+
+    __ ldr(R1, Address(SP, 2 * kWordSize));  // Array.
+    __ ldr(R1, FieldAddress(R1, type_args_field_offset));
+
+    // R1: Type arguments of array.
+    __ CompareObject(R1, Object::null_object(), PP);
+    __ b(&checked_ok, EQ);
+
+    // Check if it's dynamic.
+    // Get type at index 0.
+    __ ldr(R0, FieldAddress(R1, TypeArguments::type_at_offset(0)));
+    __ CompareObject(R0, Type::ZoneHandle(Type::DynamicType()), PP);
+    __ b(&checked_ok, EQ);
+
+    // Check for int and num.
+    __ tsti(R2, kSmiTagMask);  // Value is Smi?
+    __ b(&fall_through, NE);  // Non-smi value.
+    __ CompareObject(R0, Type::ZoneHandle(Type::IntType()), PP);
+    __ b(&checked_ok, EQ);
+    __ CompareObject(R0, Type::ZoneHandle(Type::Number()), PP);
+    __ b(&fall_through, NE);
+    __ Bind(&checked_ok);
+  }
+  __ ldr(R1, Address(SP, 1 * kWordSize));  // Index.
+  __ tsti(R1, kSmiTagMask);
+  // Index not Smi.
+  __ b(&fall_through, NE);
+  __ ldr(R0, Address(SP, 2 * kWordSize));  // Array.
+
+  // Range check.
+  __ ldr(R3, FieldAddress(R0, Array::length_offset()));  // Array length.
+  __ cmp(R1, Operand(R3));
+  // Runtime throws exception.
+  __ b(&fall_through, CS);
+
+  // Note that R1 is Smi, i.e, times 2.
+  ASSERT(kSmiTagShift == 1);
+  __ ldr(R2, Address(SP, 0 * kWordSize));  // Value.
+  __ add(R1, R0, Operand(R1, LSL, 2));  // R1 is Smi.
+  __ StoreIntoObject(R0,
+                     FieldAddress(R1, Array::data_offset()),
+                     R2);
+  // Caller is responsible for preserving the value if necessary.
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 // Allocate a GrowableObjectArray using the backing array specified.
 // On stack: type argument (+1), data (+0).
 void Intrinsifier::GrowableList_Allocate(Assembler* assembler) {
-  return;
+  // The newly allocated object is returned in R0.
+  const intptr_t kTypeArgumentsOffset = 1 * kWordSize;
+  const intptr_t kArrayOffset = 0 * kWordSize;
+  Label fall_through;
+
+  // Compute the size to be allocated, it is based on the array length
+  // and is computed as:
+  // RoundedAllocationSize(sizeof(RawGrowableObjectArray)) +
+  intptr_t fixed_size = GrowableObjectArray::InstanceSize();
+
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
+
+  __ LoadImmediate(R2, heap->TopAddress(), kNoPP);
+  __ ldr(R0, Address(R2, 0));
+  __ AddImmediate(R1, R0, fixed_size, kNoPP);
+
+  // Check if the allocation fits into the remaining space.
+  // R0: potential new backing array object start.
+  // R1: potential next object start.
+  __ LoadImmediate(R3, heap->EndAddress(), kNoPP);
+  __ ldr(R3, Address(R3, 0));
+  __ cmp(R1, Operand(R3));
+  __ b(&fall_through, CS);
+
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  __ str(R1, Address(R2, 0));
+  __ AddImmediate(R0, R0, kHeapObjectTag, kNoPP);
+
+  // Initialize the tags.
+  // R0: new growable array object start as a tagged pointer.
+  const Class& cls = Class::Handle(
+      isolate->object_store()->growable_object_array_class());
+  uword tags = 0;
+  tags = RawObject::SizeTag::update(fixed_size, tags);
+  tags = RawObject::ClassIdTag::update(cls.id(), tags);
+  __ LoadImmediate(R1, tags, kNoPP);
+  __ str(R1, FieldAddress(R0, GrowableObjectArray::tags_offset()));
+
+  // Store backing array object in growable array object.
+  __ ldr(R1, Address(SP, kArrayOffset));  // Data argument.
+  // R0 is new, no barrier needed.
+  __ StoreIntoObjectNoBarrier(
+      R0,
+      FieldAddress(R0, GrowableObjectArray::data_offset()),
+      R1);
+
+  // R0: new growable array object start as a tagged pointer.
+  // Store the type argument field in the growable array object.
+  __ ldr(R1, Address(SP, kTypeArgumentsOffset));  // Type argument.
+  __ StoreIntoObjectNoBarrier(
+      R0,
+      FieldAddress(R0, GrowableObjectArray::type_arguments_offset()),
+      R1);
+
+  // Set the length field in the growable array object to 0.
+  __ LoadImmediate(R1, 0, kNoPP);
+  __ str(R1, FieldAddress(R0, GrowableObjectArray::length_offset()));
+  __ UpdateAllocationStats(kGrowableObjectArrayCid, R1, kNoPP);
+  __ ret();  // Returns the newly allocated object in R0.
+
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::GrowableList_getLength(Assembler* assembler) {
-  return;
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ ldr(R0, FieldAddress(R0, GrowableObjectArray::length_offset()));
+  __ ret();
 }
 
 
 void Intrinsifier::GrowableList_getCapacity(Assembler* assembler) {
-  return;
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ ldr(R0, FieldAddress(R0, GrowableObjectArray::data_offset()));
+  __ ldr(R0, FieldAddress(R0, Array::length_offset()));
+  __ ret();
 }
 
 
 void Intrinsifier::GrowableList_getIndexed(Assembler* assembler) {
-  return;
+  Label fall_through;
+
+  __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index
+  __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array
+
+  __ tsti(R0, kSmiTagMask);
+  __ b(&fall_through, NE);  // Index is not an smi, fall through.
+
+  // range check
+  __ ldr(R6, FieldAddress(R1, GrowableObjectArray::length_offset()));
+  __ cmp(R0, Operand(R6));
+  __ b(&fall_through, CS);
+
+  ASSERT(kSmiTagShift == 1);
+  // array element at R6 + R0 * 4 + Array::data_offset - 1
+  __ ldr(R6, FieldAddress(R1, GrowableObjectArray::data_offset()));  // Data
+  __ add(R6, R6, Operand(R0, LSL, 2));
+  __ ldr(R0, FieldAddress(R6, Array::data_offset()));
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 // Set value into growable object array at specified index.
 // On stack: growable array (+2), index (+1), value (+0).
 void Intrinsifier::GrowableList_setIndexed(Assembler* assembler) {
-  return;
+  if (FLAG_enable_type_checks) {
+    return;
+  }
+  Label fall_through;
+  __ ldr(R1, Address(SP, 1 * kWordSize));  // Index.
+  __ ldr(R0, Address(SP, 2 * kWordSize));  // GrowableArray.
+  __ tsti(R1, kSmiTagMask);
+  __ b(&fall_through, NE);  // Non-smi index.
+  // Range check using _length field.
+  __ ldr(R2, FieldAddress(R0, GrowableObjectArray::length_offset()));
+  __ cmp(R1, Operand(R2));
+  // Runtime throws exception.
+  __ b(&fall_through, CS);
+  __ ldr(R0, FieldAddress(R0, GrowableObjectArray::data_offset()));  // data.
+  __ ldr(R2, Address(SP, 0 * kWordSize));  // Value.
+  // Note that R1 is Smi, i.e, times 2.
+  ASSERT(kSmiTagShift == 1);
+  __ add(R1, R0, Operand(R1, LSL, 2));
+  __ StoreIntoObject(R0,
+                     FieldAddress(R1, Array::data_offset()),
+                     R2);
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
@@ -80,66 +276,312 @@
 // be greater than the length of the data container.
 // On stack: growable array (+1), length (+0).
 void Intrinsifier::GrowableList_setLength(Assembler* assembler) {
-  return;
+  Label fall_through;
+  __ ldr(R0, Address(SP, 1 * kWordSize));  // Growable array.
+  __ ldr(R1, Address(SP, 0 * kWordSize));  // Length value.
+  __ tsti(R1, kSmiTagMask);  // Check for Smi.
+  __ b(&fall_through, NE);
+  __ str(R1, FieldAddress(R0, GrowableObjectArray::length_offset()));
+  __ ret();
+  __ Bind(&fall_through);
+  // Fall through on non-Smi.
 }
 
 
 // Set data of growable object array.
 // On stack: growable array (+1), data (+0).
 void Intrinsifier::GrowableList_setData(Assembler* assembler) {
-  return;
+  if (FLAG_enable_type_checks) {
+    return;
+  }
+  Label fall_through;
+  __ ldr(R1, Address(SP, 0 * kWordSize));  // Data.
+  // Check that data is an ObjectArray.
+  __ tsti(R1, kSmiTagMask);
+  __ b(&fall_through, EQ);  // Data is Smi.
+  __ CompareClassId(R1, kArrayCid, kNoPP);
+  __ b(&fall_through, NE);
+  __ ldr(R0, Address(SP, 1 * kWordSize));  // Growable array.
+  __ StoreIntoObject(R0,
+                     FieldAddress(R0, GrowableObjectArray::data_offset()),
+                     R1);
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
+// Add an element to growable array if it doesn't need to grow, otherwise
+// call into regular code.
+// On stack: growable array (+1), value (+0).
 void Intrinsifier::GrowableList_add(Assembler* assembler) {
-  return;
+  // In checked mode we need to type-check the incoming argument.
+  if (FLAG_enable_type_checks) {
+    return;
+  }
+  Label fall_through;
+  // R0: Array.
+  __ ldr(R0, Address(SP, 1 * kWordSize));
+  // R1: length.
+  __ ldr(R1, FieldAddress(R0, GrowableObjectArray::length_offset()));
+  // R2: data.
+  __ ldr(R2, FieldAddress(R0, GrowableObjectArray::data_offset()));
+  // R3: capacity.
+  __ ldr(R3, FieldAddress(R2, Array::length_offset()));
+  // Compare length with capacity.
+  __ cmp(R1, Operand(R3));
+  __ b(&fall_through, EQ);  // Must grow data.
+  const int64_t value_one = reinterpret_cast<int64_t>(Smi::New(1));
+  // len = len + 1;
+  __ add(R3, R1, Operand(value_one));
+  __ str(R3, FieldAddress(R0, GrowableObjectArray::length_offset()));
+  __ ldr(R0, Address(SP, 0 * kWordSize));  // Value.
+  ASSERT(kSmiTagShift == 1);
+  __ add(R1, R2, Operand(R1, LSL, 2));
+  __ StoreIntoObject(R2,
+                     FieldAddress(R1, Array::data_offset()),
+                     R0);
+  __ LoadObject(R0, Object::null_object(), PP);
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 // Gets the length of a TypedData.
 void Intrinsifier::TypedData_getLength(Assembler* assembler) {
-  return;
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ ldr(R0, FieldAddress(R0, TypedData::length_offset()));
+  __ ret();
 }
 
 
+static int GetScaleFactor(intptr_t size) {
+  switch (size) {
+    case 1: return 0;
+    case 2: return 1;
+    case 4: return 2;
+    case 8: return 3;
+    case 16: return 4;
+  }
+  UNREACHABLE();
+  return -1;
+}
+
+
+#define TYPED_ARRAY_ALLOCATION(type_name, cid, max_len, scale_shift)           \
+  Label fall_through;                                                          \
+  const intptr_t kArrayLengthStackOffset = 0 * kWordSize;                      \
+  __ ldr(R2, Address(SP, kArrayLengthStackOffset));  /* Array length. */       \
+  /* Check that length is a positive Smi. */                                   \
+  /* R2: requested array length argument. */                                   \
+  __ tsti(R2, kSmiTagMask);                                                    \
+  __ b(&fall_through, NE);                                                     \
+  __ CompareRegisters(R2, ZR);                                                 \
+  __ b(&fall_through, LT);                                                     \
+  __ SmiUntag(R2);                                                             \
+  /* Check for maximum allowed length. */                                      \
+  /* R2: untagged array length. */                                             \
+  __ CompareImmediate(R2, max_len, kNoPP);                                     \
+  __ b(&fall_through, GT);                                                     \
+  __ Lsl(R2, R2, scale_shift);                                                 \
+  const intptr_t fixed_size = sizeof(Raw##type_name) + kObjectAlignment - 1;   \
+  __ AddImmediate(R2, R2, fixed_size, kNoPP);                                  \
+  __ andi(R2, R2, ~(kObjectAlignment - 1));                                    \
+  Heap* heap = Isolate::Current()->heap();                                     \
+                                                                               \
+  __ LoadImmediate(R0, heap->TopAddress(), kNoPP);                             \
+  __ ldr(R0, Address(R0, 0));                                                  \
+                                                                               \
+  /* R2: allocation size. */                                                   \
+  __ add(R1, R0, Operand(R2));                                                 \
+  __ b(&fall_through, VS);                                                     \
+                                                                               \
+  /* Check if the allocation fits into the remaining space. */                 \
+  /* R0: potential new object start. */                                        \
+  /* R1: potential next object start. */                                       \
+  /* R2: allocation size. */                                                   \
+  __ LoadImmediate(R3, heap->EndAddress(), kNoPP);                             \
+  __ ldr(R3, Address(R3, 0));                                                  \
+  __ cmp(R1, Operand(R3));                                                     \
+  __ b(&fall_through, CS);                                                     \
+                                                                               \
+  /* Successfully allocated the object(s), now update top to point to */       \
+  /* next object start and initialize the object. */                           \
+  __ LoadImmediate(R3, heap->TopAddress(), kNoPP);                             \
+  __ str(R1, Address(R3, 0));                                                  \
+  __ AddImmediate(R0, R0, kHeapObjectTag, kNoPP);                              \
+  __ UpdateAllocationStatsWithSize(cid, R2, R4, kNoPP);                        \
+  /* Initialize the tags. */                                                   \
+  /* R0: new object start as a tagged pointer. */                              \
+  /* R1: new object end address. */                                            \
+  /* R2: allocation size. */                                                   \
+  {                                                                            \
+    __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag, kNoPP);           \
+    __ Lsl(R2, R2, RawObject::kSizeTagPos - kObjectAlignmentLog2);             \
+    __ csel(R2, ZR, R2, HI);                                                   \
+                                                                               \
+    /* Get the class index and insert it into the tags. */                     \
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cid), kNoPP);          \
+    __ orr(R2, R2, Operand(TMP));                                              \
+    __ str(R2, FieldAddress(R0, type_name::tags_offset()));  /* Tags. */       \
+  }                                                                            \
+  /* Set the length field. */                                                  \
+  /* R0: new object start as a tagged pointer. */                              \
+  /* R1: new object end address. */                                            \
+  __ ldr(R2, Address(SP, kArrayLengthStackOffset));  /* Array length. */       \
+  __ StoreIntoObjectNoBarrier(R0,                                              \
+                              FieldAddress(R0, type_name::length_offset()),    \
+                              R2);                                             \
+  /* Initialize all array elements to 0. */                                    \
+  /* R0: new object start as a tagged pointer. */                              \
+  /* R1: new object end address. */                                            \
+  /* R2: iterator which initially points to the start of the variable */       \
+  /* R3: scratch register. */                                                  \
+  /* data area to be initialized. */                                           \
+  __ mov(R3, ZR);                                                              \
+  __ AddImmediate(R2, R0, sizeof(Raw##type_name) - 1, kNoPP);                  \
+  Label init_loop, done;                                                       \
+  __ Bind(&init_loop);                                                         \
+  __ cmp(R2, Operand(R1));                                                     \
+  __ b(&done, CS);                                                             \
+  __ str(R3, Address(R2, 0));                                                  \
+  __ add(R2, R2, Operand(kWordSize));                                          \
+  __ b(&init_loop);                                                            \
+  __ Bind(&done);                                                              \
+                                                                               \
+  __ ret();                                                                    \
+  __ Bind(&fall_through);                                                      \
+
+
 #define TYPED_DATA_ALLOCATOR(clazz)                                            \
 void Intrinsifier::TypedData_##clazz##_new(Assembler* assembler) {             \
-  return;                                                                      \
+  intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid);       \
+  intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid);           \
+  int shift = GetScaleFactor(size);                                            \
+  TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, shift);   \
 }                                                                              \
 void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) {         \
-  return;                                                                      \
+  intptr_t size = TypedData::ElementSizeInBytes(kTypedData##clazz##Cid);       \
+  intptr_t max_len = TypedData::MaxElements(kTypedData##clazz##Cid);           \
+  int shift = GetScaleFactor(size);                                            \
+  TYPED_ARRAY_ALLOCATION(TypedData, kTypedData##clazz##Cid, max_len, shift);   \
 }
 CLASS_LIST_TYPED_DATA(TYPED_DATA_ALLOCATOR)
 #undef TYPED_DATA_ALLOCATOR
 
 
+// Loads args from stack into R0 and R1
+// Tests if they are smis, jumps to label not_smi if not.
+static void TestBothArgumentsSmis(Assembler* assembler, Label* not_smi) {
+  __ ldr(R0, Address(SP, + 0 * kWordSize));
+  __ ldr(R1, Address(SP, + 1 * kWordSize));
+  __ orr(TMP, R0, Operand(R1));
+  __ tsti(TMP, kSmiTagMask);
+  __ b(not_smi, NE);
+}
+
+
 void Intrinsifier::Integer_addFromInteger(Assembler* assembler) {
-  return;
+  Label fall_through;
+  TestBothArgumentsSmis(assembler, &fall_through);  // Checks two smis.
+  __ adds(R0, R0, Operand(R1));  // Adds.
+  __ b(&fall_through, VS);  // Fall-through on overflow.
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Integer_add(Assembler* assembler) {
-  return;
+  Integer_addFromInteger(assembler);
 }
 
 
 void Intrinsifier::Integer_subFromInteger(Assembler* assembler) {
-  return;
+  Label fall_through;
+  TestBothArgumentsSmis(assembler, &fall_through);
+  __ subs(R0, R0, Operand(R1));  // Subtract.
+  __ b(&fall_through, VS);  // Fall-through on overflow.
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Integer_sub(Assembler* assembler) {
-  return;
+  Label fall_through;
+  TestBothArgumentsSmis(assembler, &fall_through);
+  __ subs(R0, R1, Operand(R0));  // Subtract.
+  __ b(&fall_through, VS);  // Fall-through on overflow.
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Integer_mulFromInteger(Assembler* assembler) {
-  return;
+  Label fall_through;
+
+  TestBothArgumentsSmis(assembler, &fall_through);  // checks two smis
+  __ SmiUntag(R0);  // Untags R6. We only want result shifted by one.
+
+  __ mul(TMP, R0, R1);
+  __ smulh(TMP2, R0, R1);
+  // TMP: result bits 64..127.
+  __ cmp(TMP2, Operand(TMP, ASR, 63));
+  __ b(&fall_through, NE);
+  __ mov(R0, TMP);
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Integer_mul(Assembler* assembler) {
-  return;
+  Integer_mulFromInteger(assembler);
+}
+
+
+// Optimizations:
+// - result is 0 if:
+//   - left is 0
+//   - left equals right
+// - result is left if
+//   - left > 0 && left < right
+// R1: Tagged left (dividend).
+// R0: Tagged right (divisor).
+// Returns with result in R0, OR:
+//   R1: Untagged result (remainder).
+static void EmitRemainderOperation(Assembler* assembler) {
+  Label return_zero, modulo;
+  const Register left = R1;
+  const Register right = R0;
+  const Register result = R1;
+  const Register tmp = R2;
+  ASSERT(left == result);
+
+  // Check for quick zero results.
+  __ CompareRegisters(left, ZR);
+  __ b(&return_zero, EQ);
+  __ CompareRegisters(left, right);
+  __ b(&return_zero, EQ);
+
+  // Check if result should be left.
+  __ CompareRegisters(left, ZR);
+  __ b(&modulo, LT);
+  // left is positive.
+  __ CompareRegisters(left, right);
+  // left is less than right, result is left.
+  __ b(&modulo, GT);
+  __ mov(R0, left);
+  __ ret();
+
+  __ Bind(&return_zero);
+  __ mov(R0, ZR);
+  __ ret();
+
+  __ Bind(&modulo);
+  // result <- left - right * (left / right)
+  __ SmiUntag(left);
+  __ SmiUntag(right);
+
+  __ sdiv(tmp, left, right);
+  __ msub(result, right, tmp, left);  // result <- left - right * tmp
 }
 
 
@@ -153,180 +595,518 @@
 //    }
 //  }
 void Intrinsifier::Integer_moduloFromInteger(Assembler* assembler) {
-  return;
+  // Check to see if we have integer division
+  Label neg_remainder, fall_through;
+  __ ldr(R1, Address(SP, + 0 * kWordSize));
+  __ ldr(R0, Address(SP, + 1 * kWordSize));
+  __ orr(TMP, R0, Operand(R1));
+  __ tsti(TMP, kSmiTagMask);
+  __ b(&fall_through, NE);
+  // R1: Tagged left (dividend).
+  // R0: Tagged right (divisor).
+  // Check if modulo by zero -> exception thrown in main function.
+  __ CompareRegisters(R0, ZR);
+  __ b(&fall_through, EQ);
+  EmitRemainderOperation(assembler);
+  // Untagged right in R0. Untagged remainder result in R1.
+
+  __ CompareRegisters(R1, ZR);
+  __ b(&neg_remainder, LT);
+  __ Lsl(R0, R1, 1);  // Tag and move result to R0.
+  __ ret();
+
+  __ Bind(&neg_remainder);
+  // Result is negative, adjust it.
+  __ CompareRegisters(R0, ZR);
+  __ sub(TMP, R1, Operand(R0));
+  __ add(TMP2, R1, Operand(R0));
+  __ csel(R0, TMP2, TMP, GE);
+  __ SmiTag(R0);
+  __ ret();
+
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Integer_truncDivide(Assembler* assembler) {
-  return;
+  // Check to see if we have integer division
+  Label fall_through;
+
+  TestBothArgumentsSmis(assembler, &fall_through);
+  __ CompareRegisters(R0, ZR);
+  __ b(&fall_through, EQ);  // If b is 0, fall through.
+
+  __ SmiUntag(R0);
+  __ SmiUntag(R1);
+
+  __ sdiv(R0, R1, R0);
+
+  // Check the corner case of dividing the 'MIN_SMI' with -1, in which case we
+  // cannot tag the result.
+  __ CompareImmediate(R0, 0x4000000000000000, kNoPP);
+  __ b(&fall_through, EQ);
+  __ SmiTag(R0);  // Not equal. Okay to tag and return.
+  __ ret();  // Return.
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Integer_negate(Assembler* assembler) {
-  return;
+  Label fall_through;
+  __ ldr(R0, Address(SP, + 0 * kWordSize));  // Grab first argument.
+  __ tsti(R0, kSmiTagMask);  // Test for Smi.
+  __ b(&fall_through, NE);
+  __ negs(R0, R0);
+  __ b(&fall_through, VS);
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Integer_bitAndFromInteger(Assembler* assembler) {
-  return;
+  Label fall_through;
+  TestBothArgumentsSmis(assembler, &fall_through);  // Checks two smis.
+  __ and_(R0, R0, Operand(R1));
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Integer_bitAnd(Assembler* assembler) {
-  return;
+  Integer_bitAndFromInteger(assembler);
 }
 
 
 void Intrinsifier::Integer_bitOrFromInteger(Assembler* assembler) {
-  return;
+  Label fall_through;
+  TestBothArgumentsSmis(assembler, &fall_through);  // Checks two smis.
+  __ orr(R0, R0, Operand(R1));
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Integer_bitOr(Assembler* assembler) {
-  return;
+  Integer_bitOrFromInteger(assembler);
 }
 
 
 void Intrinsifier::Integer_bitXorFromInteger(Assembler* assembler) {
-  return;
+  Label fall_through;
+
+  TestBothArgumentsSmis(assembler, &fall_through);  // Checks two smis.
+  __ eor(R0, R0, Operand(R1));
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Integer_bitXor(Assembler* assembler) {
-  return;
+  Integer_bitXorFromInteger(assembler);
 }
 
 
 void Intrinsifier::Integer_shl(Assembler* assembler) {
-  return;
+  ASSERT(kSmiTagShift == 1);
+  ASSERT(kSmiTag == 0);
+  const Register right = R0;
+  const Register left = R1;
+  const Register temp = R2;
+  const Register result = R0;
+  Label fall_through;
+
+  TestBothArgumentsSmis(assembler, &fall_through);
+  __ CompareImmediate(
+      right, reinterpret_cast<int64_t>(Smi::New(Smi::kBits)), PP);
+  __ b(&fall_through, CS);
+
+  // Left is not a constant.
+  // Check if count too large for handling it inlined.
+  __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+  // Overflow test (preserve left, right, and TMP);
+  __ lslv(temp, left, TMP);
+  __ asrv(TMP2, temp, TMP);
+  __ CompareRegisters(left, TMP2);
+  __ b(&fall_through, NE);  // Overflow.
+  // Shift for result now we know there is no overflow.
+  __ lslv(result, left, TMP);
+  __ ret();
+  __ Bind(&fall_through);
+}
+
+
+static void CompareIntegers(Assembler* assembler, Condition true_condition) {
+  Label fall_through, true_label;
+  TestBothArgumentsSmis(assembler, &fall_through);
+  // R0 contains the right argument, R1 the left.
+  __ CompareRegisters(R1, R0);
+  __ LoadObject(R0, Bool::False(), PP);
+  __ LoadObject(TMP, Bool::True(), PP);
+  __ csel(R0, TMP, R0, true_condition);
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) {
-  return;
+  CompareIntegers(assembler, LT);
 }
 
 
 void Intrinsifier::Integer_lessThan(Assembler* assembler) {
-  return;
+  Integer_greaterThanFromInt(assembler);
 }
 
 
 void Intrinsifier::Integer_greaterThan(Assembler* assembler) {
-  return;
+  CompareIntegers(assembler, GT);
 }
 
 
 void Intrinsifier::Integer_lessEqualThan(Assembler* assembler) {
-  return;
+  CompareIntegers(assembler, LE);
 }
 
 
 void Intrinsifier::Integer_greaterEqualThan(Assembler* assembler) {
-  return;
+  CompareIntegers(assembler, GE);
 }
 
 
 // This is called for Smi, Mint and Bigint receivers. The right argument
 // can be Smi, Mint, Bigint or double.
 void Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
-  return;
+  Label fall_through, true_label, check_for_mint;
+  // For integer receiver '===' check first.
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ ldr(R1, Address(SP, 1 * kWordSize));
+  __ cmp(R0, Operand(R1));
+  __ b(&true_label, EQ);
+
+  __ orr(R2, R0, Operand(R1));
+  __ tsti(R2, kSmiTagMask);
+  __ b(&check_for_mint, NE);  // If R0 or R1 is not a smi do Mint checks.
+
+  // Both arguments are smi, '===' is good enough.
+  __ LoadObject(R0, Bool::False(), PP);
+  __ ret();
+  __ Bind(&true_label);
+  __ LoadObject(R0, Bool::True(), PP);
+  __ ret();
+
+  // At least one of the arguments was not Smi.
+  Label receiver_not_smi;
+  __ Bind(&check_for_mint);
+
+  __ tsti(R1, kSmiTagMask);  // Check receiver.
+  __ b(&receiver_not_smi, NE);
+
+  // Left (receiver) is Smi, return false if right is not Double.
+  // Note that an instance of Mint or Bigint never contains a value that can be
+  // represented by Smi.
+
+  __ CompareClassId(R0, kDoubleCid, kNoPP);
+  __ b(&fall_through, EQ);
+  __ LoadObject(R0, Bool::False(), PP);  // Smi == Mint -> false.
+  __ ret();
+
+  __ Bind(&receiver_not_smi);
+  // R1: receiver.
+
+  __ CompareClassId(R1, kMintCid, kNoPP);
+  __ b(&fall_through, NE);
+  // Receiver is Mint, return false if right is Smi.
+  __ tsti(R0, kSmiTagMask);
+  __ b(&fall_through, NE);
+  __ LoadObject(R0, Bool::False(), PP);
+  __ ret();
+  // TODO(srdjan): Implement Mint == Mint comparison.
+
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Integer_equal(Assembler* assembler) {
-  return;
+  Integer_equalToInteger(assembler);
 }
 
 
 void Intrinsifier::Integer_sar(Assembler* assembler) {
-  return;
+  Label fall_through;
+
+  TestBothArgumentsSmis(assembler, &fall_through);
+  // Shift amount in R0. Value to shift in R1.
+
+  // Fall through if shift amount is negative.
+  __ SmiUntag(R0);
+  __ CompareRegisters(R0, ZR);
+  __ b(&fall_through, LT);
+
+  // If shift amount is bigger than 63, set to 63.
+  __ LoadImmediate(TMP, 0x3F, kNoPP);
+  __ CompareRegisters(R0, TMP);
+  __ csel(R0, TMP, R0, GT);
+  __ SmiUntag(R1);
+  __ asrv(R0, R1, R0);
+  __ SmiTag(R0);
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Smi_bitNegate(Assembler* assembler) {
-  return;
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ mvn(R0, R0);
+  __ andi(R0, R0, ~kSmiTagMask);  // Remove inverted smi-tag.
+  __ ret();
 }
 
 
 void Intrinsifier::Smi_bitLength(Assembler* assembler) {
-  return;
+  // TODO(sra): Implement as word-length - CLZ.
+}
+
+
+// Check if the last argument is a double, jump to label 'is_smi' if smi
+// (easy to convert to double), otherwise jump to label 'not_double_smi',
+// Returns the last argument in R0.
+static void TestLastArgumentIsDouble(Assembler* assembler,
+                                     Label* is_smi,
+                                     Label* not_double_smi) {
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ tsti(R0, kSmiTagMask);
+  __ b(is_smi, EQ);
+  __ CompareClassId(R0, kDoubleCid, kNoPP);
+  __ b(not_double_smi, NE);
+  // Fall through with Double in R0.
+}
+
+
+// Both arguments on stack, arg0 (left) is a double, arg1 (right) is of unknown
+// type. Return true or false object in the register R0. Any NaN argument
+// returns false. Any non-double arg1 causes control flow to fall through to the
+// slow case (compiled method body).
+static void CompareDoubles(Assembler* assembler, Condition true_condition) {
+  Label fall_through, is_smi, double_op, not_nan;
+
+  TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
+  // Both arguments are double, right operand is in R0.
+
+  __ LoadDFieldFromOffset(V1, R0, Double::value_offset(), kNoPP);
+  __ Bind(&double_op);
+  __ ldr(R0, Address(SP, 1 * kWordSize));  // Left argument.
+  __ LoadDFieldFromOffset(V0, R0, Double::value_offset(), kNoPP);
+
+  __ fcmpd(V0, V1);
+  __ LoadObject(R0, Bool::False(), PP);
+  // Return false if D0 or D1 was NaN before checking true condition.
+  __ b(&not_nan, VC);
+  __ ret();
+  __ Bind(&not_nan);
+  __ LoadObject(TMP, Bool::True(), PP);
+  __ csel(R0, TMP, R0, true_condition);
+  __ ret();
+
+  __ Bind(&is_smi);  // Convert R0 to a double.
+  __ SmiUntag(R0);
+  __ scvtfd(V1, R0);
+  __ b(&double_op);  // Then do the comparison.
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Double_greaterThan(Assembler* assembler) {
-  return;
+  CompareDoubles(assembler, HI);
 }
 
 
 void Intrinsifier::Double_greaterEqualThan(Assembler* assembler) {
-  return;
+  CompareDoubles(assembler, CS);
 }
 
 
 void Intrinsifier::Double_lessThan(Assembler* assembler) {
-  return;
+  CompareDoubles(assembler, CC);
 }
 
 
 void Intrinsifier::Double_equal(Assembler* assembler) {
-  return;
+  CompareDoubles(assembler, EQ);
 }
 
 
 void Intrinsifier::Double_lessEqualThan(Assembler* assembler) {
-  return;
+  CompareDoubles(assembler, LS);
+}
+
+
+// Expects left argument to be double (receiver). Right argument is unknown.
+// Both arguments are on stack.
+static void DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
+  Label fall_through;
+
+  TestLastArgumentIsDouble(assembler, &fall_through, &fall_through);
+  // Both arguments are double, right operand is in R0.
+  __ LoadDFieldFromOffset(V1, R0, Double::value_offset(), kNoPP);
+  __ ldr(R0, Address(SP, 1 * kWordSize));  // Left argument.
+  __ LoadDFieldFromOffset(V0, R0, Double::value_offset(), kNoPP);
+  switch (kind) {
+    case Token::kADD: __ faddd(V0, V0, V1); break;
+    case Token::kSUB: __ fsubd(V0, V0, V1); break;
+    case Token::kMUL: __ fmuld(V0, V0, V1); break;
+    case Token::kDIV: __ fdivd(V0, V0, V1); break;
+    default: UNREACHABLE();
+  }
+  const Class& double_class = Class::Handle(
+      Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, R0, R1, kNoPP);
+  __ StoreDFieldToOffset(V0, R0, Double::value_offset(), kNoPP);
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Double_add(Assembler* assembler) {
-  return;
+  DoubleArithmeticOperations(assembler, Token::kADD);
 }
 
 
 void Intrinsifier::Double_mul(Assembler* assembler) {
-  return;
+  DoubleArithmeticOperations(assembler, Token::kMUL);
 }
 
 
 void Intrinsifier::Double_sub(Assembler* assembler) {
-  return;
+  DoubleArithmeticOperations(assembler, Token::kSUB);
 }
 
 
 void Intrinsifier::Double_div(Assembler* assembler) {
-  return;
+  DoubleArithmeticOperations(assembler, Token::kDIV);
 }
 
 
 // Left is double right is integer (Bigint, Mint or Smi)
 void Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
-  return;
+  Label fall_through;
+  // Only smis allowed.
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ tsti(R0, kSmiTagMask);
+  __ b(&fall_through, NE);
+  // Is Smi.
+  __ SmiUntag(R0);
+  __ scvtfd(V1, R0);
+  __ ldr(R0, Address(SP, 1 * kWordSize));
+  __ LoadDFieldFromOffset(V0, R0, Double::value_offset(), kNoPP);
+  __ fmuld(V0, V0, V1);
+  const Class& double_class = Class::Handle(
+      Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, R0, R1, kNoPP);
+  __ StoreDFieldToOffset(V0, R0, Double::value_offset(), kNoPP);
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Double_fromInteger(Assembler* assembler) {
-  return;
+  Label fall_through;
+
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ tsti(R0, kSmiTagMask);
+  __ b(&fall_through, NE);
+  // Is Smi.
+  __ SmiUntag(R0);
+  __ scvtfd(V0, R0);
+  const Class& double_class = Class::Handle(
+      Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, R0, R1, kNoPP);
+  __ StoreDFieldToOffset(V0, R0, Double::value_offset(), kNoPP);
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Double_getIsNaN(Assembler* assembler) {
-  return;
+  Label is_true;
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ LoadDFieldFromOffset(V0, R0, Double::value_offset(), kNoPP);
+  __ fcmpd(V0, V0);
+  __ LoadObject(TMP, Bool::False(), PP);
+  __ LoadObject(R0, Bool::True(), PP);
+  __ csel(R0, TMP, R0, VC);
+  __ ret();
 }
 
 
 void Intrinsifier::Double_getIsNegative(Assembler* assembler) {
-  return;
+  const Register false_reg = R0;
+  const Register true_reg = R2;
+  Label is_false, is_true, is_zero;
+
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ LoadDFieldFromOffset(V0, R0, Double::value_offset(), kNoPP);
+  __ fcmpdz(V0);
+  __ LoadObject(true_reg, Bool::True(), PP);
+  __ LoadObject(false_reg, Bool::False(), PP);
+  __ b(&is_false, VS);  // NaN -> false.
+  __ b(&is_zero, EQ);  // Check for negative zero.
+  __ b(&is_false, CS);  // >= 0 -> false.
+
+  __ Bind(&is_true);
+  __ mov(R0, true_reg);
+
+  __ Bind(&is_false);
+  __ ret();
+
+  __ Bind(&is_zero);
+  // Check for negative zero by looking at the sign bit.
+  __ fmovrd(R1, V0);
+  __ Lsr(R1, R1, 63);
+  __ tsti(R1, 1);
+  __ csel(R0, true_reg, false_reg, NE);  // Sign bit set.
+  __ ret();
 }
 
 
 void Intrinsifier::Double_toInt(Assembler* assembler) {
-  return;
+  Label fall_through;
+
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ LoadDFieldFromOffset(V0, R0, Double::value_offset(), kNoPP);
+
+  // Explicit NaN check, since ARM gives an FPU exception if you try to
+  // convert NaN to an int.
+  __ fcmpd(V0, V0);
+  __ b(&fall_through, VS);
+
+  __ fcvtzds(R0, V0);
+  // Overflow is signaled with minint.
+  // Check for overflow and that it fits into Smi.
+  __ CompareImmediate(R0, 0xC000000000000000, kNoPP);
+  __ b(&fall_through, MI);
+  __ SmiTag(R0);
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::Math_sqrt(Assembler* assembler) {
-  return;
+  Label fall_through, is_smi, double_op;
+  TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
+  // Argument is double and is in R0.
+  __ LoadDFieldFromOffset(V1, R0, Double::value_offset(), kNoPP);
+  __ Bind(&double_op);
+  __ fsqrtd(V0, V1);
+  const Class& double_class = Class::Handle(
+      Isolate::Current()->object_store()->double_class());
+  __ TryAllocate(double_class, &fall_through, R0, R1, kNoPP);
+  __ StoreDFieldToOffset(V0, R0, Double::value_offset(), kNoPP);
+  __ ret();
+  __ Bind(&is_smi);
+  __ SmiUntag(R0);
+  __ scvtfd(V1, R0);
+  __ b(&double_op);
+  __ Bind(&fall_through);
 }
 
 
@@ -334,37 +1114,247 @@
 //    _state[kSTATE_LO] = state & _MASK_32;
 //    _state[kSTATE_HI] = state >> 32;
 void Intrinsifier::Random_nextState(Assembler* assembler) {
-  return;
+  const Library& math_lib = Library::Handle(Library::MathLibrary());
+  ASSERT(!math_lib.IsNull());
+  const Class& random_class = Class::Handle(
+      math_lib.LookupClassAllowPrivate(Symbols::_Random()));
+  ASSERT(!random_class.IsNull());
+  const Field& state_field = Field::ZoneHandle(
+      random_class.LookupInstanceField(Symbols::_state()));
+  ASSERT(!state_field.IsNull());
+  const Field& random_A_field = Field::ZoneHandle(
+      random_class.LookupStaticField(Symbols::_A()));
+  ASSERT(!random_A_field.IsNull());
+  ASSERT(random_A_field.is_const());
+  const Instance& a_value = Instance::Handle(random_A_field.value());
+  const int64_t a_int_value = Integer::Cast(a_value).AsInt64Value();
+
+  __ ldr(R0, Address(SP, 0 * kWordSize));  // Receiver.
+  __ ldr(R1, FieldAddress(R0, state_field.Offset()));  // Field '_state'.
+
+  // Addresses of _state[0].
+  const int64_t disp =
+      FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid) -
+      kHeapObjectTag;
+
+  __ LoadImmediate(R0, a_int_value, kNoPP);
+  __ LoadFromOffset(R2, R1, disp, kNoPP);
+  __ Lsr(R3, R2, 32);
+  __ andi(R2, R2, 0xffffffff);
+  __ mul(R2, R0, R2);
+  __ add(R2, R2, Operand(R3));
+  __ StoreToOffset(R2, R1, disp, kNoPP);
+  __ ret();
 }
 
 
 void Intrinsifier::Object_equal(Assembler* assembler) {
-  return;
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ ldr(R1, Address(SP, 1 * kWordSize));
+  __ cmp(R0, Operand(R1));
+  __ LoadObject(R0, Bool::False(), PP);
+  __ LoadObject(TMP, Bool::True(), PP);
+  __ csel(R0, TMP, R0, EQ);
+  __ ret();
 }
 
 
 void Intrinsifier::String_getHashCode(Assembler* assembler) {
-  return;
+  Label fall_through;
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ ldr(R0, FieldAddress(R0, String::hash_offset()));
+  __ CompareRegisters(R0, ZR);
+  __ b(&fall_through, EQ);
+  __ ret();
+  // Hash not yet computed.
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::String_getLength(Assembler* assembler) {
-  return;
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ ldr(R0, FieldAddress(R0, String::length_offset()));
+  __ ret();
 }
 
 
 void Intrinsifier::String_codeUnitAt(Assembler* assembler) {
-  return;
+  Label fall_through, try_two_byte_string;
+
+  __ ldr(R1, Address(SP, 0 * kWordSize));  // Index.
+  __ ldr(R0, Address(SP, 1 * kWordSize));  // String.
+  __ tsti(R1, kSmiTagMask);
+  __ b(&fall_through, NE);  // Index is not a Smi.
+  // Range check.
+  __ ldr(R2, FieldAddress(R0, String::length_offset()));
+  __ cmp(R1, Operand(R2));
+  __ b(&fall_through, CS);  // Runtime throws exception.
+  __ CompareClassId(R0, kOneByteStringCid, kNoPP);
+  __ b(&try_two_byte_string, NE);
+  __ SmiUntag(R1);
+  __ AddImmediate(R0, R0, OneByteString::data_offset() - kHeapObjectTag, kNoPP);
+  __ ldr(R0, Address(R0, R1), kUnsignedByte);
+  __ SmiTag(R0);
+  __ ret();
+
+  __ Bind(&try_two_byte_string);
+  __ CompareClassId(R0, kTwoByteStringCid, kNoPP);
+  __ b(&fall_through, NE);
+  ASSERT(kSmiTagShift == 1);
+  __ AddImmediate(R0, R0, TwoByteString::data_offset() - kHeapObjectTag, kNoPP);
+  __ ldr(R0, Address(R0, R1), kUnsignedHalfword);
+  __ SmiTag(R0);
+  __ ret();
+
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::String_getIsEmpty(Assembler* assembler) {
-  return;
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ ldr(R0, FieldAddress(R0, String::length_offset()));
+  __ cmp(R0, Operand(Smi::RawValue(0)));
+  __ LoadObject(R0, Bool::True(), PP);
+  __ LoadObject(TMP, Bool::False(), PP);
+  __ csel(R0, TMP, R0, NE);
+  __ ret();
 }
 
 
 void Intrinsifier::OneByteString_getHashCode(Assembler* assembler) {
-  return;
+  Label compute_hash;
+  __ ldr(R1, Address(SP, 0 * kWordSize));  // OneByteString object.
+  __ ldr(R0, FieldAddress(R1, String::hash_offset()));
+  __ CompareRegisters(R0, ZR);
+  __ b(&compute_hash, EQ);
+  __ ret();  // Return if already computed.
+
+  __ Bind(&compute_hash);
+  __ ldr(R2, FieldAddress(R1, String::length_offset()));
+  __ SmiUntag(R2);
+
+  Label done;
+  // If the string is empty, set the hash to 1, and return.
+  __ CompareRegisters(R2, ZR);
+  __ b(&done, EQ);
+
+  __ mov(R3, ZR);
+  __ AddImmediate(R6, R1, OneByteString::data_offset() - kHeapObjectTag, kNoPP);
+  // R1: Instance of OneByteString.
+  // R2: String length, untagged integer.
+  // R3: Loop counter, untagged integer.
+  // R6: String data.
+  // R0: Hash code, untagged integer.
+
+  Label loop;
+  // Add to hash code: (hash_ is uint32)
+  // hash_ += ch;
+  // hash_ += hash_ << 10;
+  // hash_ ^= hash_ >> 6;
+  // Get one characters (ch).
+  __ Bind(&loop);
+  __ ldr(R7, Address(R6, R3), kUnsignedByte);
+  // R7: ch.
+  __ add(R3, R3, Operand(1));
+  __ addw(R0, R0, Operand(R7));
+  __ addw(R0, R0, Operand(R0, LSL, 10));
+  __ eorw(R0, R0, Operand(R0, LSR, 6));
+  __ cmp(R3, Operand(R2));
+  __ b(&loop, NE);
+
+  // Finalize.
+  // hash_ += hash_ << 3;
+  // hash_ ^= hash_ >> 11;
+  // hash_ += hash_ << 15;
+  __ addw(R0, R0, Operand(R0, LSL, 3));
+  __ eorw(R0, R0, Operand(R0, LSR, 11));
+  __ addw(R0, R0, Operand(R0, LSL, 15));
+  // hash_ = hash_ & ((static_cast<intptr_t>(1) << bits) - 1);
+  __ AndImmediate(
+      R0, R0, (static_cast<intptr_t>(1) << String::kHashBits) - 1, kNoPP);
+  __ CompareRegisters(R0, ZR);
+  // return hash_ == 0 ? 1 : hash_;
+  __ Bind(&done);
+  __ csinc(R0, R0, ZR, NE);  // R0 <- (R0 != 0) ? R0 : (ZR + 1).
+  __ SmiTag(R0);
+  __ str(R0, FieldAddress(R1, String::hash_offset()));
+  __ ret();
+}
+
+
+// Allocates one-byte string of length 'end - start'. The content is not
+// initialized.
+// 'length-reg' (R2) contains tagged length.
+// Returns new string as tagged pointer in R0.
+static void TryAllocateOnebyteString(Assembler* assembler,
+                                     Label* ok,
+                                     Label* failure) {
+  const Register length_reg = R2;
+  Label fail;
+
+  __ mov(R6, length_reg);  // Save the length register.
+  __ SmiUntag(length_reg);
+  const intptr_t fixed_size = sizeof(RawString) + kObjectAlignment - 1;
+  __ AddImmediate(length_reg, length_reg, fixed_size, kNoPP);
+  __ andi(length_reg, length_reg, ~(kObjectAlignment - 1));
+
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
+
+  __ LoadImmediate(R3, heap->TopAddress(), kNoPP);
+  __ ldr(R0, Address(R3));
+
+  // length_reg: allocation size.
+  __ adds(R1, R0, Operand(length_reg));
+  __ b(&fail, VS);  // Fail on overflow.
+
+  // Check if the allocation fits into the remaining space.
+  // R0: potential new object start.
+  // R1: potential next object start.
+  // R2: allocation size.
+  // R3: heap->Top->Address().
+  __ LoadImmediate(R7, heap->EndAddress(), kNoPP);
+  __ ldr(R7, Address(R7));
+  __ cmp(R1, Operand(R7));
+  __ b(&fail, CS);
+
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  __ str(R1, Address(R3));
+  __ AddImmediate(R0, R0, kHeapObjectTag, kNoPP);
+  __ UpdateAllocationStatsWithSize(kOneByteStringCid, R2, R3, kNoPP);
+
+  // Initialize the tags.
+  // R0: new object start as a tagged pointer.
+  // R1: new object end address.
+  // R2: allocation size.
+  {
+    const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
+    const Class& cls =
+        Class::Handle(isolate->object_store()->one_byte_string_class());
+
+    __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag, kNoPP);
+    __ Lsl(R2, R2, shift);
+    __ csel(R2, R2, ZR, LS);
+
+    // Get the class index and insert it into the tags.
+    // R2: size and bit tags.
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cls.id()), kNoPP);
+    __ orr(R2, R2, Operand(TMP));
+    __ str(R2, FieldAddress(R0, String::tags_offset()));  // Store tags.
+  }
+
+  // Set the length field using the saved length (R6).
+  __ StoreIntoObjectNoBarrier(R0,
+                              FieldAddress(R0, String::length_offset()),
+                              R6);
+  // Clear hash.
+  __ mov(TMP, ZR);
+  __ str(TMP, FieldAddress(R0, String::hash_offset()));
+  __ b(ok);
+
+  __ Bind(&fail);
+  __ b(failure);
 }
 
 
@@ -373,48 +1363,197 @@
 // Arg2: End index as Smi.
 // The indexes must be valid.
 void Intrinsifier::OneByteString_substringUnchecked(Assembler* assembler) {
-  return;
+  const intptr_t kStringOffset = 2 * kWordSize;
+  const intptr_t kStartIndexOffset = 1 * kWordSize;
+  const intptr_t kEndIndexOffset = 0 * kWordSize;
+  Label fall_through, ok;
+
+  __ ldr(R2, Address(SP, kEndIndexOffset));
+  __ ldr(TMP, Address(SP, kStartIndexOffset));
+  __ orr(R3, R2,  Operand(TMP));
+  __ tsti(R3, kSmiTagMask);
+  __ b(&fall_through, NE);  // 'start', 'end' not Smi.
+
+  __ sub(R2, R2, Operand(TMP));
+  TryAllocateOnebyteString(assembler, &ok, &fall_through);
+  __ Bind(&ok);
+  // R0: new string as tagged pointer.
+  // Copy string.
+  __ ldr(R3, Address(SP, kStringOffset));
+  __ ldr(R1, Address(SP, kStartIndexOffset));
+  __ SmiUntag(R1);
+  __ add(R3, R3, Operand(R1));
+  // Calculate start address and untag (- 1).
+  __ AddImmediate(R3, R3, OneByteString::data_offset() - 1, kNoPP);
+
+  // R3: Start address to copy from (untagged).
+  // R1: Untagged start index.
+  __ ldr(R2, Address(SP, kEndIndexOffset));
+  __ SmiUntag(R2);
+  __ sub(R2, R2, Operand(R1));
+
+  // R3: Start address to copy from (untagged).
+  // R2: Untagged number of bytes to copy.
+  // R0: Tagged result string.
+  // R6: Pointer into R3.
+  // R7: Pointer into R0.
+  // R1: Scratch register.
+  Label loop, done;
+  __ cmp(R2, Operand(0));
+  __ b(&done, LE);
+  __ mov(R6, R3);
+  __ mov(R7, R0);
+  __ Bind(&loop);
+  __ ldr(R1, Address(R6), kUnsignedByte);
+  __ AddImmediate(R6, R6, 1, kNoPP);
+  __ sub(R2, R2, Operand(1));
+  __ cmp(R2, Operand(0));
+  __ str(R1, FieldAddress(R7, OneByteString::data_offset()), kUnsignedByte);
+  __ AddImmediate(R7, R7, 1, kNoPP);
+  __ b(&loop, GT);
+
+  __ Bind(&done);
+  __ ret();
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::OneByteString_setAt(Assembler* assembler) {
-  return;
+  __ ldr(R2, Address(SP, 0 * kWordSize));  // Value.
+  __ ldr(R1, Address(SP, 1 * kWordSize));  // Index.
+  __ ldr(R0, Address(SP, 2 * kWordSize));  // OneByteString.
+  __ SmiUntag(R1);
+  __ SmiUntag(R2);
+  __ AddImmediate(R3, R0, OneByteString::data_offset() - kHeapObjectTag, kNoPP);
+  __ str(R2, Address(R3, R1), kUnsignedByte);
+  __ ret();
 }
 
 
 void Intrinsifier::OneByteString_allocate(Assembler* assembler) {
-  return;
+  Label fall_through, ok;
+
+  __ ldr(R2, Address(SP, 0 * kWordSize));  // Length.
+  TryAllocateOnebyteString(assembler, &ok, &fall_through);
+
+  __ Bind(&ok);
+  __ ret();
+
+  __ Bind(&fall_through);
 }
 
 
 // TODO(srdjan): Add combinations (one-byte/two-byte/external strings).
 void StringEquality(Assembler* assembler, intptr_t string_cid) {
-  return;
+  Label fall_through, is_true, is_false, loop;
+  __ ldr(R0, Address(SP, 1 * kWordSize));  // This.
+  __ ldr(R1, Address(SP, 0 * kWordSize));  // Other.
+
+  // Are identical?
+  __ cmp(R0, Operand(R1));
+  __ b(&is_true, EQ);
+
+  // Is other OneByteString?
+  __ tsti(R1, kSmiTagMask);
+  __ b(&fall_through, EQ);
+  __ CompareClassId(R1, string_cid, kNoPP);
+  __ b(&fall_through, NE);
+
+  // Have same length?
+  __ ldr(R2, FieldAddress(R0, String::length_offset()));
+  __ ldr(R3, FieldAddress(R1, String::length_offset()));
+  __ cmp(R2, Operand(R3));
+  __ b(&is_false, NE);
+
+  // Check contents, no fall-through possible.
+  // TODO(zra): try out other sequences.
+  ASSERT((string_cid == kOneByteStringCid) ||
+         (string_cid == kTwoByteStringCid));
+  const intptr_t offset = (string_cid == kOneByteStringCid) ?
+      OneByteString::data_offset() : TwoByteString::data_offset();
+  __ AddImmediate(R0, R0, offset - kHeapObjectTag, kNoPP);
+  __ AddImmediate(R1, R1, offset - kHeapObjectTag, kNoPP);
+  __ SmiUntag(R2);
+  __ Bind(&loop);
+  __ AddImmediate(R2, R2, -1, kNoPP);
+  __ CompareRegisters(R2, ZR);
+  __ b(&is_true, LT);
+  if (string_cid == kOneByteStringCid) {
+    __ ldr(R3, Address(R0), kUnsignedByte);
+    __ ldr(R4, Address(R1), kUnsignedByte);
+    __ AddImmediate(R0, R0, 1, kNoPP);
+    __ AddImmediate(R1, R1, 1, kNoPP);
+  } else if (string_cid == kTwoByteStringCid) {
+    __ ldr(R3, Address(R0), kUnsignedHalfword);
+    __ ldr(R4, Address(R1), kUnsignedHalfword);
+    __ AddImmediate(R0, R0, 2, kNoPP);
+    __ AddImmediate(R1, R1, 2, kNoPP);
+  } else {
+    UNIMPLEMENTED();
+  }
+  __ cmp(R3, Operand(R4));
+  __ b(&is_false, NE);
+  __ b(&loop);
+
+  __ Bind(&is_true);
+  __ LoadObject(R0, Bool::True(), PP);
+  __ ret();
+
+  __ Bind(&is_false);
+  __ LoadObject(R0, Bool::False(), PP);
+  __ ret();
+
+  __ Bind(&fall_through);
 }
 
 
 void Intrinsifier::OneByteString_equality(Assembler* assembler) {
-  return;
+  StringEquality(assembler, kOneByteStringCid);
 }
 
 
 void Intrinsifier::TwoByteString_equality(Assembler* assembler) {
-  return;
+  StringEquality(assembler, kTwoByteStringCid);
 }
 
 
+// On stack: user tag (+0).
 void Intrinsifier::UserTag_makeCurrent(Assembler* assembler) {
-  return;
-}
-
-
-void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) {
-  return;
+  // R1: Isolate.
+  Isolate* isolate = Isolate::Current();
+  __ LoadImmediate(R1, reinterpret_cast<uword>(isolate), kNoPP);
+  // R0: Current user tag.
+  __ ldr(R0, Address(R1, Isolate::current_tag_offset()));
+  // R2: UserTag.
+  __ ldr(R2, Address(SP, + 0 * kWordSize));
+  // Set Isolate::current_tag_.
+  __ str(R2, Address(R1, Isolate::current_tag_offset()));
+  // R2: UserTag's tag.
+  __ ldr(R2, FieldAddress(R2, UserTag::tag_offset()));
+  // Set Isolate::user_tag_.
+  __ str(R2, Address(R1, Isolate::user_tag_offset()));
+  __ ret();
 }
 
 
 void Intrinsifier::UserTag_defaultTag(Assembler* assembler) {
-  return;
+  Isolate* isolate = Isolate::Current();
+  // Set return value to default tag address.
+  __ LoadImmediate(R0,
+      reinterpret_cast<uword>(isolate->object_store()) +
+                              ObjectStore::default_tag_offset(), kNoPP);
+  __ ldr(R0, Address(R0));
+  __ ret();
+}
+
+
+void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) {
+  // R1: Default tag address.
+  Isolate* isolate = Isolate::Current();
+  __ LoadImmediate(R1, reinterpret_cast<uword>(isolate), kNoPP);
+  // Set return value to Isolate::current_tag_.
+  __ ldr(R0, Address(R1, Isolate::current_tag_offset()));
+  __ ret();
 }
 
 }  // namespace dart
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index 6e27c85..519eef1 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -28,113 +28,6 @@
 
 #define __ assembler->
 
-void Intrinsifier::List_Allocate(Assembler* assembler) {
-  // This snippet of inlined code uses the following registers:
-  // EAX, EBX, EDI
-  // and the newly allocated object is returned in EAX.
-  const intptr_t kTypeArgumentsOffset = 2 * kWordSize;
-  const intptr_t kArrayLengthOffset = 1 * kWordSize;
-  Label fall_through;
-
-  // Compute the size to be allocated, it is based on the array length
-  // and is computed as:
-  // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
-  __ movl(EDI, Address(ESP, kArrayLengthOffset));  // Array length.
-  // Check that length is a positive Smi.
-  __ testl(EDI, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &fall_through);
-  __ cmpl(EDI, Immediate(0));
-  __ j(LESS, &fall_through);
-  // Check for maximum allowed length.
-  const Immediate& max_len =
-      Immediate(reinterpret_cast<int32_t>(Smi::New(Array::kMaxElements)));
-  __ cmpl(EDI, max_len);
-  __ j(GREATER, &fall_through);
-  const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
-  __ leal(EDI, Address(EDI, TIMES_2, fixed_size));  // EDI is a Smi.
-  ASSERT(kSmiTagShift == 1);
-  __ andl(EDI, Immediate(-kObjectAlignment));
-
-  Isolate* isolate = Isolate::Current();
-  Heap* heap = isolate->heap();
-
-  __ movl(EAX, Address::Absolute(heap->TopAddress()));
-  __ movl(EBX, EAX);
-
-  // EDI: allocation size.
-  __ addl(EBX, EDI);
-  __ j(CARRY, &fall_through);
-
-  // Check if the allocation fits into the remaining space.
-  // EAX: potential new object start.
-  // EBX: potential next object start.
-  // EDI: allocation size.
-  __ cmpl(EBX, Address::Absolute(heap->EndAddress()));
-  __ j(ABOVE_EQUAL, &fall_through);
-
-  // Successfully allocated the object(s), now update top to point to
-  // next object start and initialize the object.
-  __ movl(Address::Absolute(heap->TopAddress()), EBX);
-  __ addl(EAX, Immediate(kHeapObjectTag));
-  __ UpdateAllocationStatsWithSize(kArrayCid, EDI, kNoRegister);
-
-  // Initialize the tags.
-  // EAX: new object start as a tagged pointer.
-  // EBX: new object end address.
-  // EDI: allocation size.
-  {
-    Label size_tag_overflow, done;
-    __ cmpl(EDI, Immediate(RawObject::SizeTag::kMaxSizeTag));
-    __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-    __ shll(EDI, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));
-    __ jmp(&done, Assembler::kNearJump);
-
-    __ Bind(&size_tag_overflow);
-    __ movl(EDI, Immediate(0));
-    __ Bind(&done);
-
-    // Get the class index and insert it into the tags.
-    const Class& cls = Class::Handle(isolate->object_store()->array_class());
-    __ orl(EDI, Immediate(RawObject::ClassIdTag::encode(cls.id())));
-    __ movl(FieldAddress(EAX, Array::tags_offset()), EDI);  // Tags.
-  }
-
-  // EAX: new object start as a tagged pointer.
-  // EBX: new object end address.
-  // Store the type argument field.
-  __ movl(EDI, Address(ESP, kTypeArgumentsOffset));  // type argument.
-  __ StoreIntoObjectNoBarrier(EAX,
-                              FieldAddress(EAX, Array::type_arguments_offset()),
-                              EDI);
-
-  // Set the length field.
-  __ movl(EDI, Address(ESP, kArrayLengthOffset));  // Array Length.
-  __ StoreIntoObjectNoBarrier(EAX,
-                              FieldAddress(EAX, Array::length_offset()),
-                              EDI);
-
-  // Initialize all array elements to raw_null.
-  // EAX: new object start as a tagged pointer.
-  // EBX: new object end address.
-  // EDI: iterator which initially points to the start of the variable
-  // data area to be initialized.
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
-  __ leal(EDI, FieldAddress(EAX, sizeof(RawArray)));
-  Label done;
-  Label init_loop;
-  __ Bind(&init_loop);
-  __ cmpl(EDI, EBX);
-  __ j(ABOVE_EQUAL, &done, Assembler::kNearJump);
-  __ movl(Address(EDI, 0), raw_null);
-  __ addl(EDI, Immediate(kWordSize));
-  __ jmp(&init_loop, Assembler::kNearJump);
-  __ Bind(&done);
-  __ ret();  // returns the newly allocated object in EAX.
-
-  __ Bind(&fall_through);
-}
-
 
 void Intrinsifier::Array_getLength(Assembler* assembler) {
   __ movl(EAX, Address(ESP, + 1 * kWordSize));
@@ -144,7 +37,7 @@
 
 
 void Intrinsifier::ImmutableList_getLength(Assembler* assembler) {
-  return Array_getLength(assembler);
+  Array_getLength(assembler);
 }
 
 
@@ -167,7 +60,7 @@
 
 
 void Intrinsifier::ImmutableList_getIndexed(Assembler* assembler) {
-  return Array_getIndexed(assembler);
+  Array_getIndexed(assembler);
 }
 
 
@@ -559,7 +452,7 @@
   }
   UNREACHABLE();
   return static_cast<ScaleFactor>(0);
-};
+}
 
 
 #define TYPED_DATA_ALLOCATOR(clazz)                                            \
@@ -602,7 +495,7 @@
 
 
 void Intrinsifier::Integer_add(Assembler* assembler) {
-  return Integer_addFromInteger(assembler);
+  Integer_addFromInteger(assembler);
 }
 
 
@@ -645,7 +538,7 @@
 
 
 void Intrinsifier::Integer_mul(Assembler* assembler) {
-  return Integer_mulFromInteger(assembler);
+  Integer_mulFromInteger(assembler);
 }
 
 
@@ -779,7 +672,7 @@
 
 
 void Intrinsifier::Integer_bitAnd(Assembler* assembler) {
-  return Integer_bitAndFromInteger(assembler);
+  Integer_bitAndFromInteger(assembler);
 }
 
 
@@ -795,7 +688,7 @@
 
 
 void Intrinsifier::Integer_bitOr(Assembler* assembler) {
-  return Integer_bitOrFromInteger(assembler);
+  Integer_bitOrFromInteger(assembler);
 }
 
 
@@ -811,7 +704,7 @@
 
 
 void Intrinsifier::Integer_bitXor(Assembler* assembler) {
-  return Integer_bitXorFromInteger(assembler);
+  Integer_bitXorFromInteger(assembler);
 }
 
 
@@ -951,27 +844,27 @@
 
 
 void Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) {
-  return CompareIntegers(assembler, LESS);
+  CompareIntegers(assembler, LESS);
 }
 
 
 void Intrinsifier::Integer_lessThan(Assembler* assembler) {
-  return Integer_greaterThanFromInt(assembler);
+  Integer_greaterThanFromInt(assembler);
 }
 
 
 void Intrinsifier::Integer_greaterThan(Assembler* assembler) {
-  return CompareIntegers(assembler, GREATER);
+  CompareIntegers(assembler, GREATER);
 }
 
 
 void Intrinsifier::Integer_lessEqualThan(Assembler* assembler) {
-  return CompareIntegers(assembler, LESS_EQUAL);
+  CompareIntegers(assembler, LESS_EQUAL);
 }
 
 
 void Intrinsifier::Integer_greaterEqualThan(Assembler* assembler) {
-  return CompareIntegers(assembler, GREATER_EQUAL);
+  CompareIntegers(assembler, GREATER_EQUAL);
 }
 
 
@@ -1027,7 +920,7 @@
 
 
 void Intrinsifier::Integer_equal(Assembler* assembler) {
-  return Integer_equalToInteger(assembler);
+  Integer_equalToInteger(assembler);
 }
 
 
@@ -1129,31 +1022,31 @@
 
 // arg0 is Double, arg1 is unknown.
 void Intrinsifier::Double_greaterThan(Assembler* assembler) {
-  return CompareDoubles(assembler, ABOVE);
+  CompareDoubles(assembler, ABOVE);
 }
 
 
 // arg0 is Double, arg1 is unknown.
 void Intrinsifier::Double_greaterEqualThan(Assembler* assembler) {
-  return CompareDoubles(assembler, ABOVE_EQUAL);
+  CompareDoubles(assembler, ABOVE_EQUAL);
 }
 
 
 // arg0 is Double, arg1 is unknown.
 void Intrinsifier::Double_lessThan(Assembler* assembler) {
-  return CompareDoubles(assembler, BELOW);
+  CompareDoubles(assembler, BELOW);
 }
 
 
 // arg0 is Double, arg1 is unknown.
 void Intrinsifier::Double_equal(Assembler* assembler) {
-  return CompareDoubles(assembler, EQUAL);
+  CompareDoubles(assembler, EQUAL);
 }
 
 
 // arg0 is Double, arg1 is unknown.
 void Intrinsifier::Double_lessEqualThan(Assembler* assembler) {
-  return CompareDoubles(assembler, BELOW_EQUAL);
+  CompareDoubles(assembler, BELOW_EQUAL);
 }
 
 
@@ -1187,22 +1080,22 @@
 
 
 void Intrinsifier::Double_add(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kADD);
+  DoubleArithmeticOperations(assembler, Token::kADD);
 }
 
 
 void Intrinsifier::Double_mul(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kMUL);
+  DoubleArithmeticOperations(assembler, Token::kMUL);
 }
 
 
 void Intrinsifier::Double_sub(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kSUB);
+  DoubleArithmeticOperations(assembler, Token::kSUB);
 }
 
 
 void Intrinsifier::Double_div(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kDIV);
+  DoubleArithmeticOperations(assembler, Token::kDIV);
 }
 
 
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index ce9b0ab..c352ced 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -20,119 +20,6 @@
 
 #define __ assembler->
 
-void Intrinsifier::List_Allocate(Assembler* assembler) {
-  const intptr_t kTypeArgumentsOffset = 1 * kWordSize;
-  const intptr_t kArrayLengthOffset = 0 * kWordSize;
-  Label fall_through;
-
-  // Compute the size to be allocated, it is based on the array length
-  // and is computed as:
-  // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
-  __ lw(T3, Address(SP, kArrayLengthOffset));  // Array length.
-
-  // Check that length is a positive Smi.
-  __ andi(CMPRES1, T3, Immediate(kSmiTagMask));
-  __ bne(CMPRES1, ZR, &fall_through);
-  __ bltz(T3, &fall_through);
-
-  // Check for maximum allowed length.
-  const intptr_t max_len =
-      reinterpret_cast<int32_t>(Smi::New(Array::kMaxElements));
-  __ BranchUnsignedGreater(T3, max_len, &fall_through);
-
-  const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
-  __ LoadImmediate(T2, fixed_size);
-  __ sll(T3, T3, 1);  // T3 is  a Smi.
-  __ addu(T2, T2, T3);
-  ASSERT(kSmiTagShift == 1);
-  __ LoadImmediate(T3, ~(kObjectAlignment - 1));
-  __ and_(T2, T2, T3);
-
-  // T2: Allocation size.
-
-  Isolate* isolate = Isolate::Current();
-  Heap* heap = isolate->heap();
-
-  __ LoadImmediate(T3, heap->TopAddress());
-  __ lw(T0, Address(T3, 0));  // Potential new object start.
-
-  __ AdduDetectOverflow(T1, T0, T2, CMPRES1);  // Potential next object start.
-  __ bltz(CMPRES1, &fall_through);  // CMPRES1 < 0 on overflow.
-
-  // Check if the allocation fits into the remaining space.
-  // T0: potential new object start.
-  // T1: potential next object start.
-  // T2: allocation size.
-  __ LoadImmediate(T4, heap->TopAddress());
-  __ lw(T4, Address(T4, 0));
-  __ BranchUnsignedGreaterEqual(T1, T4, &fall_through);
-
-  // Successfully allocated the object(s), now update top to point to
-  // next object start and initialize the object.
-  __ sw(T1, Address(T3, 0));
-  __ addiu(T0, T0, Immediate(kHeapObjectTag));
-  __ UpdateAllocationStatsWithSize(kArrayCid, T2, T4);
-
-  // Initialize the tags.
-  // T0: new object start as a tagged pointer.
-  // T1: new object end address.
-  // T2: allocation size.
-  {
-    Label overflow, done;
-    const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
-    const Class& cls = Class::Handle(isolate->object_store()->array_class());
-
-    __ BranchUnsignedGreater(T2, RawObject::SizeTag::kMaxSizeTag, &overflow);
-    __ b(&done);
-    __ delay_slot()->sll(T2, T2, shift);
-    __ Bind(&overflow);
-    __ mov(T2, ZR);
-    __ Bind(&done);
-
-    // Get the class index and insert it into the tags.
-    // T2: size and bit tags.
-    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cls.id()));
-    __ or_(T2, T2, TMP);
-    __ sw(T2, FieldAddress(T0, Array::tags_offset()));  // Store tags.
-  }
-
-  // T0: new object start as a tagged pointer.
-  // T1: new object end address.
-  // Store the type argument field.
-  __ lw(T2, Address(SP, kTypeArgumentsOffset));  // Type argument.
-  __ StoreIntoObjectNoBarrier(T0,
-                              FieldAddress(T0, Array::type_arguments_offset()),
-                              T2);
-
-  // Set the length field.
-  __ lw(T2, Address(SP, kArrayLengthOffset));  // Array Length.
-  __ StoreIntoObjectNoBarrier(T0,
-                              FieldAddress(T0, Array::length_offset()),
-                              T2);
-
-  __ LoadImmediate(T7, reinterpret_cast<int32_t>(Object::null()));
-  // Initialize all array elements to raw_null.
-  // T0: new object start as a tagged pointer.
-  // T1: new object end address.
-  // T2: iterator which initially points to the start of the variable
-  // data area to be initialized.
-  // T7: null
-  __ AddImmediate(T2, T0, sizeof(RawArray) - kHeapObjectTag);
-
-  Label done;
-  Label init_loop;
-  __ Bind(&init_loop);
-  __ BranchUnsignedGreaterEqual(T2, T1, &done);
-  __ sw(T7, Address(T2, 0));
-  __ b(&init_loop);
-  __ delay_slot()->addiu(T2, T2, Immediate(kWordSize));
-  __ Bind(&done);
-
-  __ Ret();  // Returns the newly allocated object in V0.
-  __ delay_slot()->mov(V0, T0);
-  __ Bind(&fall_through);
-}
-
 
 void Intrinsifier::Array_getLength(Assembler* assembler) {
   __ lw(V0, Address(SP, 0 * kWordSize));
@@ -142,7 +29,7 @@
 
 
 void Intrinsifier::ImmutableList_getLength(Assembler* assembler) {
-  return Array_getLength(assembler);
+  Array_getLength(assembler);
 }
 
 
@@ -170,7 +57,7 @@
 
 
 void Intrinsifier::ImmutableList_getIndexed(Assembler* assembler) {
-  return Array_getIndexed(assembler);
+  Array_getIndexed(assembler);
 }
 
 
@@ -560,7 +447,7 @@
   }
   UNREACHABLE();
   return -1;
-};
+}
 
 
 #define TYPED_DATA_ALLOCATOR(clazz)                                            \
@@ -604,7 +491,7 @@
 
 
 void Intrinsifier::Integer_add(Assembler* assembler) {
-  return Integer_addFromInteger(assembler);
+  Integer_addFromInteger(assembler);
 }
 
 
@@ -647,7 +534,7 @@
 
 
 void Intrinsifier::Integer_mul(Assembler* assembler) {
-  return Integer_mulFromInteger(assembler);
+  Integer_mulFromInteger(assembler);
 }
 
 
@@ -776,7 +663,7 @@
 
 
 void Intrinsifier::Integer_bitAnd(Assembler* assembler) {
-  return Integer_bitAndFromInteger(assembler);
+  Integer_bitAndFromInteger(assembler);
 }
 
 
@@ -791,7 +678,7 @@
 
 
 void Intrinsifier::Integer_bitOr(Assembler* assembler) {
-  return Integer_bitOrFromInteger(assembler);
+  Integer_bitOrFromInteger(assembler);
 }
 
 
@@ -806,7 +693,7 @@
 
 
 void Intrinsifier::Integer_bitXor(Assembler* assembler) {
-  return Integer_bitXorFromInteger(assembler);
+  Integer_bitXorFromInteger(assembler);
 }
 
 
@@ -960,27 +847,27 @@
 
 
 void Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) {
-  return CompareIntegers(assembler, LT);
+  CompareIntegers(assembler, LT);
 }
 
 
 void Intrinsifier::Integer_lessThan(Assembler* assembler) {
-  return Integer_greaterThanFromInt(assembler);
+  Integer_greaterThanFromInt(assembler);
 }
 
 
 void Intrinsifier::Integer_greaterThan(Assembler* assembler) {
-  return CompareIntegers(assembler, GT);
+  CompareIntegers(assembler, GT);
 }
 
 
 void Intrinsifier::Integer_lessEqualThan(Assembler* assembler) {
-  return CompareIntegers(assembler, LE);
+  CompareIntegers(assembler, LE);
 }
 
 
 void Intrinsifier::Integer_greaterEqualThan(Assembler* assembler) {
-  return CompareIntegers(assembler, GE);
+  CompareIntegers(assembler, GE);
 }
 
 
@@ -1038,7 +925,7 @@
 
 
 void Intrinsifier::Integer_equal(Assembler* assembler) {
-  return Integer_equalToInteger(assembler);
+  Integer_equalToInteger(assembler);
 }
 
 
@@ -1146,27 +1033,27 @@
 
 
 void Intrinsifier::Double_greaterThan(Assembler* assembler) {
-  return CompareDoubles(assembler, GT);
+  CompareDoubles(assembler, GT);
 }
 
 
 void Intrinsifier::Double_greaterEqualThan(Assembler* assembler) {
-  return CompareDoubles(assembler, GE);
+  CompareDoubles(assembler, GE);
 }
 
 
 void Intrinsifier::Double_lessThan(Assembler* assembler) {
-  return CompareDoubles(assembler, LT);
+  CompareDoubles(assembler, LT);
 }
 
 
 void Intrinsifier::Double_equal(Assembler* assembler) {
-  return CompareDoubles(assembler, EQ);
+  CompareDoubles(assembler, EQ);
 }
 
 
 void Intrinsifier::Double_lessEqualThan(Assembler* assembler) {
-  return CompareDoubles(assembler, LE);
+  CompareDoubles(assembler, LE);
 }
 
 
@@ -1201,22 +1088,22 @@
 
 
 void Intrinsifier::Double_add(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kADD);
+  DoubleArithmeticOperations(assembler, Token::kADD);
 }
 
 
 void Intrinsifier::Double_mul(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kMUL);
+  DoubleArithmeticOperations(assembler, Token::kMUL);
 }
 
 
 void Intrinsifier::Double_sub(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kSUB);
+  DoubleArithmeticOperations(assembler, Token::kSUB);
 }
 
 
 void Intrinsifier::Double_div(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kDIV);
+  DoubleArithmeticOperations(assembler, Token::kDIV);
 }
 
 
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index 243d4a5..a34cc8b 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -27,113 +27,6 @@
 #define __ assembler->
 
 
-void Intrinsifier::List_Allocate(Assembler* assembler) {
-  // This snippet of inlined code uses the following registers:
-  // RAX, RCX, RDI, R13
-  // and the newly allocated object is returned in RAX.
-  const intptr_t kTypeArgumentsOffset = 2 * kWordSize;
-  const intptr_t kArrayLengthOffset = 1 * kWordSize;
-  Label fall_through;
-
-  // Compute the size to be allocated, it is based on the array length
-  // and is computed as:
-  // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
-  __ movq(RDI, Address(RSP, kArrayLengthOffset));  // Array Length.
-  // Check that length is a positive Smi.
-  __ testq(RDI, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &fall_through);
-  __ cmpq(RDI, Immediate(0));
-  __ j(LESS, &fall_through);
-  // Check for maximum allowed length.
-  const Immediate& max_len =
-      Immediate(reinterpret_cast<int64_t>(Smi::New(Array::kMaxElements)));
-  __ cmpq(RDI, max_len);
-  __ j(GREATER, &fall_through);
-  const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
-  __ leaq(RDI, Address(RDI, TIMES_4, fixed_size));  // RDI is a Smi.
-  ASSERT(kSmiTagShift == 1);
-  __ andq(RDI, Immediate(-kObjectAlignment));
-
-  Isolate* isolate = Isolate::Current();
-  Heap* heap = isolate->heap();
-
-  __ movq(RAX, Immediate(heap->TopAddress()));
-  __ movq(RAX, Address(RAX, 0));
-
-  // RDI: allocation size.
-  __ movq(RCX, RAX);
-  __ addq(RCX, RDI);
-  __ j(CARRY, &fall_through);
-
-  // Check if the allocation fits into the remaining space.
-  // RAX: potential new object start.
-  // RCX: potential next object start.
-  // RDI: allocation size.
-  __ movq(R13, Immediate(heap->EndAddress()));
-  __ cmpq(RCX, Address(R13, 0));
-  __ j(ABOVE_EQUAL, &fall_through);
-
-  // Successfully allocated the object(s), now update top to point to
-  // next object start and initialize the object.
-  __ movq(R13, Immediate(heap->TopAddress()));
-  __ movq(Address(R13, 0), RCX);
-  __ addq(RAX, Immediate(kHeapObjectTag));
-  __ UpdateAllocationStatsWithSize(kArrayCid, RDI);
-  // Initialize the tags.
-  // RAX: new object start as a tagged pointer.
-  // RDI: allocation size.
-  {
-    Label size_tag_overflow, done;
-    __ cmpq(RDI, Immediate(RawObject::SizeTag::kMaxSizeTag));
-    __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-    __ shlq(RDI, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));
-    __ jmp(&done, Assembler::kNearJump);
-
-    __ Bind(&size_tag_overflow);
-    __ movq(RDI, Immediate(0));
-    __ Bind(&done);
-
-    // Get the class index and insert it into the tags.
-    const Class& cls = Class::Handle(isolate->object_store()->array_class());
-    __ orq(RDI, Immediate(RawObject::ClassIdTag::encode(cls.id())));
-    __ movq(FieldAddress(RAX, Array::tags_offset()), RDI);  // Tags.
-  }
-
-  // RAX: new object start as a tagged pointer.
-  // Store the type argument field.
-  __ movq(RDI, Address(RSP, kTypeArgumentsOffset));  // type argument.
-  __ StoreIntoObjectNoBarrier(RAX,
-                              FieldAddress(RAX, Array::type_arguments_offset()),
-                              RDI);
-
-  // Set the length field.
-  __ movq(RDI, Address(RSP, kArrayLengthOffset));  // Array Length.
-  __ StoreIntoObjectNoBarrier(RAX,
-                              FieldAddress(RAX, Array::length_offset()),
-                              RDI);
-
-  // Initialize all array elements to raw_null.
-  // RAX: new object start as a tagged pointer.
-  // RCX: new object end address.
-  // RDI: iterator which initially points to the start of the variable
-  // data area to be initialized.
-  __ LoadObject(R12, Object::null_object(), PP);
-  __ leaq(RDI, FieldAddress(RAX, sizeof(RawArray)));
-  Label done;
-  Label init_loop;
-  __ Bind(&init_loop);
-  __ cmpq(RDI, RCX);
-  __ j(ABOVE_EQUAL, &done, Assembler::kNearJump);
-  __ movq(Address(RDI, 0), R12);
-  __ addq(RDI, Immediate(kWordSize));
-  __ jmp(&init_loop, Assembler::kNearJump);
-  __ Bind(&done);
-  __ ret();  // returns the newly allocated object in RAX.
-
-  __ Bind(&fall_through);
-}
-
-
 void Intrinsifier::Array_getLength(Assembler* assembler) {
   __ movq(RAX, Address(RSP, + 1 * kWordSize));
   __ movq(RAX, FieldAddress(RAX, Array::length_offset()));
@@ -142,7 +35,7 @@
 
 
 void Intrinsifier::ImmutableList_getLength(Assembler* assembler) {
-  return Array_getLength(assembler);
+  Array_getLength(assembler);
 }
 
 
@@ -165,7 +58,7 @@
 
 
 void Intrinsifier::ImmutableList_getIndexed(Assembler* assembler) {
-  return Array_getIndexed(assembler);
+  Array_getIndexed(assembler);
 }
 
 
@@ -514,7 +407,7 @@
   }
   UNREACHABLE();
   return static_cast<ScaleFactor>(0);
-};
+}
 
 
 #define TYPED_DATA_ALLOCATOR(clazz)                                            \
@@ -558,7 +451,7 @@
 
 
 void Intrinsifier::Integer_add(Assembler* assembler) {
-  return Integer_addFromInteger(assembler);
+  Integer_addFromInteger(assembler);
 }
 
 
@@ -604,7 +497,7 @@
 
 
 void Intrinsifier::Integer_mul(Assembler* assembler) {
-  return Integer_mulFromInteger(assembler);
+  Integer_mulFromInteger(assembler);
 }
 
 
@@ -617,7 +510,7 @@
 // RAX: Tagged left (dividend).
 // RCX: Tagged right (divisor).
 // RAX: Untagged result (remainder).
-void EmitRemainderOperation(Assembler* assembler) {
+static void EmitRemainderOperation(Assembler* assembler) {
   Label return_zero, try_modulo, not_32bit, done;
   // Check for quick zero results.
   __ cmpq(RAX, Immediate(0));
@@ -785,7 +678,7 @@
 
 
 void Intrinsifier::Integer_bitAnd(Assembler* assembler) {
-  return Integer_bitAndFromInteger(assembler);
+  Integer_bitAndFromInteger(assembler);
 }
 
 
@@ -801,7 +694,7 @@
 
 
 void Intrinsifier::Integer_bitOr(Assembler* assembler) {
-  return Integer_bitOrFromInteger(assembler);
+  Integer_bitOrFromInteger(assembler);
 }
 
 
@@ -817,7 +710,7 @@
 
 
 void Intrinsifier::Integer_bitXor(Assembler* assembler) {
-  return Integer_bitXorFromInteger(assembler);
+  Integer_bitXorFromInteger(assembler);
 }
 
 
@@ -868,29 +761,28 @@
 }
 
 
-
 void Intrinsifier::Integer_lessThan(Assembler* assembler) {
-  return CompareIntegers(assembler, LESS);
+  CompareIntegers(assembler, LESS);
 }
 
 
 void Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) {
-  return CompareIntegers(assembler, LESS);
+  CompareIntegers(assembler, LESS);
 }
 
 
 void Intrinsifier::Integer_greaterThan(Assembler* assembler) {
-  return CompareIntegers(assembler, GREATER);
+  CompareIntegers(assembler, GREATER);
 }
 
 
 void Intrinsifier::Integer_lessEqualThan(Assembler* assembler) {
-  return CompareIntegers(assembler, LESS_EQUAL);
+  CompareIntegers(assembler, LESS_EQUAL);
 }
 
 
 void Intrinsifier::Integer_greaterEqualThan(Assembler* assembler) {
-  return CompareIntegers(assembler, GREATER_EQUAL);
+  CompareIntegers(assembler, GREATER_EQUAL);
 }
 
 
@@ -950,7 +842,7 @@
 
 
 void Intrinsifier::Integer_equal(Assembler* assembler) {
-  return Integer_equalToInteger(assembler);
+  Integer_equalToInteger(assembler);
 }
 
 
@@ -1039,27 +931,27 @@
 
 
 void Intrinsifier::Double_greaterThan(Assembler* assembler) {
-  return CompareDoubles(assembler, ABOVE);
+  CompareDoubles(assembler, ABOVE);
 }
 
 
 void Intrinsifier::Double_greaterEqualThan(Assembler* assembler) {
-  return CompareDoubles(assembler, ABOVE_EQUAL);
+  CompareDoubles(assembler, ABOVE_EQUAL);
 }
 
 
 void Intrinsifier::Double_lessThan(Assembler* assembler) {
-  return CompareDoubles(assembler, BELOW);
+  CompareDoubles(assembler, BELOW);
 }
 
 
 void Intrinsifier::Double_equal(Assembler* assembler) {
-  return CompareDoubles(assembler, EQUAL);
+  CompareDoubles(assembler, EQUAL);
 }
 
 
 void Intrinsifier::Double_lessEqualThan(Assembler* assembler) {
-  return CompareDoubles(assembler, BELOW_EQUAL);
+  CompareDoubles(assembler, BELOW_EQUAL);
 }
 
 
@@ -1093,22 +985,22 @@
 
 
 void Intrinsifier::Double_add(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kADD);
+  DoubleArithmeticOperations(assembler, Token::kADD);
 }
 
 
 void Intrinsifier::Double_mul(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kMUL);
+  DoubleArithmeticOperations(assembler, Token::kMUL);
 }
 
 
 void Intrinsifier::Double_sub(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kSUB);
+  DoubleArithmeticOperations(assembler, Token::kSUB);
 }
 
 
 void Intrinsifier::Double_div(Assembler* assembler) {
-  return DoubleArithmeticOperations(assembler, Token::kDIV);
+  DoubleArithmeticOperations(assembler, Token::kDIV);
 }
 
 
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index d185883..e97589be 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -313,6 +313,7 @@
       stub_code_(NULL),
       debugger_(NULL),
       single_step_(false),
+      resume_request_(false),
       random_(),
       simulator_(NULL),
       long_jump_base_(NULL),
@@ -937,16 +938,23 @@
     // inlined frames.
     jsobj.AddProperty("depth", (intptr_t)0);
   }
-  intptr_t live_ports = message_handler()->live_ports();
-  intptr_t control_ports = message_handler()->control_ports();
-  bool paused_on_exit = message_handler()->paused_on_exit();
-  bool pause_on_start = message_handler()->pause_on_start();
-  bool pause_on_exit = message_handler()->pause_on_exit();
-  jsobj.AddProperty("livePorts", live_ports);
-  jsobj.AddProperty("controlPorts", control_ports);
-  jsobj.AddProperty("pausedOnStart", pause_on_start);
-  jsobj.AddProperty("pausedOnExit", paused_on_exit);
-  jsobj.AddProperty("pauseOnExit", pause_on_exit);
+  jsobj.AddProperty("livePorts", message_handler()->live_ports());
+  jsobj.AddProperty("controlPorts", message_handler()->control_ports());
+  jsobj.AddProperty("pauseOnExit", message_handler()->pause_on_exit());
+
+  // TODO(turnidge): Make the debugger support paused_on_start/exit.
+  if (message_handler()->paused_on_start()) {
+    ASSERT(debugger()->PauseEvent() == NULL);
+    DebuggerEvent pauseEvent(DebuggerEvent::kIsolateCreated);
+    jsobj.AddProperty("pauseEvent", &pauseEvent);
+  } else if (message_handler()->paused_on_exit()) {
+    ASSERT(debugger()->PauseEvent() == NULL);
+    DebuggerEvent pauseEvent(DebuggerEvent::kIsolateShutdown);
+    jsobj.AddProperty("pauseEvent", &pauseEvent);
+  } else if (debugger()->PauseEvent() != NULL) {
+    jsobj.AddProperty("pauseEvent", debugger()->PauseEvent());
+  }
+
   const Library& lib =
       Library::Handle(object_store()->root_library());
   jsobj.AddProperty("rootLib", lib);
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 309b3ed..bad6ffa 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -329,6 +329,19 @@
     return OFFSET_OF(Isolate, single_step_);
   }
 
+  // Requests that the debugger resume execution.
+  void Resume() {
+    resume_request_ = true;
+  }
+
+  // Returns whether the vm service has requested that the debugger
+  // resume execution.
+  bool GetAndClearResumeRequest() {
+    bool resume_request = resume_request_;
+    resume_request_ = false;
+    return resume_request;
+  }
+
   Random* random() { return &random_; }
 
   Simulator* simulator() const { return simulator_; }
@@ -552,6 +565,7 @@
   StubCode* stub_code_;
   Debugger* debugger_;
   bool single_step_;
+  bool resume_request_;
   Random random_;
   Simulator* simulator_;
   LongJumpScope* long_jump_base_;
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index 57a675d..afbe30e 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -247,6 +247,12 @@
 }
 
 
+void JSONStream::PrintValue(const DebuggerEvent* event) {
+  PrintCommaIfNeeded();
+  event->PrintJSON(this);
+}
+
+
 void JSONStream::PrintValue(Isolate* isolate, bool ref) {
   PrintCommaIfNeeded();
   isolate->PrintJSON(this, ref);
@@ -283,6 +289,18 @@
 }
 
 
+void JSONStream::PrintProperty(const char* name, const DebuggerEvent* event) {
+  PrintPropertyName(name);
+  PrintValue(event);
+}
+
+
+void JSONStream::PrintProperty(const char* name, Isolate* isolate) {
+  PrintPropertyName(name);
+  PrintValue(isolate);
+}
+
+
 void JSONStream::PrintfProperty(const char* name, const char* format, ...) {
   PrintPropertyName(name);
   va_list args;
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index 60d4025..1e40f66 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -11,6 +11,7 @@
 
 namespace dart {
 
+class DebuggerEvent;
 class Field;
 class GrowableObjectArray;
 class Instance;
@@ -84,6 +85,7 @@
   void PrintfValue(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
   void PrintValue(const Object& o, bool ref = true);
   void PrintValue(SourceBreakpoint* bpt);
+  void PrintValue(const DebuggerEvent* event);
   void PrintValue(Isolate* isolate, bool ref = true);
 
   void PrintPropertyBool(const char* name, bool b);
@@ -95,6 +97,8 @@
   PRINTF_ATTRIBUTE(3, 4);
   void PrintProperty(const char* name, const Object& o, bool ref = true);
 
+  void PrintProperty(const char* name, const DebuggerEvent* event);
+  void PrintProperty(const char* name, Isolate* isolate);
   void PrintPropertyName(const char* name);
   void PrintCommaIfNeeded();
   bool NeedComma();
@@ -151,6 +155,12 @@
   void AddProperty(const char* name, const Object& obj, bool ref = true) const {
     stream_->PrintProperty(name, obj, ref);
   }
+  void AddProperty(const char* name, const DebuggerEvent* event) const {
+    stream_->PrintProperty(name, event);
+  }
+  void AddProperty(const char* name, Isolate* isolate) const {
+    stream_->PrintProperty(name, isolate);
+  }
   void AddPropertyF(const char* name, const char* format, ...) const
       PRINTF_ATTRIBUTE(3, 4);
 
@@ -193,6 +203,9 @@
   void AddValue(SourceBreakpoint* bpt) const {
     stream_->PrintValue(bpt);
   }
+  void AddValue(const DebuggerEvent* event) const {
+    stream_->PrintValue(event);
+  }
   void AddValueF(const char* format, ...) const PRINTF_ATTRIBUTE(2, 3);
 
  private:
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index eb1056b..dbc5d07 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -79,6 +79,12 @@
     pause_on_start_ = pause_on_start;
   }
 
+  bool paused_on_start() const {
+    // If pause_on_start_ is still set, tell the user we are paused,
+    // even if we haven't hit the pause point yet.
+    return pause_on_start_;
+  }
+
   bool pause_on_exit() const {
     return pause_on_exit_;
   }
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 5c4b9e1..9f677fd 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -700,9 +700,13 @@
 
   String& error_str = String::Handle();
   error_str = String::New("SnapshotWriter Error", Heap::kOld);
-  *snapshot_writer_error_ = LanguageError::New(error_str, Heap::kOld);
+  *snapshot_writer_error_ = LanguageError::New(error_str,
+                                               LanguageError::kError,
+                                               Heap::kOld);
   error_str = String::New("Branch offset overflow", Heap::kOld);
-  *branch_offset_error_ = LanguageError::New(error_str, Heap::kOld);
+  *branch_offset_error_ = LanguageError::New(error_str,
+                                             LanguageError::kBailout,
+                                             Heap::kOld);
 
   ASSERT(!null_object_->IsSmi());
   ASSERT(!null_array_->IsSmi());
@@ -2794,6 +2798,30 @@
 }
 
 
+void Class::AddField(const Field& field) const {
+  const Array& arr = Array::Handle(fields());
+  const Array& new_arr = Array::Handle(Array::Grow(arr, arr.Length() + 1));
+  new_arr.SetAt(arr.Length(), field);
+  SetFields(new_arr);
+}
+
+
+void Class::AddFields(const GrowableObjectArray& new_fields) const {
+  const intptr_t num_new_fields = new_fields.Length();
+  if (num_new_fields == 0) return;
+  const Array& arr = Array::Handle(fields());
+  const intptr_t num_old_fields = arr.Length();
+  const Array& new_arr = Array::Handle(
+      Array::Grow(arr, num_old_fields + num_new_fields, Heap::kOld));
+  Field& field = Field::Handle();
+  for (intptr_t i = 0; i < num_new_fields; i++) {
+    field ^= new_fields.At(i);
+    new_arr.SetAt(i + num_old_fields, field);
+  }
+  SetFields(new_arr);
+}
+
+
 intptr_t Class::FindFieldIndex(const Field& needle) const {
   Isolate* isolate = Isolate::Current();
   if (EnsureIsFinalized(isolate) != Error::null()) {
@@ -5950,12 +5978,12 @@
   result.set_is_optimizable(is_native ? false : true);
   result.set_is_inlinable(true);
   result.set_allows_hoisting_check_class(true);
+  result.set_code(Code::Handle(StubCode::LazyCompile_entry()->code()));
   if (kind == RawFunction::kClosureFunction) {
     const ClosureData& data = ClosureData::Handle(ClosureData::New());
     result.set_data(data);
   }
 
-  result.set_code(Code::Handle(StubCode::LazyCompile_entry()->code()));
   return result.raw();
 }
 
@@ -6798,7 +6826,8 @@
 
 
 bool Field::IsUnboxedField() const {
-  bool valid_class = (guarded_cid() == kDoubleCid) ||
+  bool valid_class = (FlowGraphCompiler::SupportsUnboxedDoubles() &&
+                      (guarded_cid() == kDoubleCid)) ||
                      (FlowGraphCompiler::SupportsUnboxedSimd128() &&
                       (guarded_cid() == kFloat32x4Cid)) ||
                      (FlowGraphCompiler::SupportsUnboxedSimd128() &&
@@ -7383,38 +7412,30 @@
 
   // Add an IDENT token into the stream and the token objects array.
   void AddIdentToken(const String* ident) {
-    if (ident != NULL) {
-      // If the IDENT token is already in the tokens object array use the
-      // same index instead of duplicating it.
-      intptr_t index = FindIdentIndex(ident);
-      if (index == -1) {
-        WriteIndex(token_objects_.Length());
-        ASSERT(ident != NULL);
-        token_objects_.Add(*ident);
-      } else {
-        WriteIndex(index);
-      }
+    // If the IDENT token is already in the tokens object array use the
+    // same index instead of duplicating it.
+    intptr_t index = FindIdentIndex(ident);
+    if (index == -1) {
+      WriteIndex(token_objects_.Length());
+      ASSERT(ident != NULL);
+      token_objects_.Add(*ident);
     } else {
-      WriteIndex(0);
+      WriteIndex(index);
     }
   }
 
   // Add a LITERAL token into the stream and the token objects array.
   void AddLiteralToken(Token::Kind kind, const String* literal) {
-    if (literal != NULL) {
-      // If the literal token is already in the tokens object array use the
-      // same index instead of duplicating it.
-      intptr_t index = FindLiteralIndex(kind, literal);
-      if (index == -1) {
-        WriteIndex(token_objects_.Length());
-        ASSERT(literal != NULL);
-        literal_token_ = LiteralToken::New(kind, *literal);
-        token_objects_.Add(literal_token_);
-      } else {
-        WriteIndex(index);
-      }
+    // If the literal token is already in the tokens object array use the
+    // same index instead of duplicating it.
+    intptr_t index = FindLiteralIndex(kind, literal);
+    if (index == -1) {
+      WriteIndex(token_objects_.Length());
+      ASSERT(literal != NULL);
+      literal_token_ = LiteralToken::New(kind, *literal);
+      token_objects_.Add(literal_token_);
     } else {
-      WriteIndex(0);
+      WriteIndex(index);
     }
   }
 
@@ -7437,16 +7458,13 @@
  private:
   intptr_t FindIdentIndex(const String* ident) {
     ASSERT(ident != NULL);
+    ASSERT(ident->IsSymbol());
     intptr_t hash_value = ident->Hash() % kTableSize;
     GrowableArray<intptr_t>& value = ident_table_[hash_value];
     for (intptr_t i = 0; i < value.length(); i++) {
       intptr_t index = value[i];
-      token_obj_ = token_objects_.At(index);
-      if (token_obj_.IsString()) {
-        const String& ident_str = String::Cast(token_obj_);
-        if (ident->Equals(ident_str)) {
-          return index;
-        }
+      if (token_objects_.At(index) == ident->raw()) {
+        return index;
       }
     }
     value.Add(token_objects_.Length());
@@ -7455,17 +7473,15 @@
 
   intptr_t FindLiteralIndex(Token::Kind kind, const String* literal) {
     ASSERT(literal != NULL);
+    ASSERT(literal->IsSymbol());
     intptr_t hash_value = literal->Hash() % kTableSize;
     GrowableArray<intptr_t>& value = literal_table_[hash_value];
     for (intptr_t i = 0; i < value.length(); i++) {
       intptr_t index = value[i];
       token_obj_ = token_objects_.At(index);
-      if (token_obj_.IsLiteralToken()) {
-        const LiteralToken& token = LiteralToken::Cast(token_obj_);
-        literal_str_ = token.literal();
-        if (kind == token.kind() && literal->Equals(literal_str_)) {
-          return index;
-        }
+      const LiteralToken& token = LiteralToken::Cast(token_obj_);
+      if ((kind == token.kind()) && (token.literal() == literal->raw())) {
+        return index;
       }
     }
     value.Add(token_objects_.Length());
@@ -8268,6 +8284,7 @@
   GrowableObjectArray& metadata =
       GrowableObjectArray::Handle(this->metadata());
   metadata.Add(field, Heap::kOld);
+  cls.AddField(field);
 }
 
 
@@ -8642,7 +8659,7 @@
 }
 
 static void AddScriptIfUnique(const GrowableObjectArray& scripts,
-                              Script& candidate) {
+                              const Script& candidate) {
   if (candidate.IsNull()) {
     return;
   }
@@ -9641,6 +9658,7 @@
   field.set_type(Type::Handle(Type::DynamicType()));
   field.set_value(Array::empty_array());
   set_metadata_field(field);
+  owner_class.AddField(field);
 }
 
 
@@ -10820,6 +10838,24 @@
 }
 
 
+bool ICData::MayCheckForJSWarning() const {
+  const String& name = String::Handle(target_name());
+  // Warning issued from native code.
+  // Calling sequence is decoded to obtain ic data in order to check if a
+  // warning has already been issued.
+  if (name.Equals(Library::PrivateCoreLibName(Symbols::_instanceOf())) ||
+      name.Equals(Library::PrivateCoreLibName(Symbols::_as()))) {
+    return true;
+  }
+  // Warning issued in ic miss handler.
+  // No decoding necessary, so allow optimization if warning already issued.
+  if (name.Equals(Symbols::toString()) && !IssuedJSWarning()) {
+    return true;
+  }
+  return false;
+}
+
+
 bool ICData::IsClosureCall() const {
   return IsClosureCallBit::decode(raw_ptr()->state_bits_);
 }
@@ -12384,6 +12420,7 @@
 
 
 RawLanguageError* LanguageError::New(const String& formatted_message,
+                                     Kind kind,
                                      Heap::Space space) {
   ASSERT(Object::language_error_class() != Class::null());
   LanguageError& result = LanguageError::Handle();
@@ -12395,6 +12432,7 @@
     result ^= raw;
   }
   result.set_formatted_message(formatted_message);
+  result.set_kind(kind);
   return result.raw();
 }
 
@@ -12440,6 +12478,7 @@
     case kError: message_header = "error"; break;
     case kMalformedType: message_header = "malformed type"; break;
     case kMalboundedType: message_header = "malbounded type"; break;
+    case kBailout: message_header = "bailout"; break;
     default: message_header = ""; UNREACHABLE();
   }
   String& result = String::Handle();
@@ -12682,7 +12721,7 @@
 
 
 
-bool Instance::Equals(const Instance& other) const {
+bool Instance::CanonicalizeEquals(const Instance& other) const {
   if (this->raw() == other.raw()) {
     return true;  // "===".
   }
@@ -12793,7 +12832,7 @@
     if (result.IsNull()) {
       break;
     }
-    if (this->Equals(result)) {
+    if (this->CanonicalizeEquals(result)) {
       return result.raw();
     }
     index++;
@@ -12899,13 +12938,22 @@
 }
 
 
+bool Instance::OperatorEquals(const Instance& other) const {
+  // TODO(koda): Optimize for all builtin classes and all classes
+  // that do not override operator==.
+  const Object& result =
+      Object::Handle(DartLibraryCalls::Equals(*this, other));
+  return result.raw() == Object::bool_true().raw();
+}
+
+
 bool Instance::IsIdenticalTo(const Instance& other) const {
   if (raw() == other.raw()) return true;
   if (IsInteger() && other.IsInteger()) {
-    return Equals(other);
+    return Integer::Cast(*this).Equals(other);
   }
   if (IsDouble() && other.IsDouble()) {
-    if (Equals(other)) return true;
+    if (Double::Cast(*this).CanonicalizeEquals(other)) return true;
     // Check for NaN.
     const Double& a_double = Double::Cast(*this);
     const Double& b_double = Double::Cast(other);
@@ -15431,7 +15479,7 @@
 }
 
 
-bool Double::EqualsToDouble(double value) const {
+bool Double::BitwiseEqualsToDouble(double value) const {
   intptr_t value_offset = Double::value_offset();
   void* this_addr = reinterpret_cast<void*>(
       reinterpret_cast<uword>(this->raw_ptr()) + value_offset);
@@ -15440,14 +15488,25 @@
 }
 
 
-bool Double::Equals(const Instance& other) const {
+bool Double::OperatorEquals(const Instance& other) const {
+  if (this->IsNull() || other.IsNull()) {
+    return (this->IsNull() && other.IsNull());
+  }
+  if (!other.IsDouble()) {
+    return false;
+  }
+  return this->value() == Double::Cast(other).value();
+}
+
+
+bool Double::CanonicalizeEquals(const Instance& other) const {
   if (this->raw() == other.raw()) {
     return true;  // "===".
   }
   if (other.IsNull() || !other.IsDouble()) {
     return false;
   }
-  return EqualsToDouble(Double::Cast(other).value());
+  return BitwiseEqualsToDouble(Double::Cast(other).value());
 }
 
 
@@ -15489,7 +15548,7 @@
     if (canonical_value.IsNull()) {
       break;
     }
-    if (canonical_value.EqualsToDouble(value)) {
+    if (canonical_value.BitwiseEqualsToDouble(value)) {
       return canonical_value.raw();
     }
     index++;
@@ -17390,7 +17449,7 @@
 }
 
 
-bool Array::Equals(const Instance& other) const {
+bool Array::CanonicalizeEquals(const Instance& other) const {
   if (this->raw() == other.raw()) {
     // Both handles point to the same raw instance.
     return true;
@@ -17630,7 +17689,7 @@
 }
 
 
-bool GrowableObjectArray::Equals(const Instance& other) const {
+bool GrowableObjectArray::CanonicalizeEquals(const Instance& other) const {
   // If both handles point to the same raw instance they are equal.
   if (this->raw() == other.raw()) {
     return true;
@@ -18540,7 +18599,7 @@
 }
 
 
-bool JSRegExp::Equals(const Instance& other) const {
+bool JSRegExp::CanonicalizeEquals(const Instance& other) const {
   if (this->raw() == other.raw()) {
     return true;  // "===".
   }
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 9054e18..a425f80 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -939,6 +939,8 @@
 
   RawArray* fields() const { return raw_ptr()->fields_; }
   void SetFields(const Array& value) const;
+  void AddField(const Field& field) const;
+  void AddFields(const GrowableObjectArray& fields) const;
   intptr_t FindFieldIndex(const Field& field) const;
   RawField* FieldFromIndex(intptr_t idx) const;
 
@@ -3306,6 +3308,10 @@
   bool IssuedJSWarning() const;
   void SetIssuedJSWarning() const;
 
+  // Return true if the target function of this IC data may check for (and
+  // possibly issue) a Javascript compatibility warning.
+  bool MayCheckForJSWarning() const;
+
   bool IsClosureCall() const;
   void SetIsClosureCall() const;
 
@@ -4013,6 +4019,7 @@
     kError,
     kMalformedType,
     kMalboundedType,
+    kBailout,
   };
 
   Kind kind() const { return static_cast<Kind>(raw_ptr()->kind_); }
@@ -4041,6 +4048,7 @@
                                          const char* format, va_list args);
 
   static RawLanguageError* New(const String& formatted_message,
+                               Kind kind = kError,
                                Heap::Space space = Heap::kNew);
 
   virtual const char* ToErrorCString() const;
@@ -4128,7 +4136,17 @@
 // in Dart source code.
 class Instance : public Object {
  public:
-  virtual bool Equals(const Instance& other) const;
+  // Equality and identity testing.
+  // 1. OperatorEquals: true iff 'this == other' is true in Dart code.
+  // 2. IsIdenticalTo: true iff 'identical(this, other)' is true in Dart code.
+  // 3. CanonicalizeEquals: used to canonicalize compile-time constants, e.g.,
+  //    using bitwise equality of fields and list elements.
+  // Subclasses where 1 and 3 coincide may also define a plain Equals, e.g.,
+  // String and Integer.
+  virtual bool OperatorEquals(const Instance& other) const;
+  bool IsIdenticalTo(const Instance& other) const;
+  virtual bool CanonicalizeEquals(const Instance& other) const;
+
   // Returns Instance::null() if instance cannot be canonicalized.
   // Any non-canonical number of string will be canonicalized here.
   // An instance cannot be canonicalized if it still contains non-canonical
@@ -4158,10 +4176,6 @@
                     const TypeArguments& type_instantiator,
                     Error* bound_error) const;
 
-  // Check whether this instance is identical to the argument according to the
-  // specification of dare:core's identical().
-  bool IsIdenticalTo(const Instance& other) const;
-
   bool IsValidNativeIndex(int index) const {
     return ((index >= 0) && (index < clazz()->ptr()->num_native_fields_));
   }
@@ -4306,6 +4320,9 @@
   virtual RawTypeArguments* arguments() const;
   virtual intptr_t token_pos() const;
   virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const;
+  virtual bool CanonicalizeEquals(const Instance& other) const {
+    return Equals(other);
+  }
   virtual bool Equals(const Instance& other) const {
     return IsEquivalent(other);
   }
@@ -4872,6 +4889,17 @@
                          Heap::Space space = Heap::kNew,
                          const bool silent = false);
 
+  virtual bool OperatorEquals(const Instance& other) const {
+    return Equals(other);
+  }
+  virtual bool CanonicalizeEquals(const Instance& other) const {
+    return Equals(other);
+  }
+  virtual bool Equals(const Instance& other) const {
+    UNREACHABLE();
+    return false;
+  }
+
   // Integer is an abstract class.
   virtual bool IsZero() const {
     UNREACHABLE();
@@ -4911,7 +4939,7 @@
  public:
   static const intptr_t kBits = kSmiBits;
   static const intptr_t kMaxValue = kSmiMax;
-  static const intptr_t kMinValue =  kSmiMin;
+  static const intptr_t kMinValue = kSmiMin;
 
   intptr_t Value() const {
     return ValueFromRaw(raw_value());
@@ -5136,8 +5164,9 @@
     return raw_ptr()->value_;
   }
 
-  bool EqualsToDouble(double value) const;
-  virtual bool Equals(const Instance& other) const;
+  bool BitwiseEqualsToDouble(double value) const;
+  virtual bool OperatorEquals(const Instance& other) const;
+  virtual bool CanonicalizeEquals(const Instance& other) const;
 
   static RawDouble* New(double d, Heap::Space space = Heap::kNew);
 
@@ -5257,6 +5286,12 @@
   // Compares to an array of UTF-32 encoded characters.
   bool Equals(const int32_t* characters, intptr_t len) const;
 
+  virtual bool OperatorEquals(const Instance& other) const {
+    return Equals(other);
+  }
+  virtual bool CanonicalizeEquals(const Instance& other) const {
+    return Equals(other);
+  }
   virtual bool Equals(const Instance& other) const;
 
   intptr_t CompareTo(const String& other) const;
@@ -5887,7 +5922,7 @@
     StorePointer(&raw_ptr()->type_arguments_, value.raw());
   }
 
-  virtual bool Equals(const Instance& other) const;
+  virtual bool CanonicalizeEquals(const Instance& other) const;
 
   static const intptr_t kBytesPerElement = kWordSize;
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
@@ -6047,7 +6082,7 @@
     StorePointer(&raw_ptr()->type_arguments_, value.raw());
   }
 
-  virtual bool Equals(const Instance& other) const;
+  virtual bool CanonicalizeEquals(const Instance& other) const;
 
   virtual RawInstance* CheckAndCanonicalize(const char** error_str) const {
     UNREACHABLE();
@@ -6758,7 +6793,7 @@
   static RawJSRegExp* FromDataStartAddress(void* data);
   const char* Flags() const;
 
-  virtual bool Equals(const Instance& other) const;
+  virtual bool CanonicalizeEquals(const Instance& other) const;
 
   static const intptr_t kBytesPerElement = 1;
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
@@ -6868,7 +6903,7 @@
     ASSERT(t >= UserTags::kUserTagIdOffset);
     ASSERT(t < UserTags::kUserTagIdOffset + UserTags::kMaxUserTags);
     raw_ptr()->tag_ = t;
-  };
+  }
   static intptr_t tag_offset() { return OFFSET_OF(RawUserTag, tag_); }
 
   RawString* label() const {
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index f4c3c0e..5b547b5 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -207,4 +207,50 @@
   return size_total - size_excluding_class;
 }
 
+
+class RetainingPathVisitor : public ObjectGraph::Visitor {
+ public:
+  // We cannot use a GrowableObjectArray, since we must not trigger GC.
+  RetainingPathVisitor(RawObject* obj, const Array& path)
+      : obj_(obj), path_(path), length_(0) {
+    ASSERT(Isolate::Current()->no_gc_scope_depth() != 0);
+  }
+
+  intptr_t length() const { return length_; }
+
+  virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
+    if (it->Get() != obj_) {
+      return kProceed;
+    } else {
+      HANDLESCOPE(Isolate::Current());
+      Object& parent = Object::Handle();
+      for (length_ = 0; it->MoveToParent(); ++length_) {
+        if (!path_.IsNull() && length_ < path_.Length()) {
+          parent = it->Get();
+          path_.SetAt(length_, parent);
+        }
+      }
+      return kAbort;
+    }
+  }
+
+ private:
+  RawObject* obj_;
+  const Array& path_;
+  intptr_t length_;
+};
+
+
+intptr_t ObjectGraph::RetainingPath(Object* obj, const Array& path) {
+  NoGCScope no_gc_scope_;
+  // To break the trivial path, the handle 'obj' is temporarily cleared during
+  // the search, but restored before returning.
+  RawObject* raw = obj->raw();
+  *obj = Object::null();
+  RetainingPathVisitor visitor(raw, path);
+  IterateObjects(&visitor);
+  *obj = raw;
+  return visitor.length();
+}
+
 }  // namespace dart
diff --git a/runtime/vm/object_graph.h b/runtime/vm/object_graph.h
index 8547421..d7e60ef 100644
--- a/runtime/vm/object_graph.h
+++ b/runtime/vm/object_graph.h
@@ -68,6 +68,16 @@
   // The number of bytes retained by the set of all objects of the given class.
   intptr_t SizeRetainedByClass(intptr_t class_id);
 
+  // Finds some retaining path from the isolate roots to 'obj'. Populates the
+  // provided array, starting with a direct parent of 'obj', 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.
+  //
+  // 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
+  // provided handle was the only way to reach the object), zero is returned.
+  intptr_t RetainingPath(Object* obj, const Array& path);
+
  private:
   DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectGraph);
 };
diff --git a/runtime/vm/object_graph_test.cc b/runtime/vm/object_graph_test.cc
index 8ee5e66..de5a63e 100644
--- a/runtime/vm/object_graph_test.cc
+++ b/runtime/vm/object_graph_test.cc
@@ -91,6 +91,38 @@
     EXPECT_EQ(a_size + b_size + c_size + d_size,
               graph.SizeRetainedByInstance(a));
   }
+  {
+    // Get hold of c again.
+    b ^= a.At(0);
+    c ^= b.At(0);
+    b = Array::null();
+    ObjectGraph graph(isolate);
+    // A retaining path should end like this: c <- b <- a <- ...
+    // c itself is not included in the returned path and length.
+    {
+      HANDLESCOPE(isolate);
+      // Test null, empty, and length 1 array.
+      intptr_t null_length = graph.RetainingPath(&c, Object::null_array());
+      intptr_t empty_length = graph.RetainingPath(&c, Object::empty_array());
+      Array& path = Array::Handle(Array::New(1, Heap::kNew));
+      intptr_t one_length = graph.RetainingPath(&c, path);
+      EXPECT_EQ(null_length, empty_length);
+      EXPECT_EQ(null_length, one_length);
+      EXPECT_LE(2, null_length);
+    }
+    {
+      HANDLESCOPE(isolate);
+      Array& path = Array::Handle(Array::New(2, Heap::kNew));
+      intptr_t length = graph.RetainingPath(&c, path);
+      EXPECT_LE(2, length);
+      Array& expected_b = Array::Handle();
+      expected_b ^= path.At(0);
+      Array& expected_a = Array::Handle();
+      expected_a ^= path.At(1);
+      EXPECT(expected_b.raw() == a.At(0));
+      EXPECT(expected_a.raw() == a.raw());
+    }
+  }
 }
 
 }  // namespace dart
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 45cef4d..6058481 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -516,11 +516,18 @@
     const double dbl_const = 2.0;
     const Double& dbl1 = Double::Handle(Double::New(dbl_const));
     const Double& dbl2 = Double::Handle(Double::New(dbl_const));
-    EXPECT(dbl1.Equals(dbl2));
+    EXPECT(dbl1.OperatorEquals(dbl2));
+    EXPECT(dbl1.IsIdenticalTo(dbl2));
+    EXPECT(dbl1.CanonicalizeEquals(dbl2));
     const Double& dbl3 = Double::Handle(Double::New(3.3));
-    EXPECT(!dbl1.Equals(dbl3));
-    EXPECT(!dbl1.Equals(Smi::Handle(Smi::New(3))));
-    EXPECT(!dbl1.Equals(Double::Handle()));
+    EXPECT(!dbl1.OperatorEquals(dbl3));
+    EXPECT(!dbl1.OperatorEquals(Smi::Handle(Smi::New(3))));
+    EXPECT(!dbl1.OperatorEquals(Double::Handle()));
+    const Double& nan0 = Double::Handle(Double::New(NAN));
+    EXPECT(nan0.IsIdenticalTo(nan0));
+    EXPECT(nan0.CanonicalizeEquals(nan0));
+    EXPECT(!nan0.OperatorEquals(nan0));
+    // TODO(18738): Test bitwise different NaNs after agreement on spec.
   }
   {
     const String& dbl_str0 = String::Handle(String::New("bla"));
@@ -1838,16 +1845,16 @@
   other_array.SetAt(0, array);
   other_array.SetAt(2, array);
 
-  EXPECT(array.Equals(array));
-  EXPECT(array.Equals(other_array));
+  EXPECT(array.CanonicalizeEquals(array));
+  EXPECT(array.CanonicalizeEquals(other_array));
 
   other_array.SetAt(1, other_array);
-  EXPECT(!array.Equals(other_array));
+  EXPECT(!array.CanonicalizeEquals(other_array));
 
   other_array = Array::New(kArrayLen - 1);
   other_array.SetAt(0, array);
   other_array.SetAt(2, array);
-  EXPECT(!array.Equals(other_array));
+  EXPECT(!array.CanonicalizeEquals(other_array));
 
   EXPECT_EQ(0, Object::empty_array().Length());
 
@@ -3042,16 +3049,17 @@
       result,
       "Unhandled exception:\n"
       "MyException\n"
-      "#0      baz (dart:test-lib:2:3)\n"
-      "#1      globalVar= (dart:test-lib:12:7)\n"
-      "#2      _bar (dart:test-lib:16:3)\n"
-      "#3      MyClass.field (dart:test-lib:25:9)\n"
-      "#4      MyClass.foo.fooHelper (dart:test-lib:30:7)\n"
-      "#5      MyClass.foo (dart:test-lib:32:14)\n"
-      "#6      MyClass.MyClass.<anonymous closure> (dart:test-lib:21:15)\n"
-      "#7      MyClass.MyClass (dart:test-lib:21:18)\n"
-      "#8      main.<anonymous closure> (dart:test-lib:37:14)\n"
-      "#9      main (dart:test-lib:37:24)");
+      "#0      baz (test-lib:2:3)\n"
+      "#1      _OtherClass._OtherClass._named (test-lib:7:8)\n"
+      "#2      globalVar= (test-lib:12:7)\n"
+      "#3      _bar (test-lib:16:3)\n"
+      "#4      MyClass.field (test-lib:25:9)\n"
+      "#5      MyClass.foo.fooHelper (test-lib:30:7)\n"
+      "#6      MyClass.foo (test-lib:32:14)\n"
+      "#7      MyClass.MyClass.<anonymous closure> (test-lib:21:15)\n"
+      "#8      MyClass.MyClass (test-lib:21:18)\n"
+      "#9      main.<anonymous closure> (test-lib:37:14)\n"
+      "#10     main (test-lib:37:24)");
 }
 
 
@@ -3848,9 +3856,6 @@
 }
 
 
-// TODO(zra): Enable test when arm64 is ready.
-#if !defined(TARGET_ARCH_ARM64)
-
 TEST_CASE(FunctionWithBreakpointNotInlined) {
   const char* kScriptChars =
       "class A {\n"
@@ -3889,8 +3894,6 @@
   EXPECT(!func_b.IsInlineable());
 }
 
-#endif  // !defined(TARGET_ARCH_ARM64)
-
 
 TEST_CASE(SpecialClassesHaveEmptyArrays) {
   ObjectStore* object_store = Isolate::Current()->object_store();
@@ -4018,4 +4021,33 @@
   heap->IterateObjects(&verifier);
 }
 
+
+TEST_CASE(InstanceEquality) {
+  // Test that Instance::OperatorEquals can call a user-defined operator==.
+  const char* kScript =
+      "class A {\n"
+      "  bool operator==(A other) { return true; }\n"
+      "}\n"
+      "main() {\n"
+      "  A a = new A();\n"
+      "}";
+
+  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& clazz = Class::Handle(GetClass(lib, "A"));
+  EXPECT(!clazz.IsNull());
+  const Instance& a0 = Instance::Handle(Instance::New(clazz));
+  const Instance& a1 = Instance::Handle(Instance::New(clazz));
+  EXPECT(a0.raw() != a1.raw());
+  EXPECT(a0.OperatorEquals(a0));
+  EXPECT(a0.OperatorEquals(a1));
+  EXPECT(a0.IsIdenticalTo(a0));
+  EXPECT(!a0.IsIdenticalTo(a1));
+}
+
 }  // namespace dart
diff --git a/runtime/vm/os_android.cc b/runtime/vm/os_android.cc
index c78bda5..e0a742ba 100644
--- a/runtime/vm/os_android.cc
+++ b/runtime/vm/os_android.cc
@@ -35,7 +35,7 @@
     "Generate symbols of generated dart functions for debugging with GDB");
 DEFINE_FLAG(bool, generate_perf_events_symbols, false,
     "Generate events symbols for profiling with perf");
-DEFINE_FLAG(charp, generate_pprof_symbols, false,
+DEFINE_FLAG(charp, generate_pprof_symbols, NULL,
     "Generate events symbols for profiling with pprof");
 
 class PerfCodeObserver : public CodeObserver {
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index b019d06..4e61823 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -810,7 +810,7 @@
       if (!func.IsImplicitConstructor()) {
         parser.SkipFunctionPreamble();
       }
-      node_sequence = parser.ParseFunc(func, default_parameter_values);
+      node_sequence = parser.ParseFunc(func, &default_parameter_values);
       break;
     case RawFunction::kImplicitGetter:
       ASSERT(!func.is_static());
@@ -833,11 +833,11 @@
       break;
     case RawFunction::kNoSuchMethodDispatcher:
       node_sequence =
-          parser.ParseNoSuchMethodDispatcher(func, default_parameter_values);
+          parser.ParseNoSuchMethodDispatcher(func, &default_parameter_values);
       break;
     case RawFunction::kInvokeFieldDispatcher:
       node_sequence =
-          parser.ParseInvokeFieldDispatcher(func, default_parameter_values);
+          parser.ParseInvokeFieldDispatcher(func, &default_parameter_values);
       break;
     default:
       UNREACHABLE();
@@ -1301,7 +1301,7 @@
 
 void Parser::BuildDispatcherScope(const Function& func,
                                   const ArgumentsDescriptor& desc,
-                                  Array& default_values) {
+                                  Array* default_values) {
   ParamList params;
   // Receiver first.
   intptr_t token_pos = func.token_pos();
@@ -1340,7 +1340,7 @@
 }
 
 SequenceNode* Parser::ParseNoSuchMethodDispatcher(const Function& func,
-                                                  Array& default_values) {
+                                                  Array* default_values) {
   TRACE_PARSER("ParseNoSuchMethodDispatcher");
 
   ASSERT(func.IsNoSuchMethodDispatcher());
@@ -1385,7 +1385,7 @@
 
 
 SequenceNode* Parser::ParseInvokeFieldDispatcher(const Function& func,
-                                                 Array& default_values) {
+                                                 Array* default_values) {
   TRACE_PARSER("ParseInvokeFieldDispatcher");
 
   ASSERT(func.IsInvokeFieldDispatcher());
@@ -2476,13 +2476,13 @@
 
   LocalVariable* receiver = new LocalVariable(
       Scanner::kNoSourcePos, Symbols::This(), *ReceiverType(current_class()));
-  current_block_->scope->AddVariable(receiver);
+  current_block_->scope->InsertParameterAt(0, receiver);
 
   LocalVariable* phase_parameter =
       new LocalVariable(Scanner::kNoSourcePos,
                         Symbols::PhaseParameter(),
                         Type::ZoneHandle(Type::SmiType()));
-  current_block_->scope->AddVariable(phase_parameter);
+  current_block_->scope->InsertParameterAt(1, phase_parameter);
 
   // Parse expressions of instance fields that have an explicit
   // initializer expression.
@@ -2523,7 +2523,7 @@
           Scanner::kNoSourcePos,
           String::ZoneHandle(func.ParameterNameAt(i)),
           Type::ZoneHandle(Type::DynamicType()));
-      current_block_->scope->AddVariable(param);
+      current_block_->scope->InsertParameterAt(i, param);
       forwarding_args->Add(new LoadLocalNode(Scanner::kNoSourcePos, param));
     }
   }
@@ -2561,7 +2561,7 @@
 // Parser is at the opening parenthesis of the formal parameter declaration
 // of function. Parse the formal parameters, initializers and code.
 SequenceNode* Parser::ParseConstructor(const Function& func,
-                                       Array& default_parameter_values) {
+                                       Array* default_parameter_values) {
   TRACE_PARSER("ParseConstructor");
   ASSERT(func.IsConstructor());
   ASSERT(!func.IsFactory());
@@ -2853,7 +2853,7 @@
 // declaration of the function or constructor.
 // Parse the formal parameters and code.
 SequenceNode* Parser::ParseFunc(const Function& func,
-                                Array& default_parameter_values) {
+                                Array* default_parameter_values) {
   TRACE_PARSER("ParseFunc");
   Function& saved_innermost_function =
       Function::Handle(innermost_function().raw());
@@ -4047,12 +4047,10 @@
   const bool need_implicit_constructor =
       !members.has_constructor() && !cls.is_patch();
 
-  Array& array = Array::Handle();
-  array = Array::MakeArray(members.fields());
-  cls.SetFields(array);
+  cls.AddFields(members.fields());
 
   // Creating a new array for functions marks the class as parsed.
-  array = Array::MakeArray(members.functions());
+  const Array& array = Array::Handle(Array::MakeArray(members.functions()));
   cls.SetFunctions(array);
 
   // Add an implicit constructor if no explicit constructor is present.
@@ -5064,16 +5062,13 @@
   // Lookup the library URL.
   Library& library = Library::Handle(Library::LookupLibrary(canon_url));
   if (library.IsNull()) {
+    // Create an empty library to mark that we have initiated loading of this
+    // library.
+    library = Library::New(canon_url);
+    library.Register();
     // Call the library tag handler to load the library.
     // TODO(hausner): do not load eagerly if import is deferred.
     CallLibraryTagHandler(Dart_kImportTag, import_pos, canon_url);
-    // If the library tag handler succeded without registering the
-    // library we create an empty library to import.
-    library = Library::LookupLibrary(canon_url);
-    if (library.IsNull()) {
-      library = Library::New(canon_url);
-      library.Register();
-    }
   }
 
   Namespace& ns =
@@ -5260,12 +5255,9 @@
     }
   }
   if ((top_level.fields.Length() > 0) || (top_level.functions.Length() > 0)) {
-    Array& array = Array::Handle();
+    toplevel_class.AddFields(top_level.fields);
 
-    array = Array::MakeArray(top_level.fields);
-    toplevel_class.SetFields(array);
-
-    array = Array::MakeArray(top_level.functions);
+    const Array& array = Array::Handle(Array::MakeArray(top_level.functions));
     toplevel_class.SetFunctions(array);
 
     library_.AddAnonymousClass(toplevel_class);
@@ -5340,15 +5332,15 @@
 
 // Set up default values for all optional parameters to the function.
 void Parser::SetupDefaultsForOptionalParams(const ParamList* params,
-                                            Array& default_values) {
+                                            Array* default_values) {
   if (params->num_optional_parameters > 0) {
     // Build array of default parameter values.
     ParamDesc* param =
       params->parameters->data() + params->num_fixed_parameters;
-    default_values = Array::New(params->num_optional_parameters);
+    *default_values = Array::New(params->num_optional_parameters);
     for (int i = 0; i < params->num_optional_parameters; i++) {
       ASSERT(param->default_value != NULL);
-      default_values.SetAt(i, *param->default_value);
+      default_values->SetAt(i, *param->default_value);
       param++;
     }
   }
@@ -5401,7 +5393,7 @@
     const String* name = param_desc.name;
     LocalVariable* parameter = new LocalVariable(
         param_desc.name_pos, *name, *param_desc.type);
-    if (!scope->AddVariable(parameter)) {
+    if (!scope->InsertParameterAt(i, parameter)) {
       ErrorMsg(param_desc.name_pos,
                "name '%s' already exists in scope",
                param_desc.name->ToCString());
@@ -5774,7 +5766,7 @@
   // Parse the local function.
   Array& default_parameter_values = Array::Handle();
   SequenceNode* statements = Parser::ParseFunc(function,
-                                               default_parameter_values);
+                                               &default_parameter_values);
 
   // Now that the local function has formal parameters, lookup the signature
   // class in the current library (but not in its imports) and only create a new
@@ -9005,6 +8997,7 @@
                          String::Handle(field.name()).ToCString());
         } else {
           isolate()->long_jump_base()->Jump(1, error);
+          UNREACHABLE();
         }
       }
       ASSERT(const_value.IsNull() || const_value.IsInstance());
@@ -9501,7 +9494,7 @@
 
 
 void Parser::CheckConstructorCallTypeArguments(
-    intptr_t pos, Function& constructor,
+    intptr_t pos, const Function& constructor,
     const TypeArguments& type_arguments) {
   if (!type_arguments.IsNull()) {
     const Class& constructor_class = Class::Handle(constructor.Owner());
@@ -10300,14 +10293,16 @@
   interpolate_arg.SetAt(0, value_arr);
 
   // Call interpolation function.
-  String& concatenated = String::ZoneHandle(isolate());
+  Object& result = Object::Handle(isolate());
   {
     PAUSETIMERSCOPE(isolate(), time_compilation);
-    concatenated ^= DartEntry::InvokeFunction(func, interpolate_arg);
+    result = DartEntry::InvokeFunction(func, interpolate_arg);
   }
-  if (concatenated.IsUnhandledException()) {
-    ErrorMsg("Exception thrown in Parser::Interpolate");
+  if (result.IsUnhandledException()) {
+    ErrorMsg("%s", Error::Cast(result).ToErrorCString());
   }
+  String& concatenated = String::ZoneHandle(isolate());
+  concatenated ^= result.raw();
   concatenated = Symbols::New(concatenated);
   return concatenated;
 }
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index ab5bdb4..8b94b40 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -291,7 +291,7 @@
   void SkipFunctionPreamble();
 
   void CheckConstructorCallTypeArguments(intptr_t pos,
-                                         Function& constructor,
+                                         const Function& constructor,
                                          const TypeArguments& type_arguments);
 
   // A null script means no source and a negative token_pos means no position.
@@ -436,7 +436,7 @@
   AstNode* BuildUnarySuperOperator(Token::Kind op, PrimaryNode* super);
 
   static void SetupDefaultsForOptionalParams(const ParamList* params,
-                                             Array& default_values);
+                                             Array* default_values);
   ClosureNode* CreateImplicitClosureNode(const Function& func,
                                          intptr_t token_pos,
                                          AstNode* receiver);
@@ -445,9 +445,9 @@
   void AddFormalParamsToScope(const ParamList* params, LocalScope* scope);
 
   SequenceNode* ParseConstructor(const Function& func,
-                                 Array& default_parameter_values);
+                                 Array* default_parameter_values);
   SequenceNode* ParseFunc(const Function& func,
-                          Array& default_parameter_values);
+                          Array* default_parameter_values);
 
   void ParseNativeFunctionBlock(const ParamList* params, const Function& func);
 
@@ -457,12 +457,12 @@
   SequenceNode* ParseStaticInitializer(const Function& func);
   SequenceNode* ParseMethodExtractor(const Function& func);
   SequenceNode* ParseNoSuchMethodDispatcher(const Function& func,
-                                            Array& default_values);
+                                            Array* default_values);
   SequenceNode* ParseInvokeFieldDispatcher(const Function& func,
-                                           Array& default_values);
+                                           Array* default_values);
   void BuildDispatcherScope(const Function& func,
                             const ArgumentsDescriptor& desc,
-                            Array& default_values);
+                            Array* default_values);
 
   void ChainNewBlock(LocalScope* outer_scope);
   void OpenBlock();
diff --git a/runtime/vm/parser_test.cc b/runtime/vm/parser_test.cc
index e509383..499b8fd 100644
--- a/runtime/vm/parser_test.cc
+++ b/runtime/vm/parser_test.cc
@@ -166,9 +166,6 @@
 }
 
 
-// TODO(zra): Remove after porting relevant arm64 features.
-#if !defined(TARGET_ARCH_ARM64)
-
 const char* saved_vars = NULL;
 
 
@@ -542,6 +539,5 @@
       " 3 StackVar      scope=2   begin=11  end=76  name=b\n",
       CaptureVarsAtLine(lib, "a", 10));
 }
-#endif
 
 }  // namespace dart
diff --git a/runtime/vm/runtime_entry_arm64.cc b/runtime/vm/runtime_entry_arm64.cc
index 3fee7be..8beb911 100644
--- a/runtime/vm/runtime_entry_arm64.cc
+++ b/runtime/vm/runtime_entry_arm64.cc
@@ -40,12 +40,12 @@
   if (is_leaf()) {
     ASSERT(argument_count == this->argument_count());
     ExternalLabel label(name(), entry);
-    __ BranchLink(&label, PP);
+    __ BranchLink(&label, kNoPP);
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
-    __ LoadImmediate(R5, entry, kNoRegister);
-    __ LoadImmediate(R4, argument_count, kNoRegister);
+    __ LoadImmediate(R5, entry, kNoPP);
+    __ LoadImmediate(R4, argument_count, kNoPP);
     __ BranchLink(&StubCode::CallToRuntimeLabel(), PP);
   }
 }
diff --git a/runtime/vm/scanner.cc b/runtime/vm/scanner.cc
index 761c0c1..ceef56d 100644
--- a/runtime/vm/scanner.cc
+++ b/runtime/vm/scanner.cc
@@ -369,9 +369,10 @@
   }
   if (current_token_.kind != Token::kILLEGAL) {
     intptr_t len = lookahead_pos_ - token_start_;
-    current_token_.literal =
-        &String::ZoneHandle(
-            String::SubString(source_, token_start_, len, Heap::kOld));
+    String& str = String::ZoneHandle(
+        String::SubString(source_, token_start_, len, Heap::kOld));
+    str = Symbols::New(str);
+    current_token_.literal = &str;
   }
 }
 
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index b6a6064..d9f2df1 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -66,6 +66,19 @@
 }
 
 
+bool LocalScope::InsertParameterAt(intptr_t pos, LocalVariable* parameter) {
+  ASSERT(parameter != NULL);
+  if (LocalLookupVariable(parameter->name()) != NULL) {
+    return false;
+  }
+  variables_.InsertAt(pos, parameter);
+  // InsertParameterAt is not used to add aliases of parameters.
+  ASSERT(parameter->owner() == NULL);
+  parameter->set_owner(this);
+  return true;
+}
+
+
 bool LocalScope::AddLabel(SourceLabel* label) {
   if (LocalLookupLabel(label->name()) != NULL) {
     return false;
@@ -171,6 +184,10 @@
   while (pos < num_parameters) {
     LocalVariable* parameter = VariableAt(pos);
     pos++;
+    // Parsing formal parameter default values may add local variable aliases
+    // to the local scope before the formal parameters are added. However,
+    // the parameters get inserted in front of the aliases, therefore, no
+    // aliases can be encountered among the first num_parameters variables.
     ASSERT(parameter->owner() == this);
     if (parameter->is_captured()) {
       // A captured parameter has a slot allocated in the frame and one in the
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index 6bd93ac..6cb2030 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -234,6 +234,11 @@
   // same name is already present.
   bool AddVariable(LocalVariable* variable);
 
+  // Insert a formal parameter variable to the scope at the given position,
+  // possibly in front of aliases already added with AddVariable.
+  // Returns false if a variable with the same name is already present.
+  bool InsertParameterAt(intptr_t pos, LocalVariable* parameter);
+
   // Add a label to the scope. Returns false if a label with the same name
   // is already present.
   bool AddLabel(SourceLabel* label);
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 5b3f778..41c3ff5 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -1391,6 +1391,34 @@
 }
 
 
+static bool HandleDebugResume(Isolate* isolate, JSONStream* js) {
+  if (isolate->message_handler()->paused_on_start()) {
+    isolate->message_handler()->set_pause_on_start(false);
+    JSONObject jsobj(js);
+    jsobj.AddProperty("type", "Success");
+    jsobj.AddProperty("id", "");
+    return true;
+  }
+  if (isolate->message_handler()->paused_on_exit()) {
+    isolate->message_handler()->set_pause_on_exit(false);
+    JSONObject jsobj(js);
+    jsobj.AddProperty("type", "Success");
+    jsobj.AddProperty("id", "");
+    return true;
+  }
+  if (isolate->debugger()->PauseEvent() != NULL) {
+    isolate->Resume();
+    JSONObject jsobj(js);
+    jsobj.AddProperty("type", "Success");
+    jsobj.AddProperty("id", "");
+    return true;
+  }
+
+  PrintError(js, "VM was not paused");
+  return true;
+}
+
+
 static bool HandleDebug(Isolate* isolate, JSONStream* js) {
   if (js->num_arguments() == 1) {
     PrintError(js, "Must specify a subcommand");
@@ -1423,6 +1451,25 @@
       PrintError(js, "Command too long");
       return true;
     }
+  } else if (strcmp(command, "pause") == 0) {
+    if (js->num_arguments() == 2) {
+      // TODO(turnidge): Don't double-interrupt the isolate here.
+      isolate->ScheduleInterrupts(Isolate::kApiInterrupt);
+      JSONObject jsobj(js);
+      jsobj.AddProperty("type", "Success");
+      jsobj.AddProperty("id", "");
+      return true;
+    } else {
+      PrintError(js, "Command too long");
+      return true;
+    }
+  } else if (strcmp(command, "resume") == 0) {
+    if (js->num_arguments() == 2) {
+      return HandleDebugResume(isolate, js);
+    } else {
+      PrintError(js, "Command too long");
+      return true;
+    }
   } else {
     PrintError(js, "Unrecognized subcommand '%s'", js->GetArgument(1));
     return true;
@@ -1575,27 +1622,6 @@
 }
 
 
-static bool HandleResume(Isolate* isolate, JSONStream* js) {
-  if (isolate->message_handler()->pause_on_start()) {
-    isolate->message_handler()->set_pause_on_start(false);
-    JSONObject jsobj(js);
-    jsobj.AddProperty("type", "Success");
-    jsobj.AddProperty("id", "");
-    return true;
-  }
-  if (isolate->message_handler()->pause_on_exit()) {
-    isolate->message_handler()->set_pause_on_exit(false);
-    JSONObject jsobj(js);
-    jsobj.AddProperty("type", "Success");
-    jsobj.AddProperty("id", "");
-    return true;
-  }
-
-  PrintError(js, "VM was not paused");
-  return true;
-}
-
-
 static bool HandleTypeArguments(Isolate* isolate, JSONStream* js) {
   ObjectStore* object_store = isolate->object_store();
   const Array& table = Array::Handle(object_store->canonical_type_arguments());
@@ -1730,7 +1756,6 @@
   { "libraries", HandleLibraries },
   { "objects", HandleObjects },
   { "profile", HandleProfile },
-  { "resume", HandleResume },
   { "scripts", HandleScripts },
   { "stacktrace", HandleStackTrace },
   { "typearguments", HandleTypeArguments },
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 2001ff5..812ce09 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -279,7 +279,7 @@
           "\"type\":\"Breakpoint\",\"id\":1,\"enabled\":true,"
           "\"resolved\":false,"
           "\"location\":{\"type\":\"Location\","
-                        "\"script\":\"dart:test-lib\",\"tokenPos\":5}}]}",
+                        "\"script\":\"test-lib\",\"tokenPos\":5}}]}",
       handler.msg());
 
   // Individual breakpoint.
@@ -290,7 +290,7 @@
       "{\"type\":\"Breakpoint\",\"id\":1,\"enabled\":true,"
        "\"resolved\":false,"
        "\"location\":{\"type\":\"Location\","
-                     "\"script\":\"dart:test-lib\",\"tokenPos\":5}}",
+                     "\"script\":\"test-lib\",\"tokenPos\":5}}",
       handler.msg());
 
   // Missing sub-command.
@@ -606,7 +606,7 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Library\"", handler.msg());
-  EXPECT_SUBSTRING("\"url\":\"dart:test-lib\"", handler.msg());
+  EXPECT_SUBSTRING("\"url\":\"test-lib\"", handler.msg());
 
   // Evaluate an expression from a library.
   service_msg = EvalF(h_lib,
@@ -1058,12 +1058,12 @@
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
   Instance& service_msg = Instance::Handle();
-  service_msg = Eval(h_lib, "[port, ['scripts', 'dart:test-lib'], [], []]");
+  service_msg = Eval(h_lib, "[port, ['scripts', 'test-lib'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
-      "{\"type\":\"Script\",\"id\":\"scripts\\/dart%3Atest-lib\","
-       "\"name\":\"dart:test-lib\",\"user_name\":\"dart:test-lib\","
+      "{\"type\":\"Script\",\"id\":\"scripts\\/test-lib\","
+       "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
        "\"kind\":\"script\","
        "\"source\":\"var port;\\n\\nmain() {\\n}\","
        "\"tokenPosTable\":[[1,0,1,1,5,2,9],[3,5,1,6,5,7,6,8,8],[4,10,1]]}",
@@ -1105,9 +1105,9 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING(
-      "{\"source\":\"dart:test-lib\",\"script\":{"
-      "\"type\":\"@Script\",\"id\":\"scripts\\/dart%3Atest-lib\","
-      "\"name\":\"dart:test-lib\",\"user_name\":\"dart:test-lib\","
+      "{\"source\":\"test-lib\",\"script\":{"
+      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
       "\"kind\":\"script\"},\"hits\":"
       "[5,1,6,1]}", handler.msg());
 }
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 7d11cdd..871bf2c 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -676,58 +676,7 @@
 }
 
 
-// Synchronization primitives support.
-Mutex* Simulator::exclusive_access_lock_ = NULL;
-Simulator::AddressTag Simulator::exclusive_access_state_[kNumAddressTags];
-int Simulator::next_address_tag_;
-
-
-void Simulator::SetExclusiveAccess(uword addr) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate != NULL);
-  int i = 0;
-  while ((i < kNumAddressTags) &&
-         (exclusive_access_state_[i].isolate != isolate)) {
-    i++;
-  }
-  if (i == kNumAddressTags) {
-    i = next_address_tag_;
-    if (++next_address_tag_ == kNumAddressTags) next_address_tag_ = 0;
-    exclusive_access_state_[i].isolate = isolate;
-  }
-  exclusive_access_state_[i].addr = addr;
-}
-
-
-bool Simulator::HasExclusiveAccessAndOpen(uword addr) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate != NULL);
-  bool result = false;
-  for (int i = 0; i < kNumAddressTags; i++) {
-    if (exclusive_access_state_[i].isolate == isolate) {
-      if (exclusive_access_state_[i].addr == addr) {
-        result = true;
-      }
-      exclusive_access_state_[i].addr = NULL;
-      continue;
-    }
-    if (exclusive_access_state_[i].addr == addr) {
-      exclusive_access_state_[i].addr = NULL;
-    }
-  }
-  return result;
-}
-
-
-void Simulator::InitOnce() {
-  // Setup exclusive access state.
-  exclusive_access_lock_ = new Mutex();
-  for (int i = 0; i < kNumAddressTags; i++) {
-    exclusive_access_state_[i].isolate = NULL;
-    exclusive_access_state_[i].addr = NULL;
-  }
-  next_address_tag_ = 0;
-}
+void Simulator::InitOnce() {}
 
 
 Simulator::Simulator() {
@@ -907,30 +856,35 @@
 
 // Accessors for VFP register state.
 void Simulator::set_sregister(SRegister reg, float value) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfSRegisters));
   sregisters_[reg] = bit_cast<int32_t, float>(value);
 }
 
 
 float Simulator::get_sregister(SRegister reg) const {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfSRegisters));
   return bit_cast<float, int32_t>(sregisters_[reg]);
 }
 
 
 void Simulator::set_dregister(DRegister reg, double value) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfDRegisters));
   dregisters_[reg] = bit_cast<int64_t, double>(value);
 }
 
 
 double Simulator::get_dregister(DRegister reg) const {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfDRegisters));
   return bit_cast<double, int64_t>(dregisters_[reg]);
 }
 
 
 void Simulator::set_qregister(QRegister reg, const simd_value_t& value) {
+  ASSERT(TargetCPUFeatures::neon_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfQRegisters));
   qregisters_[reg].data_[0] = value.data_[0];
   qregisters_[reg].data_[1] = value.data_[1];
@@ -940,6 +894,7 @@
 
 
 void Simulator::get_qregister(QRegister reg, simd_value_t* value) const {
+  ASSERT(TargetCPUFeatures::neon_supported());
   // TODO(zra): Replace this test with an assert after we support
   // 16 Q registers.
   if ((reg >= 0) && (reg < kNumberOfQRegisters)) {
@@ -949,24 +904,28 @@
 
 
 void Simulator::set_sregister_bits(SRegister reg, int32_t value) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfSRegisters));
   sregisters_[reg] = value;
 }
 
 
 int32_t Simulator::get_sregister_bits(SRegister reg) const {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfSRegisters));
   return sregisters_[reg];
 }
 
 
 void Simulator::set_dregister_bits(DRegister reg, int64_t value) {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfDRegisters));
   dregisters_[reg] = value;
 }
 
 
 int64_t Simulator::get_dregister_bits(DRegister reg) const {
+  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfDRegisters));
   return dregisters_[reg];
 }
@@ -1101,53 +1060,6 @@
 }
 
 
-// Synchronization primitives support.
-void Simulator::ClearExclusive() {
-  // This lock is initialized in Simulator::InitOnce().
-  MutexLocker ml(exclusive_access_lock_);
-  // Set exclusive access to open state for this isolate.
-  HasExclusiveAccessAndOpen(NULL);
-}
-
-
-intptr_t Simulator::ReadExclusiveW(uword addr, Instr* instr) {
-  // This lock is initialized in Simulator::InitOnce().
-  MutexLocker ml(exclusive_access_lock_);
-  SetExclusiveAccess(addr);
-  return ReadW(addr, instr);
-}
-
-
-intptr_t Simulator::WriteExclusiveW(uword addr, intptr_t value, Instr* instr) {
-  // This lock is initialized in Simulator::InitOnce().
-  MutexLocker ml(exclusive_access_lock_);
-  bool write_allowed = HasExclusiveAccessAndOpen(addr);
-  if (write_allowed) {
-    WriteW(addr, value, instr);
-    return 0;  // Success.
-  }
-  return 1;  // Failure.
-}
-
-
-uword Simulator::CompareExchange(uword* address,
-                                 uword compare_value,
-                                 uword new_value) {
-  // This lock is initialized in Simulator::InitOnce().
-  MutexLocker ml(exclusive_access_lock_);
-  uword value = *address;
-  if (value == compare_value) {
-    *address = new_value;
-    // Same effect on exclusive access state as a successful STREX.
-    HasExclusiveAccessAndOpen(reinterpret_cast<uword>(address));
-  } else {
-    // Same effect on exclusive access state as an LDREX.
-    SetExclusiveAccess(reinterpret_cast<uword>(address));
-  }
-  return value;
-}
-
-
 // Returns the top of the stack area to enable checking for stack pointer
 // validity.
 uword Simulator::StackTop() const {
@@ -1546,31 +1458,31 @@
                  (redirection->argument_count() <= 2));
           SimulatorLeafFloatRuntimeCall target =
               reinterpret_cast<SimulatorLeafFloatRuntimeCall>(external);
-#if defined(ARM_FLOAT_ABI_HARD)
-          // If we're doing "hardfp", the double arguments are already in the
-          // floating point registers.
-          double d0 = get_dregister(D0);
-          double d1 = get_dregister(D1);
-          d0 = target(d0, d1);
-          set_dregister(D0, d0);
-#else
-          // If we're not doing "hardfp", we must be doing "soft" or "softfp",
-          // So take the double arguments from the integer registers.
-          uint32_t r0 = get_register(R0);
-          int32_t r1 = get_register(R1);
-          uint32_t r2 = get_register(R2);
-          int32_t r3 = get_register(R3);
-          int64_t a0 = Utils::LowHighTo64Bits(r0, r1);
-          int64_t a1 = Utils::LowHighTo64Bits(r2, r3);
-          double d0 = bit_cast<double, int64_t>(a0);
-          double d1 = bit_cast<double, int64_t>(a1);
-          d0 = target(d0, d1);
-          a0 = bit_cast<int64_t, double>(d0);
-          r0 = Utils::Low32Bits(a0);
-          r1 = Utils::High32Bits(a0);
-          set_register(R0, r0);
-          set_register(R1, r1);
-#endif
+          if (TargetCPUFeatures::hardfp_supported()) {
+            // If we're doing "hardfp", the double arguments are already in the
+            // floating point registers.
+            double d0 = get_dregister(D0);
+            double d1 = get_dregister(D1);
+            d0 = target(d0, d1);
+            set_dregister(D0, d0);
+          } else {
+            // If we're not doing "hardfp", we must be doing "soft" or "softfp",
+            // So take the double arguments from the integer registers.
+            uint32_t r0 = get_register(R0);
+            int32_t r1 = get_register(R1);
+            uint32_t r2 = get_register(R2);
+            int32_t r3 = get_register(R3);
+            int64_t a0 = Utils::LowHighTo64Bits(r0, r1);
+            int64_t a1 = Utils::LowHighTo64Bits(r2, r3);
+            double d0 = bit_cast<double, int64_t>(a0);
+            double d1 = bit_cast<double, int64_t>(a1);
+            d0 = target(d0, d1);
+            a0 = bit_cast<int64_t, double>(d0);
+            r0 = Utils::Low32Bits(a0);
+            r1 = Utils::High32Bits(a0);
+            set_register(R0, r0);
+            set_register(R1, r1);
+          }
         } else if (redirection->call_kind() == kBootstrapNativeCall) {
           NativeArguments* arguments;
           arguments = reinterpret_cast<NativeArguments*>(get_register(R0));
@@ -1597,18 +1509,20 @@
         set_register(R3, icount_);
         set_register(IP, icount_);
         set_register(LR, icount_);
-        double zap_dvalue = static_cast<double>(icount_);
-        // Do not zap D0, as it may contain a float result.
-        for (int i = D1; i <= D7; i++) {
-          set_dregister(static_cast<DRegister>(i), zap_dvalue);
+        if (TargetCPUFeatures::vfp_supported()) {
+          double zap_dvalue = static_cast<double>(icount_);
+          // Do not zap D0, as it may contain a float result.
+          for (int i = D1; i <= D7; i++) {
+            set_dregister(static_cast<DRegister>(i), zap_dvalue);
+          }
+          // The above loop also zaps overlapping registers S2-S15.
+          // Registers D8-D15 (overlapping with S16-S31) are preserved.
+#if defined(VFPv3_D32)
+          for (int i = D16; i <= D31; i++) {
+            set_dregister(static_cast<DRegister>(i), zap_dvalue);
+          }
+#endif
         }
-        // The above loop also zaps overlapping registers S2-S15.
-        // Registers D8-D15 (overlapping with S16-S31) are preserved.
-#ifdef VFPv3_D32
-        for (int i = D16; i <= D31; i++) {
-          set_dregister(static_cast<DRegister>(i), zap_dvalue);
-        }
-#endif  // VFPv3_D32
 
         // Return.
         set_pc(saved_lr);
@@ -1715,6 +1629,12 @@
       }
     } else if (instr->IsMultiplyOrSyncPrimitive()) {
       if (instr->Bit(24) == 0) {
+        if ((TargetCPUFeatures::arm_version() != ARMv7) &&
+            (instr->Bits(21, 3) != 0)) {
+          // mla ... smlal only supported on armv7.
+          UnimplementedInstruction(instr);
+          return;
+        }
         // multiply instructions.
         Register rn = instr->RnField();
         Register rd = instr->RdField();
@@ -1820,49 +1740,25 @@
           }
         }
       } else {
-        // synchronization primitives
-        Register rd = instr->RdField();
-        Register rn = instr->RnField();
-        uword addr = get_register(rn);
-        switch (instr->Bits(20, 4)) {
-          case 8: {
-            // Format(instr, "strex'cond 'rd, 'rm, ['rn]");
-            if (IsIllegalAddress(addr)) {
-              HandleIllegalAccess(addr, instr);
-            } else {
-              Register rm = instr->RmField();
-              set_register(rd, WriteExclusiveW(addr, get_register(rm), instr));
-            }
-            break;
-          }
-          case 9: {
-            // Format(instr, "ldrex'cond 'rd, ['rn]");
-            if (IsIllegalAddress(addr)) {
-              HandleIllegalAccess(addr, instr);
-            } else {
-              set_register(rd, ReadExclusiveW(addr, instr));
-            }
-            break;
-          }
-          default: {
-            UnimplementedInstruction(instr);
-            break;
-          }
-        }
+        UnimplementedInstruction(instr);
       }
     } else if (instr->Bit(25) == 1) {
       // 16-bit immediate loads, msr (immediate), and hints
       switch (instr->Bits(20, 5)) {
         case 16:
         case 20: {
-          uint16_t imm16 = instr->MovwField();
-          Register rd = instr->RdField();
-          if (instr->Bit(22) == 0) {
-            // Format(instr, "movw'cond 'rd, #'imm4_12");
-            set_register(rd, imm16);
+          if (TargetCPUFeatures::arm_version() == ARMv7) {
+            uint16_t imm16 = instr->MovwField();
+            Register rd = instr->RdField();
+            if (instr->Bit(22) == 0) {
+              // Format(instr, "movw'cond 'rd, #'imm4_12");
+              set_register(rd, imm16);
+            } else {
+              // Format(instr, "movt'cond 'rd, #'imm4_12");
+              set_register(rd, (get_register(rd) & 0xffff) | (imm16 << 16));
+            }
           } else {
-            // Format(instr, "movt'cond 'rd, #'imm4_12");
-            set_register(rd, (get_register(rd) & 0xffff) | (imm16 << 16));
+            UnimplementedInstruction(instr);
           }
           break;
         }
@@ -2304,10 +2200,14 @@
 
 
 void Simulator::DoDivision(Instr* instr) {
-  ASSERT(TargetCPUFeatures::integer_division_supported());
-  Register rd = instr->DivRdField();
-  Register rn = instr->DivRnField();
-  Register rm = instr->DivRmField();
+  const Register rd = instr->DivRdField();
+  const Register rn = instr->DivRnField();
+  const Register rm = instr->DivRmField();
+
+  if (!TargetCPUFeatures::integer_division_supported()) {
+    UnimplementedInstruction(instr);
+    return;
+  }
 
   // ARMv7-a does not trap on divide-by-zero. The destination register is just
   // set to 0.
@@ -3539,7 +3439,7 @@
   if (instr->ConditionField() == kSpecialCondition) {
     if (instr->InstructionBits() == static_cast<int32_t>(0xf57ff01f)) {
       // Format(instr, "clrex");
-      ClearExclusive();
+      UnimplementedInstruction(instr);
     } else {
       if (instr->IsSIMDDataProcessing()) {
         DecodeSIMDDataProcessing(instr);
@@ -3645,6 +3545,7 @@
 
   // Setup parameters.
   if (fp_args) {
+    ASSERT(TargetCPUFeatures::vfp_supported());
     set_sregister(S0, bit_cast<float, int32_t>(parameter0));
     set_sregister(S1, bit_cast<float, int32_t>(parameter1));
     set_sregister(S2, bit_cast<float, int32_t>(parameter2));
@@ -3683,14 +3584,25 @@
   int32_t r10_val = get_register(R10);
   int32_t r11_val = get_register(R11);
 
-  double d8_val = get_dregister(D8);
-  double d9_val = get_dregister(D9);
-  double d10_val = get_dregister(D10);
-  double d11_val = get_dregister(D11);
-  double d12_val = get_dregister(D12);
-  double d13_val = get_dregister(D13);
-  double d14_val = get_dregister(D14);
-  double d15_val = get_dregister(D15);
+  double d8_val = 0.0;
+  double d9_val = 0.0;
+  double d10_val = 0.0;
+  double d11_val = 0.0;
+  double d12_val = 0.0;
+  double d13_val = 0.0;
+  double d14_val = 0.0;
+  double d15_val = 0.0;
+
+  if (TargetCPUFeatures::vfp_supported()) {
+    d8_val = get_dregister(D8);
+    d9_val = get_dregister(D9);
+    d10_val = get_dregister(D10);
+    d11_val = get_dregister(D11);
+    d12_val = get_dregister(D12);
+    d13_val = get_dregister(D13);
+    d14_val = get_dregister(D14);
+    d15_val = get_dregister(D15);
+  }
 
   // Setup the callee-saved registers with a known value. To be able to check
   // that they are preserved properly across dart execution.
@@ -3704,15 +3616,18 @@
   set_register(R10, callee_saved_value);
   set_register(R11, callee_saved_value);
 
-  double callee_saved_dvalue = static_cast<double>(icount_);
-  set_dregister(D8, callee_saved_dvalue);
-  set_dregister(D9, callee_saved_dvalue);
-  set_dregister(D10, callee_saved_dvalue);
-  set_dregister(D11, callee_saved_dvalue);
-  set_dregister(D12, callee_saved_dvalue);
-  set_dregister(D13, callee_saved_dvalue);
-  set_dregister(D14, callee_saved_dvalue);
-  set_dregister(D15, callee_saved_dvalue);
+  double callee_saved_dvalue = 0.0;
+  if (TargetCPUFeatures::vfp_supported()) {
+    callee_saved_dvalue = static_cast<double>(icount_);
+    set_dregister(D8, callee_saved_dvalue);
+    set_dregister(D9, callee_saved_dvalue);
+    set_dregister(D10, callee_saved_dvalue);
+    set_dregister(D11, callee_saved_dvalue);
+    set_dregister(D12, callee_saved_dvalue);
+    set_dregister(D13, callee_saved_dvalue);
+    set_dregister(D14, callee_saved_dvalue);
+    set_dregister(D15, callee_saved_dvalue);
+  }
 
   // Start the simulation
   Execute();
@@ -3727,14 +3642,16 @@
   ASSERT(callee_saved_value == get_register(R10));
   ASSERT(callee_saved_value == get_register(R11));
 
-  ASSERT(callee_saved_dvalue == get_dregister(D8));
-  ASSERT(callee_saved_dvalue == get_dregister(D9));
-  ASSERT(callee_saved_dvalue == get_dregister(D10));
-  ASSERT(callee_saved_dvalue == get_dregister(D11));
-  ASSERT(callee_saved_dvalue == get_dregister(D12));
-  ASSERT(callee_saved_dvalue == get_dregister(D13));
-  ASSERT(callee_saved_dvalue == get_dregister(D14));
-  ASSERT(callee_saved_dvalue == get_dregister(D15));
+  if (TargetCPUFeatures::vfp_supported()) {
+    ASSERT(callee_saved_dvalue == get_dregister(D8));
+    ASSERT(callee_saved_dvalue == get_dregister(D9));
+    ASSERT(callee_saved_dvalue == get_dregister(D10));
+    ASSERT(callee_saved_dvalue == get_dregister(D11));
+    ASSERT(callee_saved_dvalue == get_dregister(D12));
+    ASSERT(callee_saved_dvalue == get_dregister(D13));
+    ASSERT(callee_saved_dvalue == get_dregister(D14));
+    ASSERT(callee_saved_dvalue == get_dregister(D15));
+  }
 
   // Restore callee-saved registers with the original value.
   set_register(R4, r4_val);
@@ -3746,19 +3663,22 @@
   set_register(R10, r10_val);
   set_register(R11, r11_val);
 
-  set_dregister(D8, d8_val);
-  set_dregister(D9, d9_val);
-  set_dregister(D10, d10_val);
-  set_dregister(D11, d11_val);
-  set_dregister(D12, d12_val);
-  set_dregister(D13, d13_val);
-  set_dregister(D14, d14_val);
-  set_dregister(D15, d15_val);
+  if (TargetCPUFeatures::vfp_supported()) {
+    set_dregister(D8, d8_val);
+    set_dregister(D9, d9_val);
+    set_dregister(D10, d10_val);
+    set_dregister(D11, d11_val);
+    set_dregister(D12, d12_val);
+    set_dregister(D13, d13_val);
+    set_dregister(D14, d14_val);
+    set_dregister(D15, d15_val);
+  }
 
   // Restore the SP register and return R1:R0.
   set_register(SP, sp_before_call);
   int64_t return_value;
   if (fp_return) {
+    ASSERT(TargetCPUFeatures::vfp_supported());
     return_value = bit_cast<int64_t, double>(get_dregister(D0));
   } else {
     return_value = Utils::LowHighTo64Bits(get_register(R0), get_register(R1));
diff --git a/runtime/vm/simulator_arm.h b/runtime/vm/simulator_arm.h
index 7dfa06e..4d9b079 100644
--- a/runtime/vm/simulator_arm.h
+++ b/runtime/vm/simulator_arm.h
@@ -94,11 +94,6 @@
                bool fp_return = false,
                bool fp_args = false);
 
-  // Implementation of atomic compare and exchange in the same synchronization
-  // domain as other synchronization primitive instructions (e.g. ldrex, strex).
-  static uword CompareExchange(uword* address,
-                               uword compare_value,
-                               uword new_value);
 
   // Runtime and native call support.
   enum CallKind {
@@ -208,39 +203,6 @@
   inline intptr_t ReadW(uword addr, Instr* instr);
   inline void WriteW(uword addr, intptr_t value, Instr* instr);
 
-  // Synchronization primitives support.
-  void ClearExclusive();
-  intptr_t ReadExclusiveW(uword addr, Instr* instr);
-  intptr_t WriteExclusiveW(uword addr, intptr_t value, Instr* instr);
-
-  // TODO(regis): Remove exclusive access support machinery if not needed.
-  // In Dart, there is at most one thread per isolate.
-  // We keep track of 16 exclusive access address tags across all isolates.
-  // Since we cannot simulate a native context switch, which clears
-  // the exclusive access state of the local monitor (using the CLREX
-  // instruction), we associate the isolate requesting exclusive access to the
-  // address tag. Multiple isolates requesting exclusive access (using the LDREX
-  // instruction) to the same address will result in multiple address tags being
-  // created for the same address, one per isolate.
-  // At any given time, each isolate is associated to at most one address tag.
-  static Mutex* exclusive_access_lock_;
-  static const int kNumAddressTags = 16;
-  static struct AddressTag {
-    Isolate* isolate;
-    uword addr;
-  } exclusive_access_state_[kNumAddressTags];
-  static int next_address_tag_;
-
-  // Set access to given address to 'exclusive state' for current isolate.
-  static void SetExclusiveAccess(uword addr);
-
-  // Returns true if the current isolate has exclusive access to given address,
-  // returns false otherwise. In either case, set access to given address to
-  // 'open state' for all isolates.
-  // If given addr is NULL, set access to 'open state' for current
-  // isolate (CLREX).
-  static bool HasExclusiveAccessAndOpen(uword addr);
-
   // Executing is handled based on the instruction type.
   void DecodeType01(Instr* instr);  // Both type 0 and type 1 rolled into one.
   void DecodeType2(Instr* instr);
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index e7e97cf..d2006a2 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -611,12 +611,12 @@
   if ((reg == R31) && (r31t == R31IsZR)) {
     return 0;
   } else {
-    return registers_[reg];
+    return static_cast<int32_t>(registers_[reg]);
   }
 }
 
 
-int64_t Simulator::get_vregisterd(VRegister reg) {
+int64_t Simulator::get_vregisterd(VRegister reg) const {
   ASSERT((reg >= 0) && (reg < kNumberOfVRegisters));
   return vregisters_[reg].lo;
 }
@@ -629,6 +629,20 @@
 }
 
 
+void Simulator::get_vregister(VRegister reg, simd_value_t* value) const {
+  ASSERT((reg >= 0) && (reg < kNumberOfVRegisters));
+  value->lo = vregisters_[reg].lo;
+  value->hi = vregisters_[reg].hi;
+}
+
+
+void Simulator::set_vregister(VRegister reg, const simd_value_t& value) {
+  ASSERT((reg >= 0) && (reg < kNumberOfVRegisters));
+  vregisters_[reg].lo = value.lo;
+  vregisters_[reg].hi = value.hi;
+}
+
+
 // Raw access to the PC register.
 void Simulator::set_pc(int64_t value) {
   pc_modified_ = true;
@@ -1185,22 +1199,34 @@
     } else if (redirection->call_kind() == kLeafRuntimeCall) {
       ASSERT((0 <= redirection->argument_count()) &&
              (redirection->argument_count() <= 8));
-      int64_t r0 = get_register(R0);
-      int64_t r1 = get_register(R1);
-      int64_t r2 = get_register(R2);
-      int64_t r3 = get_register(R3);
-      int64_t r4 = get_register(R4);
-      int64_t r5 = get_register(R5);
-      int64_t r6 = get_register(R6);
-      int64_t r7 = get_register(R7);
       SimulatorLeafRuntimeCall target =
           reinterpret_cast<SimulatorLeafRuntimeCall>(external);
-      r0 = target(r0, r1, r2, r3, r4, r5, r6, r7);
-      set_register(R0, r0);  // Set returned result from function.
+      const int64_t r0 = get_register(R0);
+      const int64_t r1 = get_register(R1);
+      const int64_t r2 = get_register(R2);
+      const int64_t r3 = get_register(R3);
+      const int64_t r4 = get_register(R4);
+      const int64_t r5 = get_register(R5);
+      const int64_t r6 = get_register(R6);
+      const int64_t r7 = get_register(R7);
+      const int64_t res = target(r0, r1, r2, r3, r4, r5, r6, r7);
+      set_register(R0, res);  // Set returned result from function.
       set_register(R1, icount_);  // Zap unused result register.
     } else if (redirection->call_kind() == kLeafFloatRuntimeCall) {
-      // TODO(zra): leaf float runtime calls.
-      UNIMPLEMENTED();
+      ASSERT((0 <= redirection->argument_count()) &&
+             (redirection->argument_count() <= 8));
+      SimulatorLeafFloatRuntimeCall target =
+          reinterpret_cast<SimulatorLeafFloatRuntimeCall>(external);
+      const double d0 = bit_cast<double, int64_t>(get_vregisterd(V0));
+      const double d1 = bit_cast<double, int64_t>(get_vregisterd(V1));
+      const double d2 = bit_cast<double, int64_t>(get_vregisterd(V2));
+      const double d3 = bit_cast<double, int64_t>(get_vregisterd(V3));
+      const double d4 = bit_cast<double, int64_t>(get_vregisterd(V4));
+      const double d5 = bit_cast<double, int64_t>(get_vregisterd(V5));
+      const double d6 = bit_cast<double, int64_t>(get_vregisterd(V6));
+      const double d7 = bit_cast<double, int64_t>(get_vregisterd(V7));
+      const double res = target(d0, d1, d2, d3, d4, d5, d6, d7);
+      set_vregisterd(V0, bit_cast<int64_t, double>(res));
     } else if (redirection->call_kind() == kBootstrapNativeCall) {
       NativeArguments* arguments;
       arguments = reinterpret_cast<NativeArguments*>(get_register(R0));
@@ -1286,7 +1312,7 @@
 
 
 void Simulator::DecodeSystem(Instr* instr) {
-  if ((instr->Bits(0, 8) == 0x5f) && (instr->Bits(12, 4) == 2) &&
+  if ((instr->Bits(0, 8) == 0x1f) && (instr->Bits(12, 4) == 2) &&
       (instr->Bits(16, 3) == 3) && (instr->Bits(19, 2) == 0) &&
       (instr->Bit(21) == 0)) {
     if (instr->Bits(8, 4) == 0) {
@@ -1397,7 +1423,9 @@
   const Register rt = instr->RtField();
   const VRegister vt = instr->VtField();
   const int64_t rn_val = get_register(rn, R31IsSP);
-  const uint32_t size = instr->SzField();
+  const uint32_t size =
+      (instr->Bit(26) == 1) ? ((instr->Bit(23) << 2) | instr->SzField())
+                            : instr->SzField();
   uword address = 0;
   uword wb_address = 0;
   bool wb = false;
@@ -1446,16 +1474,51 @@
   }
 
   // Do access.
-  if (instr->Bits(22, 2) == 0) {
-    if (instr->Bit(26) == 1) {
-      // Format(instr, "vstrd 'vt, 'memop");
-      if (size != 3) {
-        UnimplementedInstruction(instr);
-        return;
-      }
+  if (instr->Bit(26) == 1) {
+    if (instr->Bit(22) == 0) {
+      // Format(instr, "fstr'fsz 'vt, 'memop");
       const int64_t vt_val = get_vregisterd(vt);
-      WriteX(address, vt_val, instr);
+      switch (size) {
+        case 2:
+          WriteW(address, vt_val & kWRegMask, instr);
+          break;
+        case 3:
+          WriteX(address, vt_val, instr);
+          break;
+        case 4: {
+          simd_value_t val;
+          get_vregister(vt, &val);
+          WriteX(address, val.lo, instr);
+          WriteX(address + kWordSize, val.hi, instr);
+          break;
+        }
+        default:
+          UnimplementedInstruction(instr);
+          return;
+      }
     } else {
+      // Format(instr, "fldr'fsz 'vt, 'memop");
+      switch (size) {
+        case 2:
+          set_vregisterd(vt, static_cast<int64_t>(ReadWU(address, instr)));
+          break;
+        case 3:
+          set_vregisterd(vt, ReadX(address, instr));
+          break;
+        case 4: {
+          simd_value_t val;
+          val.lo = ReadX(address, instr);
+          val.hi = ReadX(address + kWordSize, instr);
+          set_vregister(vt, val);
+          break;
+        }
+        default:
+          UnimplementedInstruction(instr);
+          return;
+      }
+    }
+  } else {
+    if (instr->Bits(22, 2) == 0) {
       // Format(instr, "str'sz 'rt, 'memop");
       const int32_t rt_val32 = get_wregister(rt, R31IsZR);
       switch (size) {
@@ -1483,16 +1546,6 @@
           UNREACHABLE();
           break;
       }
-    }
-  } else {
-    if (instr->Bit(26) == 1) {
-      // Format(instr, "ldrd 'vt, 'memop");
-      if ((size != 3) || (instr->Bit(23) != 0)) {
-        UnimplementedInstruction(instr);
-        return;
-      }
-      const int64_t val = ReadX(address, instr);
-      set_vregisterd(vt, val);
     } else {
       // Format(instr, "ldr'sz 'rt, 'memop");
       // Undefined case.
@@ -2073,18 +2126,56 @@
 
 
 void Simulator::DecodeFPOneSource(Instr* instr) {
-  const int opc = instr->Bits(15, 2);
+  const int opc = instr->Bits(15, 6);
   const VRegister vd = instr->VdField();
   const VRegister vn = instr->VnField();
+  const int64_t vn_val = get_vregisterd(vn);
+  const int32_t vn_val32 = vn_val & kWRegMask;
+  const double vn_dbl = bit_cast<double, int64_t>(vn_val);
+  const float vn_flt = bit_cast<float, int32_t>(vn_val32);
+
+  if ((opc != 5) && (instr->Bit(22) != 1)) {
+    // Source is interpreted as single-precision only if we're doing a
+    // conversion from single -> double.
+    UnimplementedInstruction(instr);
+    return;
+  }
+
+  int64_t res_val = 0;
   switch (opc) {
     case 0:
       // Format("fmovdd 'vd, 'vn");
-      set_vregisterd(vd, get_vregisterd(vn));
+      res_val = get_vregisterd(vn);
+      break;
+    case 1:
+      // Format("fabsd 'vd, 'vn");
+      res_val = bit_cast<int64_t, double>(fabs(vn_dbl));
+      break;
+    case 2:
+      // Format("fnegd 'vd, 'vn");
+      res_val = bit_cast<int64_t, double>(-vn_dbl);
+      break;
+    case 3:
+      // Format("fsqrtd 'vd, 'vn");
+      res_val = bit_cast<int64_t, double>(sqrt(vn_dbl));
+      break;
+    case 4: {
+      // Format(instr, "fcvtsd 'vd, 'vn");
+      const uint32_t val =
+          bit_cast<uint32_t, float>(static_cast<float>(vn_dbl));
+      res_val = static_cast<int64_t>(val);
+      break;
+    }
+    case 5:
+      // Format(instr, "fcvtds 'vd, 'vn");
+      res_val = bit_cast<int64_t, double>(static_cast<double>(vn_flt));
       break;
     default:
       UnimplementedInstruction(instr);
       break;
   }
+
+  set_vregisterd(vd, res_val);
 }
 
 
@@ -2119,8 +2210,8 @@
       result = vn_val - vm_val;
       break;
     default:
-      // Unknown(instr);
-      break;
+      UnimplementedInstruction(instr);
+      return;
   }
 
   set_vregisterd(vd, bit_cast<int64_t, double>(result));
@@ -2130,12 +2221,12 @@
 void Simulator::DecodeFPCompare(Instr* instr) {
   const VRegister vn = instr->VnField();
   const VRegister vm = instr->VmField();
-  const double vn_val = get_vregisterd(vn);
+  const double vn_val = bit_cast<double, int64_t>(get_vregisterd(vn));
   double vm_val;
 
   if ((instr->Bit(22) == 1) && (instr->Bits(3, 2) == 0)) {
     // Format(instr, "fcmpd 'vn, 'vm");
-    vm_val = get_vregisterd(vm);
+    vm_val = bit_cast<double, int64_t>(get_vregisterd(vm));
   } else if ((instr->Bit(22) == 1) && (instr->Bits(3, 2) == 1)) {
     if (instr->VmField() == V0) {
       // Format(instr, "fcmpd 'vn, #0.0");
@@ -2271,7 +2362,7 @@
                         bool fp_return,
                         bool fp_args) {
   // Save the SP register before the call so we can restore it.
-  intptr_t sp_before_call = get_register(R31, R31IsSP);
+  const intptr_t sp_before_call = get_register(R31, R31IsSP);
 
   // Setup parameters.
   if (fp_args) {
@@ -2305,7 +2396,8 @@
   // known value so that we are able to check that they are preserved
   // properly across Dart execution.
   int64_t preserved_vals[kAbiPreservedCpuRegCount];
-  int64_t callee_saved_value = icount_;
+  const double dicount = static_cast<double>(icount_);
+  const int64_t callee_saved_value = bit_cast<int64_t, double>(dicount);
   for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) {
     const Register r = static_cast<Register>(i);
     preserved_vals[i - kAbiFirstPreservedCpuReg] = get_register(r);
@@ -2320,11 +2412,11 @@
     set_vregisterd(r, callee_saved_value);
   }
 
-  // Start the simulation
+  // Start the simulation.
   Execute();
 
   // Check that the callee-saved registers have been preserved,
-  // and restore them with the original value
+  // and restore them with the original value.
   for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) {
     const Register r = static_cast<Register>(i);
     ASSERT(callee_saved_value == get_register(r));
diff --git a/runtime/vm/simulator_arm64.h b/runtime/vm/simulator_arm64.h
index f5fc3ea..4480406 100644
--- a/runtime/vm/simulator_arm64.h
+++ b/runtime/vm/simulator_arm64.h
@@ -53,8 +53,10 @@
 
   // Get and set a V register in double ('d') mode. Setting clears the high
   // 64 bits of the V register. Getting ignores the high 64 bits.
-  int64_t get_vregisterd(VRegister reg);
+  int64_t get_vregisterd(VRegister reg) const;
   void set_vregisterd(VRegister reg, int64_t value);
+  void get_vregister(VRegister reg, simd_value_t* value) const;
+  void set_vregister(VRegister reg, const simd_value_t& value);
 
   int64_t get_pc() const;
   int64_t get_last_pc() const;
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index edc5c55..7761863d 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -572,7 +572,7 @@
                         Snapshot::kMessage, Isolate::Current());
   Array& serialized_array = Array::Handle();
   serialized_array ^= reader.ReadObject();
-  EXPECT(array.Equals(serialized_array));
+  EXPECT(array.CanonicalizeEquals(serialized_array));
 
   // Read object back from the snapshot into a C structure.
   ApiNativeScope scope;
@@ -657,7 +657,7 @@
                         Snapshot::kMessage, Isolate::Current());
   Array& serialized_array = Array::Handle();
   serialized_array ^= reader.ReadObject();
-  EXPECT(array.Equals(serialized_array));
+  EXPECT(array.CanonicalizeEquals(serialized_array));
 
   // Read object back from the snapshot into a C structure.
   ApiNativeScope scope;
diff --git a/runtime/vm/stack_frame_test.cc b/runtime/vm/stack_frame_test.cc
index 851786b..2472160 100644
--- a/runtime/vm/stack_frame_test.cc
+++ b/runtime/vm/stack_frame_test.cc
@@ -42,7 +42,7 @@
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   const Instance& expected = Instance::CheckedHandle(arguments->NativeArgAt(0));
   const Instance& actual = Instance::CheckedHandle(arguments->NativeArgAt(1));
-  if (!expected.Equals(actual)) {
+  if (!expected.OperatorEquals(actual)) {
     OS::Print("expected: '%s' actual: '%s'\n",
         expected.ToCString(), actual.ToCString());
     FATAL("Expect_equals fails.\n");
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index 6324058..6454974 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -25,8 +25,6 @@
   V(LazyCompile)                                                               \
   V(CallBootstrapCFunction)                                                    \
   V(CallNativeCFunction)                                                       \
-  V(AllocateArray)                                                             \
-  V(CallNoSuchMethodFunction)                                                  \
   V(CallStaticFunction)                                                        \
   V(FixCallersTarget)                                                          \
   V(Deoptimize)                                                                \
@@ -50,6 +48,8 @@
 // List of stubs created per isolate, these stubs could potentially contain
 // embedded objects and hence cannot be shared across isolates.
 #define STUB_CODE_LIST(V)                                                      \
+  V(AllocateArray)                                                             \
+  V(CallNoSuchMethodFunction)                                                  \
   V(AllocateContext)                                                           \
   V(UpdateStoreBuffer)                                                         \
   V(OneArgCheckInlineCache)                                                    \
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 81cbbd5..20ed17d 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -7,6 +7,7 @@
 
 #include "vm/assembler.h"
 #include "vm/code_generator.h"
+#include "vm/cpu.h"
 #include "vm/compiler.h"
 #include "vm/dart_entry.h"
 #include "vm/flow_graph_compiler.h"
@@ -484,12 +485,17 @@
   // Push registers in their enumeration order: lowest register number at
   // lowest address.
   __ PushList(kAllCpuRegistersList);
-  ASSERT(kFpuRegisterSize == 4 * kWordSize);
-  if (kNumberOfDRegisters > 16) {
-    __ vstmd(DB_W, SP, D16, kNumberOfDRegisters - 16);
-    __ vstmd(DB_W, SP, D0, 16);
+
+  if (TargetCPUFeatures::vfp_supported()) {
+    ASSERT(kFpuRegisterSize == 4 * kWordSize);
+    if (kNumberOfDRegisters > 16) {
+      __ vstmd(DB_W, SP, D16, kNumberOfDRegisters - 16);
+      __ vstmd(DB_W, SP, D0, 16);
+    } else {
+      __ vstmd(DB_W, SP, D0, kNumberOfDRegisters);
+    }
   } else {
-    __ vstmd(DB_W, SP, D0, kNumberOfDRegisters);
+    __ AddImmediate(SP, SP, -kNumberOfFpuRegisters * kFpuRegisterSize);
   }
 
   __ mov(R0, ShifterOperand(SP));  // Pass address of saved registers block.
@@ -596,120 +602,112 @@
 // Called for inline allocation of arrays.
 // Input parameters:
 //   LR: return address.
-//   R2: array length as Smi.
 //   R1: array element type (either NULL or an instantiated type).
-// NOTE: R2 cannot be clobbered here as the caller relies on it being saved.
+//   R2: array length as Smi (must be preserved).
 // The newly allocated object is returned in R0.
 void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
   Label slow_case;
-  if (FLAG_inline_alloc) {
-    // Compute the size to be allocated, it is based on the array length
-    // and is computed as:
-    // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
-    // Assert that length is a Smi.
-    __ tst(R2, ShifterOperand(kSmiTagMask));
-    if (FLAG_use_slow_path) {
-      __ b(&slow_case);
-    } else {
-      __ b(&slow_case, NE);
-    }
-    __ ldr(R8, FieldAddress(CTX, Context::isolate_offset()));
-    __ LoadFromOffset(kWord, R8, R8, Isolate::heap_offset());
-    __ LoadFromOffset(kWord, R8, R8, Heap::new_space_offset());
 
-    // Calculate and align allocation size.
-    // Load new object start and calculate next object start.
-    // R1: array element type.
-    // R2: array length as Smi.
-    // R8: points to new space object.
-    __ LoadFromOffset(kWord, R0, R8, Scavenger::top_offset());
-    intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
-    __ LoadImmediate(R3, fixed_size);
-    __ add(R3, R3, ShifterOperand(R2, LSL, 1));  // R2 is Smi.
-    ASSERT(kSmiTagShift == 1);
-    __ bic(R3, R3, ShifterOperand(kObjectAlignment - 1));
-    __ add(R7, R3, ShifterOperand(R0));
+  // Compute the size to be allocated, it is based on the array length
+  // and is computed as:
+  // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
+  __ MoveRegister(R3, R2);   // Array length.
 
-    // Check if the allocation fits into the remaining space.
-    // R0: potential new object start.
-    // R1: array element type.
-    // R2: array length as Smi.
-    // R3: array size.
-    // R7: potential next object start.
-    // R8: points to new space object.
-    __ LoadFromOffset(kWord, IP, R8, Scavenger::end_offset());
-    __ cmp(R7, ShifterOperand(IP));
-    __ b(&slow_case, CS);  // Branch if unsigned higher or equal.
+  // Check that length is a positive Smi.
+  __ tst(R3, ShifterOperand(kSmiTagMask));
+  __ b(&slow_case, NE);
+  __ cmp(R3, ShifterOperand(0));
+  __ b(&slow_case, LT);
 
-    // Successfully allocated the object(s), now update top to point to
-    // next object start and initialize the object.
-    // R0: potential new object start.
-    // R3: array size.
-    // R7: potential next object start.
-    // R8: Points to new space object.
-    __ StoreToOffset(kWord, R7, R8, Scavenger::top_offset());
-    __ add(R0, R0, ShifterOperand(kHeapObjectTag));
-    __ UpdateAllocationStatsWithSize(kArrayCid, R3, R8);
+  // Check for maximum allowed length.
+  const intptr_t max_len =
+      reinterpret_cast<int32_t>(Smi::New(Array::kMaxElements));
+  __ CompareImmediate(R3, max_len);
+  __ b(&slow_case, GT);
 
-    // R0: new object start as a tagged pointer.
-    // R1: array element type.
-    // R2: array length as Smi.
-    // R3: array size.
-    // R7: new object end address.
+  const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
+  __ LoadImmediate(R8, fixed_size);
+  __ add(R8, R8, ShifterOperand(R3, LSL, 1));  // R3 is  a Smi.
+  ASSERT(kSmiTagShift == 1);
+  __ bic(R8, R8, ShifterOperand(kObjectAlignment - 1));
 
-    // Store the type argument field.
-    __ StoreIntoObjectNoBarrier(
-        R0,
-        FieldAddress(R0, Array::type_arguments_offset()),
-        R1);
+  // R8: Allocation size.
 
-    // Set the length field.
-    __ StoreIntoObjectNoBarrier(
-        R0,
-        FieldAddress(R0, Array::length_offset()),
-        R2);
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
 
-    // Calculate the size tag.
-    // R0: new object start as a tagged pointer.
-    // R2: array length as Smi.
-    // R3: array size.
-    // R7: new object end address.
+  __ LoadImmediate(R6, heap->TopAddress());
+  __ ldr(R0, Address(R6, 0));  // Potential new object start.
+  __ adds(R7, R0, ShifterOperand(R8));  // Potential next object start.
+  __ b(&slow_case, VS);
+
+  // Check if the allocation fits into the remaining space.
+  // R0: potential new object start.
+  // R7: potential next object start.
+  // R8: allocation size.
+  __ LoadImmediate(R3, heap->EndAddress());
+  __ ldr(R3, Address(R3, 0));
+  __ cmp(R7, ShifterOperand(R3));
+  __ b(&slow_case, CS);
+
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  __ str(R7, Address(R6, 0));
+  __ add(R0, R0, ShifterOperand(kHeapObjectTag));
+  __ UpdateAllocationStatsWithSize(kArrayCid, R8, R4);
+
+  // Initialize the tags.
+  // R0: new object start as a tagged pointer.
+  // R7: new object end address.
+  // R8: allocation size.
+  {
     const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
-    __ CompareImmediate(R3, RawObject::SizeTag::kMaxSizeTag);
-    // If no size tag overflow, shift R1 left, else set R1 to zero.
-    __ mov(R1, ShifterOperand(R3, LSL, shift), LS);
-    __ mov(R1, ShifterOperand(0), HI);
+    const Class& cls = Class::Handle(isolate->object_store()->array_class());
+
+    __ CompareImmediate(R8, RawObject::SizeTag::kMaxSizeTag);
+    __ mov(R8, ShifterOperand(R8, LSL, shift), LS);
+    __ mov(R8, ShifterOperand(0), HI);
 
     // Get the class index and insert it into the tags.
-    __ LoadImmediate(IP, RawObject::ClassIdTag::encode(kArrayCid));
-    __ orr(R1, R1, ShifterOperand(IP));
-    __ str(R1, FieldAddress(R0, Array::tags_offset()));
-
-    // Initialize all array elements to raw_null.
-    // R0: new object start as a tagged pointer.
-    // R7: new object end address.
-    // R2: array length as Smi.
-    __ AddImmediate(R1, R0, Array::data_offset() - kHeapObjectTag);
-    // R1: iterator which initially points to the start of the variable
-    // data area to be initialized.
-    __ LoadImmediate(IP, reinterpret_cast<intptr_t>(Object::null()));
-    Label loop;
-    __ Bind(&loop);
-    // TODO(cshapiro): StoreIntoObjectNoBarrier
-    __ cmp(R1, ShifterOperand(R7));
-    __ str(IP, Address(R1, 0), CC);  // Store if unsigned lower.
-    __ AddImmediate(R1, kWordSize, CC);
-    __ b(&loop, CC);  // Loop until R1 == R7.
-
-    // Done allocating and initializing the array.
-    // R0: new object.
-    // R2: array length as Smi (preserved for the caller.)
-    __ Ret();
+    // R8: size and bit tags.
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cls.id()));
+    __ orr(R8, R8, ShifterOperand(TMP));
+    __ str(R8, FieldAddress(R0, Array::tags_offset()));  // Store tags.
   }
 
+  // R0: new object start as a tagged pointer.
+  // R7: new object end address.
+  // Store the type argument field.
+  __ StoreIntoObjectNoBarrier(R0,
+                              FieldAddress(R0, Array::type_arguments_offset()),
+                              R1);
+
+  // Set the length field.
+  __ StoreIntoObjectNoBarrier(R0,
+                              FieldAddress(R0, Array::length_offset()),
+                              R2);
+
+  // Initialize all array elements to raw_null.
+  // R0: new object start as a tagged pointer.
+  // R7: new object end address.
+  // R8: iterator which initially points to the start of the variable
+  // data area to be initialized.
+  // R3: null
+  __ LoadImmediate(R3, reinterpret_cast<intptr_t>(Object::null()));
+  __ AddImmediate(R8, R0, sizeof(RawArray) - kHeapObjectTag);
+
+  Label init_loop;
+  __ Bind(&init_loop);
+  __ cmp(R8, ShifterOperand(R7));
+  __ str(R3, Address(R8, 0), CC);
+  __ AddImmediate(R8, kWordSize, CC);
+  __ b(&init_loop, CC);
+
+  __ Ret();  // Returns the newly allocated object in R0.
   // Unable to allocate the array using the fast inline code, just call
   // into the runtime.
   __ Bind(&slow_case);
+
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
   __ EnterStubFrame();
@@ -743,9 +741,14 @@
   __ PushList((1 << R3) | kAbiPreservedCpuRegs);
 
   const DRegister firstd = EvenDRegisterOf(kAbiFirstPreservedFpuReg);
-  ASSERT(2 * kAbiPreservedFpuRegCount < 16);
-  // Save FPU registers. 2 D registers per Q register.
-  __ vstmd(DB_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
+  if (TargetCPUFeatures::vfp_supported()) {
+    ASSERT(2 * kAbiPreservedFpuRegCount < 16);
+    // Save FPU registers. 2 D registers per Q register.
+    __ vstmd(DB_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
+  } else {
+    __ sub(SP, SP,
+           ShifterOperand(kAbiPreservedFpuRegCount * kFpuRegisterSize));
+  }
 
   // We now load the pool pointer(PP) as we are about to invoke dart code and we
   // could potentially invoke some intrinsic functions which need the PP to be
@@ -844,8 +847,13 @@
   __ StoreToOffset(kWord, R4, CTX, Isolate::vm_tag_offset());
 
   // Restore C++ ABI callee-saved registers.
-  // Restore FPU registers. 2 D registers per Q register.
-  __ vldmd(IA_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
+  if (TargetCPUFeatures::vfp_supported()) {
+    // Restore FPU registers. 2 D registers per Q register.
+    __ vldmd(IA_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
+  } else {
+    __ add(SP, SP,
+       ShifterOperand(kAbiPreservedFpuRegCount * kFpuRegisterSize));
+  }
   // Restore CPU registers.
   __ PopList((1 << R3) | kAbiPreservedCpuRegs);  // Ignore restored R3.
 
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 1b86c58..ca624df 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -44,16 +44,16 @@
   __ Comment("CallToRuntimeStub");
   __ EnterFrame(0);
 
-  // Load current Isolate pointer from Context structure into A0.
-  __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset());
+  // Load current Isolate pointer from Context structure into R0.
+  __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset(), kNoPP);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
   __ mov(TMP, SP);  // Can't directly store SP.
-  __ StoreToOffset(TMP, R0, Isolate::top_exit_frame_info_offset());
+  __ StoreToOffset(TMP, R0, Isolate::top_exit_frame_info_offset(), kNoPP);
 
   // Save current Context pointer into Isolate structure.
-  __ StoreToOffset(CTX, R0, Isolate::top_context_offset());
+  __ StoreToOffset(CTX, R0, Isolate::top_context_offset(), kNoPP);
 
   // Cache Isolate pointer into CTX while executing runtime code.
   __ mov(CTX, R0);
@@ -61,7 +61,7 @@
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ LoadFromOffset(R8, R0, Isolate::vm_tag_offset());
+    __ LoadFromOffset(R8, R0, Isolate::vm_tag_offset(), kNoPP);
     __ CompareImmediate(R8, VMTag::kScriptTagId, kNoPP);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
@@ -70,7 +70,7 @@
 #endif
 
   // Mark that the isolate is executing VM code.
-  __ StoreToOffset(R5, R0, Isolate::vm_tag_offset());
+  __ StoreToOffset(R5, R0, Isolate::vm_tag_offset(), kNoPP);
 
   // Reserve space for arguments and align frame before entering C++ world.
   // NativeArguments are passed in registers.
@@ -107,19 +107,19 @@
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R2, VMTag::kScriptTagId, kNoPP);
-  __ StoreToOffset(R2, CTX, Isolate::vm_tag_offset());
+  __ StoreToOffset(R2, CTX, Isolate::vm_tag_offset(), kNoPP);
 
   // Reset exit frame information in Isolate structure.
-  __ StoreToOffset(ZR, CTX, Isolate::top_exit_frame_info_offset());
+  __ StoreToOffset(ZR, CTX, Isolate::top_exit_frame_info_offset(), kNoPP);
 
   // Load Context pointer from Isolate structure into A2.
-  __ LoadFromOffset(R2, CTX, Isolate::top_context_offset());
+  __ LoadFromOffset(R2, CTX, Isolate::top_context_offset(), kNoPP);
 
   // Load null.
   __ LoadObject(TMP, Object::null_object(), PP);
 
   // Reset Context pointer in Isolate structure.
-  __ StoreToOffset(TMP, CTX, Isolate::top_context_offset());
+  __ StoreToOffset(TMP, CTX, Isolate::top_context_offset(), kNoPP);
 
   // Cache Context pointer into CTX while executing Dart code.
   __ mov(CTX, R2);
@@ -149,15 +149,15 @@
   __ EnterFrame(0);
 
   // Load current Isolate pointer from Context structure into R0.
-  __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset());
+  __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset(), kNoPP);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
   __ mov(TMP, SP);
-  __ StoreToOffset(TMP, R0, Isolate::top_exit_frame_info_offset());
+  __ StoreToOffset(TMP, R0, Isolate::top_exit_frame_info_offset(), kNoPP);
 
   // Save current Context pointer into Isolate structure.
-  __ StoreToOffset(CTX, R0, Isolate::top_context_offset());
+  __ StoreToOffset(CTX, R0, Isolate::top_context_offset(), kNoPP);
 
   // Cache Isolate pointer into CTX while executing native code.
   __ mov(CTX, R0);
@@ -165,7 +165,7 @@
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ LoadFromOffset(R6, CTX, Isolate::vm_tag_offset());
+    __ LoadFromOffset(R6, CTX, Isolate::vm_tag_offset(), kNoPP);
     __ CompareImmediate(R6, VMTag::kScriptTagId, kNoPP);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
@@ -174,7 +174,7 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ StoreToOffset(R5, CTX, Isolate::vm_tag_offset());
+  __ StoreToOffset(R5, CTX, Isolate::vm_tag_offset(), kNoPP);
 
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
@@ -202,10 +202,10 @@
   // TODO(regis): Should we pass the structure by value as in runtime calls?
   // It would require changing Dart API for native functions.
   // For now, space is reserved on the stack and we pass a pointer to it.
-  __ StoreToOffset(R0, SP, isolate_offset);
-  __ StoreToOffset(R1, SP, argc_tag_offset);
-  __ StoreToOffset(R2, SP, argv_offset);
-  __ StoreToOffset(R3, SP, retval_offset);
+  __ StoreToOffset(R0, SP, isolate_offset, kNoPP);
+  __ StoreToOffset(R1, SP, argc_tag_offset, kNoPP);
+  __ StoreToOffset(R2, SP, argv_offset, kNoPP);
+  __ StoreToOffset(R3, SP, retval_offset, kNoPP);
   __ mov(R0, SP);  // Pass the pointer to the NativeArguments.
 
   // Call native function (setsup scope if not leaf function).
@@ -235,17 +235,17 @@
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R2, VMTag::kScriptTagId, kNoPP);
-  __ StoreToOffset(R2, CTX, Isolate::vm_tag_offset());
+  __ StoreToOffset(R2, CTX, Isolate::vm_tag_offset(), kNoPP);
 
   // Reset exit frame information in Isolate structure.
-  __ StoreToOffset(ZR, CTX, Isolate::top_exit_frame_info_offset());
+  __ StoreToOffset(ZR, CTX, Isolate::top_exit_frame_info_offset(), kNoPP);
 
   // Load Context pointer from Isolate structure into R2.
-  __ LoadFromOffset(R2, CTX, Isolate::top_context_offset());
+  __ LoadFromOffset(R2, CTX, Isolate::top_context_offset(), kNoPP);
 
   // Reset Context pointer in Isolate structure.
   __ LoadObject(R3, Object::null_object(), PP);
-  __ StoreToOffset(R3, CTX, Isolate::top_context_offset());
+  __ StoreToOffset(R3, CTX, Isolate::top_context_offset(), kNoPP);
 
   // Cache Context pointer into CTX while executing Dart code.
   __ mov(CTX, R2);
@@ -270,15 +270,15 @@
   __ EnterFrame(0);
 
   // Load current Isolate pointer from Context structure into R0.
-  __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset());
+  __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset(), kNoPP);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
   __ mov(TMP, SP);  // Can't store SP directly, first copy to TMP.
-  __ StoreToOffset(TMP, R0, Isolate::top_exit_frame_info_offset());
+  __ StoreToOffset(TMP, R0, Isolate::top_exit_frame_info_offset(), kNoPP);
 
   // Save current Context pointer into Isolate structure.
-  __ StoreToOffset(CTX, R0, Isolate::top_context_offset());
+  __ StoreToOffset(CTX, R0, Isolate::top_context_offset(), kNoPP);
 
   // Cache Isolate pointer into CTX while executing native code.
   __ mov(CTX, R0);
@@ -286,7 +286,7 @@
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ LoadFromOffset(R6, CTX, Isolate::vm_tag_offset());
+    __ LoadFromOffset(R6, CTX, Isolate::vm_tag_offset(), kNoPP);
     __ CompareImmediate(R6, VMTag::kScriptTagId, kNoPP);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
@@ -295,7 +295,7 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ StoreToOffset(R5, CTX, Isolate::vm_tag_offset());
+  __ StoreToOffset(R5, CTX, Isolate::vm_tag_offset(), kNoPP);
 
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
@@ -323,10 +323,10 @@
   // TODO(regis): Should we pass the structure by value as in runtime calls?
   // It would require changing Dart API for native functions.
   // For now, space is reserved on the stack and we pass a pointer to it.
-  __ StoreToOffset(R0, SP, isolate_offset);
-  __ StoreToOffset(R1, SP, argc_tag_offset);
-  __ StoreToOffset(R2, SP, argv_offset);
-  __ StoreToOffset(R3, SP, retval_offset);
+  __ StoreToOffset(R0, SP, isolate_offset, kNoPP);
+  __ StoreToOffset(R1, SP, argc_tag_offset, kNoPP);
+  __ StoreToOffset(R2, SP, argv_offset, kNoPP);
+  __ StoreToOffset(R3, SP, retval_offset, kNoPP);
   __ mov(R0, SP);  // Pass the pointer to the NativeArguments.
 
   // Call native function or redirection via simulator.
@@ -334,17 +334,17 @@
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R2, VMTag::kScriptTagId, kNoPP);
-  __ StoreToOffset(R2, CTX, Isolate::vm_tag_offset());
+  __ StoreToOffset(R2, CTX, Isolate::vm_tag_offset(), kNoPP);
 
   // Reset exit frame information in Isolate structure.
-  __ StoreToOffset(ZR, CTX, Isolate::top_exit_frame_info_offset());
+  __ StoreToOffset(ZR, CTX, Isolate::top_exit_frame_info_offset(), kNoPP);
 
   // Load Context pointer from Isolate structure into R2.
-  __ LoadFromOffset(R2, CTX, Isolate::top_context_offset());
+  __ LoadFromOffset(R2, CTX, Isolate::top_context_offset(), kNoPP);
 
   // Reset Context pointer in Isolate structure.
   __ LoadObject(R3, Object::null_object(), PP);
-  __ StoreToOffset(R3, CTX, Isolate::top_context_offset());
+  __ StoreToOffset(R3, CTX, Isolate::top_context_offset(), kNoPP);
 
   // Cache Context pointer into CTX while executing Dart code.
   __ mov(CTX, R2);
@@ -370,7 +370,7 @@
   // Remove the stub frame.
   __ LeaveStubFrame();
   // Jump to the dart function.
-  __ LoadFieldFromOffset(R0, R0, Code::instructions_offset());
+  __ LoadFieldFromOffset(R0, R0, Code::instructions_offset(), kNoPP);
   __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
   __ br(R0);
 }
@@ -393,7 +393,7 @@
   // Remove the stub frame.
   __ LeaveStubFrame();
   // Jump to the dart function.
-  __ LoadFieldFromOffset(R0, R0, Code::instructions_offset());
+  __ LoadFieldFromOffset(R0, R0, Code::instructions_offset(), kNoPP);
   __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
   __ br(R0);
 }
@@ -497,7 +497,7 @@
 
   if (preserve_result) {
     // Restore result into R1 temporarily.
-    __ LoadFromOffset(R1, FP, saved_result_slot_from_fp * kWordSize);
+    __ LoadFromOffset(R1, FP, saved_result_slot_from_fp * kWordSize, kNoPP);
   }
 
   // There is a Dart Frame on the stack. We must restore PP and leave frame.
@@ -519,7 +519,7 @@
   __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);
   if (preserve_result) {
     // Restore result into R1.
-    __ LoadFromOffset(R1, FP, kFirstLocalSlotFromFp * kWordSize);
+    __ LoadFromOffset(R1, FP, kFirstLocalSlotFromFp * kWordSize, kNoPP);
   }
   // Code above cannot cause GC.
   // There is a Dart Frame on the stack. We must restore PP and leave frame.
@@ -568,9 +568,9 @@
   __ EnterStubFrame();
 
   // Load the receiver.
-  __ LoadFieldFromOffset(R2, R4, ArgumentsDescriptor::count_offset());
+  __ LoadFieldFromOffset(R2, R4, ArgumentsDescriptor::count_offset(), kNoPP);
   __ add(TMP, FP, Operand(R2, LSL, 2));  // R2 is Smi.
-  __ LoadFromOffset(R6, TMP, kParamEndSlotFromFp * kWordSize);
+  __ LoadFromOffset(R6, TMP, kParamEndSlotFromFp * kWordSize, kNoPP);
 
   // Preserve IC data and arguments descriptor.
   __ Push(R5);
@@ -596,8 +596,8 @@
   __ LeaveStubFrame();
 
   // Tail-call to target function.
-  __ LoadFieldFromOffset(R2, R0, Function::code_offset());
-  __ LoadFieldFromOffset(R2, R2, Code::instructions_offset());
+  __ LoadFieldFromOffset(R2, R0, Function::code_offset(), kNoPP);
+  __ LoadFieldFromOffset(R2, R2, Code::instructions_offset(), kNoPP);
   __ AddImmediate(R2, R2, Instructions::HeaderSize() - kHeapObjectTag, PP);
   __ br(R2);
 }
@@ -612,113 +612,109 @@
 // The newly allocated object is returned in R0.
 void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
   Label slow_case;
-  if (FLAG_inline_alloc) {
-    // Compute the size to be allocated, it is based on the array length
-    // and is computed as:
-    // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
-    // Assert that length is a Smi.
-    __ tsti(R2, kSmiTagMask);
-    if (FLAG_use_slow_path) {
-      __ b(&slow_case);
-    } else {
-      __ b(&slow_case, NE);
-    }
-    __ LoadFieldFromOffset(R8, CTX, Context::isolate_offset());
-    __ LoadFromOffset(R8, R8, Isolate::heap_offset());
-    __ LoadFromOffset(R8, R8, Heap::new_space_offset());
-
-    // Calculate and align allocation size.
-    // Load new object start and calculate next object start.
-    // R1: array element type.
-    // R2: array length as Smi.
-    // R8: points to new space object.
-    __ LoadFromOffset(R0, R8, Scavenger::top_offset());
-    intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
-    __ LoadImmediate(R3, fixed_size, kNoPP);
-    __ add(R3, R3, Operand(R2, LSL, 2));  // R2 is Smi.
-    ASSERT(kSmiTagShift == 1);
-    __ andi(R3, R3, ~(kObjectAlignment - 1));
-    __ add(R7, R3, Operand(R0));
-
-    // Check if the allocation fits into the remaining space.
-    // R0: potential new object start.
-    // R1: array element type.
-    // R2: array length as Smi.
-    // R3: array size.
-    // R7: potential next object start.
-    // R8: points to new space object.
-    __ LoadFromOffset(TMP, R8, Scavenger::end_offset());
-    __ CompareRegisters(R7, TMP);
-    __ b(&slow_case, CS);  // Branch if unsigned higher or equal.
-
-    // Successfully allocated the object(s), now update top to point to
-    // next object start and initialize the object.
-    // R0: potential new object start.
-    // R3: array size.
-    // R7: potential next object start.
-    // R8: Points to new space object.
-    __ StoreToOffset(R7, R8, Scavenger::top_offset());
-    __ add(R0, R0, Operand(kHeapObjectTag));
-    __ UpdateAllocationStatsWithSize(kArrayCid, R3, R8, kNoPP);
-
-    // R0: new object start as a tagged pointer.
-    // R1: array element type.
-    // R2: array length as Smi.
-    // R3: array size.
-    // R7: new object end address.
-
-    // Store the type argument field.
-    __ StoreIntoObjectNoBarrier(
-        R0,
-        FieldAddress(R0, Array::type_arguments_offset()),
-        R1);
-
-    // Set the length field.
-    __ StoreIntoObjectNoBarrier(
-        R0,
-        FieldAddress(R0, Array::length_offset()),
-        R2);
-
-    // Calculate the size tag.
-    // R0: new object start as a tagged pointer.
-    // R2: array length as Smi.
-    // R3: array size.
-    // R7: new object end address.
-    const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
-    __ CompareImmediate(R3, RawObject::SizeTag::kMaxSizeTag, kNoPP);
-    // If no size tag overflow, shift R1 left, else set R1 to zero.
-    __ Lsl(TMP, R3, shift);
-    __ csel(R1, TMP, R1, LS);
-    __ csel(R1, ZR, R1, HI);
-
-    // Get the class index and insert it into the tags.
-    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(kArrayCid), kNoPP);
-    __ orr(R1, R1, Operand(TMP));
-    __ StoreFieldToOffset(R1, R0, Array::tags_offset());
-
-    // Initialize all array elements to raw_null.
-    // R0: new object start as a tagged pointer.
-    // R7: new object end address.
-    // R2: array length as Smi.
-    __ AddImmediate(R1, R0, Array::data_offset() - kHeapObjectTag, kNoPP);
-    // R1: iterator which initially points to the start of the variable
-    // data area to be initialized.
-    __ LoadObject(TMP, Object::null_object(), PP);
-    Label loop, done;
-    __ Bind(&loop);
-    // TODO(cshapiro): StoreIntoObjectNoBarrier
-    __ CompareRegisters(R1, R7);
-    __ b(&done, CS);
-    __ str(TMP, Address(R1));  // Store if unsigned lower.
-    __ AddImmediate(R1, R1, kWordSize, kNoPP);
-    __ b(&loop);  // Loop until R1 == R7.
-    __ Bind(&done);
-
-    // Done allocating and initializing the array.
-    // R0: new object.
-    // R2: array length as Smi (preserved for the caller.)
-    __ ret();
+  // Compute the size to be allocated, it is based on the array length
+  // and is computed as:
+  // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
+  // Assert that length is a Smi.
+  __ tsti(R2, kSmiTagMask);
+  if (FLAG_use_slow_path) {
+    __ b(&slow_case);
+  } else {
+    __ b(&slow_case, NE);
   }
+  __ cmp(R2, Operand(0));
+  __ b(&slow_case, LT);
+  __ LoadFieldFromOffset(R8, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadFromOffset(R8, R8, Isolate::heap_offset(), kNoPP);
+  __ LoadFromOffset(R8, R8, Heap::new_space_offset(), kNoPP);
+
+  // Calculate and align allocation size.
+  // Load new object start and calculate next object start.
+  // R1: array element type.
+  // R2: array length as Smi.
+  // R8: points to new space object.
+  __ LoadFromOffset(R0, R8, Scavenger::top_offset(), kNoPP);
+  intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
+  __ LoadImmediate(R3, fixed_size, kNoPP);
+  __ add(R3, R3, Operand(R2, LSL, 2));  // R2 is Smi.
+  ASSERT(kSmiTagShift == 1);
+  __ andi(R3, R3, ~(kObjectAlignment - 1));
+  __ adds(R7, R3, Operand(R0));
+  __ b(&slow_case, VS);
+
+  // Check if the allocation fits into the remaining space.
+  // R0: potential new object start.
+  // R1: array element type.
+  // R2: array length as Smi.
+  // R3: array size.
+  // R7: potential next object start.
+  // R8: points to new space object.
+  __ LoadFromOffset(TMP, R8, Scavenger::end_offset(), kNoPP);
+  __ CompareRegisters(R7, TMP);
+  __ b(&slow_case, CS);  // Branch if unsigned higher or equal.
+
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  // R0: potential new object start.
+  // R3: array size.
+  // R7: potential next object start.
+  // R8: Points to new space object.
+  __ StoreToOffset(R7, R8, Scavenger::top_offset(), kNoPP);
+  __ add(R0, R0, Operand(kHeapObjectTag));
+  __ UpdateAllocationStatsWithSize(kArrayCid, R3, R8, kNoPP);
+
+  // R0: new object start as a tagged pointer.
+  // R1: array element type.
+  // R2: array length as Smi.
+  // R3: array size.
+  // R7: new object end address.
+
+  // Store the type argument field.
+  __ StoreIntoObjectOffsetNoBarrier(
+      R0, Array::type_arguments_offset(), R1, PP);
+
+  // Set the length field.
+  __ StoreIntoObjectOffsetNoBarrier(R0, Array::length_offset(), R2, PP);
+
+  // Calculate the size tag.
+  // R0: new object start as a tagged pointer.
+  // R2: array length as Smi.
+  // R3: array size.
+  // R7: new object end address.
+  const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
+  __ CompareImmediate(R3, RawObject::SizeTag::kMaxSizeTag, kNoPP);
+  // If no size tag overflow, shift R1 left, else set R1 to zero.
+  __ Lsl(TMP, R3, shift);
+  __ csel(R1, TMP, R1, LS);
+  __ csel(R1, ZR, R1, HI);
+
+  // Get the class index and insert it into the tags.
+  __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(kArrayCid), kNoPP);
+  __ orr(R1, R1, Operand(TMP));
+  __ StoreFieldToOffset(R1, R0, Array::tags_offset(), kNoPP);
+
+  // Initialize all array elements to raw_null.
+  // R0: new object start as a tagged pointer.
+  // R7: new object end address.
+  // R2: array length as Smi.
+  __ AddImmediate(R1, R0, Array::data_offset() - kHeapObjectTag, kNoPP);
+  // R1: iterator which initially points to the start of the variable
+  // data area to be initialized.
+  __ LoadObject(TMP, Object::null_object(), PP);
+  Label loop, done;
+  __ Bind(&loop);
+  // TODO(cshapiro): StoreIntoObjectNoBarrier
+  __ CompareRegisters(R1, R7);
+  __ b(&done, CS);
+  __ str(TMP, Address(R1));  // Store if unsigned lower.
+  __ AddImmediate(R1, R1, kWordSize, kNoPP);
+  __ b(&loop);  // Loop until R1 == R7.
+  __ Bind(&done);
+
+  // Done allocating and initializing the array.
+  // R0: new object.
+  // R2: array length as Smi (preserved for the caller.)
+  __ ret();
 
   // Unable to allocate the array using the fast inline code, just call
   // into the runtime.
@@ -753,11 +749,8 @@
   __ EnterFrame(0);
 
   // The new context, saved vm tag, the top exit frame, and the old context.
-  // const intptr_t kPreservedContextSlots = 4;
   const intptr_t kNewContextOffsetFromFp =
       -(1 + kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount) * kWordSize;
-  // const intptr_t kPreservedRegSpace =
-  //     kWordSize * (kAbiPreservedCpuRegCount + kPreservedContextSlots);
 
   // Save the callee-saved registers.
   for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) {
@@ -789,31 +782,31 @@
   // compiled or runtime stub code.
 
   // Cache the new Context pointer into CTX while executing Dart code.
-  __ LoadFromOffset(CTX, R3, VMHandles::kOffsetOfRawPtrInHandle);
+  __ LoadFromOffset(CTX, R3, VMHandles::kOffsetOfRawPtrInHandle, PP);
 
   // Load Isolate pointer from Context structure into temporary register R4.
-  __ LoadFieldFromOffset(R5, CTX, Context::isolate_offset());
+  __ LoadFieldFromOffset(R5, CTX, Context::isolate_offset(), PP);
 
   // Save the current VMTag on the stack.
   ASSERT(kSavedVMTagSlotFromEntryFp == -20);
-  __ LoadFromOffset(R4, R5, Isolate::vm_tag_offset());
+  __ LoadFromOffset(R4, R5, Isolate::vm_tag_offset(), PP);
   __ Push(R4);
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R6, VMTag::kScriptTagId, PP);
-  __ StoreToOffset(R6, R5, Isolate::vm_tag_offset());
+  __ StoreToOffset(R6, R5, Isolate::vm_tag_offset(), PP);
 
   // Save the top exit frame info. Use R6 as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
-  __ LoadFromOffset(R6, R5, Isolate::top_exit_frame_info_offset());
-  __ StoreToOffset(ZR, R5, Isolate::top_exit_frame_info_offset());
+  __ LoadFromOffset(R6, R5, Isolate::top_exit_frame_info_offset(), PP);
+  __ StoreToOffset(ZR, R5, Isolate::top_exit_frame_info_offset(), PP);
 
   // Save the old Context pointer. Use R4 as a temporary register.
   // Note that VisitObjectPointers will find this saved Context pointer during
   // GC marking, since it traverses any information between SP and
   // FP - kExitLinkSlotFromEntryFp.
   // EntryFrame::SavedContext reads the context saved in this frame.
-  __ LoadFromOffset(R4, R5, Isolate::top_context_offset());
+  __ LoadFromOffset(R4, R5, Isolate::top_context_offset(), PP);
 
   // The constants kSavedContextSlotFromEntryFp and
   // kExitLinkSlotFromEntryFp must be kept in sync with the code below.
@@ -823,14 +816,14 @@
   __ Push(R4);
 
   // Load arguments descriptor array into R4, which is passed to Dart code.
-  __ LoadFromOffset(R4, R1, VMHandles::kOffsetOfRawPtrInHandle);
+  __ LoadFromOffset(R4, R1, VMHandles::kOffsetOfRawPtrInHandle, PP);
 
   // Load number of arguments into S5.
-  __ LoadFieldFromOffset(R5, R4, ArgumentsDescriptor::count_offset());
+  __ LoadFieldFromOffset(R5, R4, ArgumentsDescriptor::count_offset(), PP);
   __ SmiUntag(R5);
 
   // Compute address of 'arguments array' data area into R2.
-  __ LoadFromOffset(R2, R2, VMHandles::kOffsetOfRawPtrInHandle);
+  __ LoadFromOffset(R2, R2, VMHandles::kOffsetOfRawPtrInHandle, PP);
   __ AddImmediate(R2, R2, Array::data_offset() - kHeapObjectTag, PP);
 
   // Set up arguments for the Dart call.
@@ -853,18 +846,18 @@
   __ Comment("InvokeDartCodeStub return");
 
   // Read the saved new Context pointer.
-  __ LoadFromOffset(CTX, FP, kNewContextOffsetFromFp);
-  __ LoadFromOffset(CTX, CTX, VMHandles::kOffsetOfRawPtrInHandle);
+  __ LoadFromOffset(CTX, FP, kNewContextOffsetFromFp, PP);
+  __ LoadFromOffset(CTX, CTX, VMHandles::kOffsetOfRawPtrInHandle, PP);
 
   // Get rid of arguments pushed on the stack.
   __ AddImmediate(SP, FP, kSavedContextSlotFromEntryFp * kWordSize, PP);
 
   // Load Isolate pointer from Context structure into CTX. Drop Context.
-  __ LoadFieldFromOffset(CTX, CTX, Context::isolate_offset());
+  __ LoadFieldFromOffset(CTX, CTX, Context::isolate_offset(), PP);
 
   // Restore the current VMTag from the stack.
   __ ldr(R4, Address(SP, 2 * kWordSize));
-  __ StoreToOffset(R4, CTX, Isolate::vm_tag_offset());
+  __ StoreToOffset(R4, CTX, Isolate::vm_tag_offset(), PP);
 
   // Restore the saved Context pointer into the Isolate structure.
   // Uses R4 as a temporary register for this.
@@ -872,8 +865,8 @@
   // Uses R6 as a temporary register for this.
   __ Pop(R4);
   __ Pop(R6);
-  __ StoreToOffset(R4, CTX, Isolate::top_context_offset());
-  __ StoreToOffset(R6, CTX, Isolate::top_exit_frame_info_offset());
+  __ StoreToOffset(R4, CTX, Isolate::top_context_offset(), PP);
+  __ StoreToOffset(R6, CTX, Isolate::top_exit_frame_info_offset(), PP);
 
   __ Pop(R3);
   __ Pop(R4);
@@ -881,7 +874,7 @@
   // Restore the bottom 64-bits of callee-saved V registers.
   for (int i = kAbiLastPreservedFpuReg; i >= kAbiFirstPreservedFpuReg; i--) {
     const VRegister r = static_cast<VRegister>(i);
-    __ PushDouble(r);
+    __ PopDouble(r);
   }
 
   // Restore C++ ABI callee-saved registers.
@@ -963,26 +956,26 @@
     __ LoadImmediate(
         TMP, RawObject::ClassIdTag::encode(context_class.id()), kNoPP);
     __ orr(R2, R2, Operand(TMP));
-    __ StoreFieldToOffset(R2, R0, Context::tags_offset());
+    __ StoreFieldToOffset(R2, R0, Context::tags_offset(), kNoPP);
 
     // Setup up number of context variables field.
     // R0: new object.
     // R1: number of context variables as integer value (not object).
-    __ StoreFieldToOffset(R1, R0, Context::num_variables_offset());
+    __ StoreFieldToOffset(R1, R0, Context::num_variables_offset(), kNoPP);
 
     // Setup isolate field.
     // Load Isolate pointer from Context structure into R2.
     // R0: new object.
     // R1: number of context variables.
-    __ LoadFieldFromOffset(R2, CTX, Context::isolate_offset());
+    __ LoadFieldFromOffset(R2, CTX, Context::isolate_offset(), kNoPP);
     // R2: isolate, not an object.
-    __ StoreFieldToOffset(R2, R0, Context::isolate_offset());
+    __ StoreFieldToOffset(R2, R0, Context::isolate_offset(), kNoPP);
 
     // Setup the parent field.
     // R0: new object.
     // R1: number of context variables.
     __ LoadObject(R2, Object::null_object(), PP);
-    __ StoreFieldToOffset(R2, R0, Context::parent_offset());
+    __ StoreFieldToOffset(R2, R0, Context::parent_offset(), kNoPP);
 
     // Initialize the context variables.
     // R0: new object.
@@ -1030,7 +1023,7 @@
   Label add_to_buffer;
   // Check whether this object has already been remembered. Skip adding to the
   // store buffer if the object is in the store buffer already.
-  __ LoadFieldFromOffset(TMP, R0, Object::tags_offset());
+  __ LoadFieldFromOffset(TMP, R0, Object::tags_offset(), kNoPP);
   __ tsti(TMP, 1 << RawObject::kRememberedBit);
   __ b(&add_to_buffer, EQ);
   __ ret();
@@ -1042,27 +1035,29 @@
   __ Push(R3);
 
   __ orri(R2, TMP, 1 << RawObject::kRememberedBit);
-  __ StoreFieldToOffset(R2, R0, Object::tags_offset());
+  __ StoreFieldToOffset(R2, R0, Object::tags_offset(), kNoPP);
 
   // Load the isolate out of the context.
   // Spilled: R1, R2, R3.
   // R0: address being stored.
-  __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset());
+  __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP);
 
   // Load the StoreBuffer block out of the isolate. Then load top_ out of the
   // StoreBufferBlock and add the address to the pointers_.
   // R1: isolate.
-  __ LoadFromOffset(R1, R1, Isolate::store_buffer_offset());
-  __ LoadFromOffset(R2, R1, StoreBufferBlock::top_offset(), kUnsignedWord);
+  __ LoadFromOffset(R1, R1, Isolate::store_buffer_offset(), kNoPP);
+  __ LoadFromOffset(R2, R1, StoreBufferBlock::top_offset(),
+                    kNoPP, kUnsignedWord);
   __ add(R3, R1, Operand(R2, LSL, 3));
-  __ StoreToOffset(R0, R3, StoreBufferBlock::pointers_offset());
+  __ StoreToOffset(R0, R3, StoreBufferBlock::pointers_offset(), kNoPP);
 
   // Increment top_ and check for overflow.
   // R2: top_.
   // R1: StoreBufferBlock.
   Label L;
   __ add(R2, R2, Operand(1));
-  __ StoreToOffset(R2, R1, StoreBufferBlock::top_offset(), kUnsignedWord);
+  __ StoreToOffset(R2, R1, StoreBufferBlock::top_offset(),
+                   kNoPP, kUnsignedWord);
   __ CompareImmediate(R2, StoreBufferBlock::kSize, kNoPP);
   // Restore values.
   __ Pop(R3);
@@ -1076,7 +1071,7 @@
   // Setup frame, push callee-saved registers.
 
   __ EnterCallRuntimeFrame(0 * kWordSize);
-  __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset());
+  __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset(), kNoPP);
   __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
   // Restore callee-saved registers, tear down frame.
   __ LeaveCallRuntimeFrame();
@@ -1136,7 +1131,7 @@
     ASSERT(cls.id() != kIllegalCid);
     tags = RawObject::ClassIdTag::update(cls.id(), tags);
     __ LoadImmediate(R0, tags, kNoPP);
-    __ StoreToOffset(R0, R2, Instance::tags_offset());
+    __ StoreToOffset(R0, R2, Instance::tags_offset(), kNoPP);
 
     // Initialize the remaining words of the object.
     __ LoadObject(R0, Object::null_object(), PP);
@@ -1152,7 +1147,7 @@
       for (intptr_t current_offset = Instance::NextFieldOffset();
            current_offset < instance_size;
            current_offset += kWordSize) {
-        __ StoreToOffset(R0, R2, current_offset);
+        __ StoreToOffset(R0, R2, current_offset, kNoPP);
       }
     } else {
       __ AddImmediate(R4, R2, Instance::NextFieldOffset(), kNoPP);
@@ -1175,7 +1170,7 @@
     if (is_cls_parameterized) {
       // R1: new object type arguments.
       // Set the type arguments in the new object.
-      __ StoreToOffset(R1, R2, cls.type_arguments_field_offset());
+      __ StoreToOffset(R1, R2, cls.type_arguments_field_offset(), kNoPP);
     }
     // Done allocating and initializing the instance.
     // R2: new object still missing its heap tag.
@@ -1222,9 +1217,9 @@
   __ EnterStubFrame(true);
 
   // Load the receiver.
-  __ LoadFieldFromOffset(R2, R4, ArgumentsDescriptor::count_offset());
+  __ LoadFieldFromOffset(R2, R4, ArgumentsDescriptor::count_offset(), kNoPP);
   __ add(TMP, FP, Operand(R2, LSL, 2));  // R2 is Smi.
-  __ LoadFromOffset(R6, TMP, kParamEndSlotFromFp * kWordSize);
+  __ LoadFromOffset(R6, TMP, kParamEndSlotFromFp * kWordSize, kNoPP);
 
   // Push space for the return value.
   // Push the receiver.
@@ -1266,9 +1261,9 @@
     __ Pop(R6);  // Restore.
     __ LeaveStubFrame();
   }
-  __ LoadFieldFromOffset(R7, func_reg, Function::usage_counter_offset());
+  __ LoadFieldFromOffset(R7, func_reg, Function::usage_counter_offset(), kNoPP);
   __ add(R7, R7, Operand(1));
-  __ StoreFieldToOffset(R7, func_reg, Function::usage_counter_offset());
+  __ StoreFieldToOffset(R7, func_reg, Function::usage_counter_offset(), kNoPP);
 }
 
 
@@ -1278,10 +1273,10 @@
   Register ic_reg = R5;
   Register func_reg = temp_reg;
   ASSERT(temp_reg == R6);
-  __ LoadFieldFromOffset(func_reg, ic_reg, ICData::owner_offset());
-  __ LoadFieldFromOffset(R7, func_reg, Function::usage_counter_offset());
+  __ LoadFieldFromOffset(func_reg, ic_reg, ICData::owner_offset(), kNoPP);
+  __ LoadFieldFromOffset(R7, func_reg, Function::usage_counter_offset(), kNoPP);
   __ AddImmediate(R7, R7, 1, kNoPP);
-  __ StoreFieldToOffset(R7, func_reg, Function::usage_counter_offset());
+  __ StoreFieldToOffset(R7, func_reg, Function::usage_counter_offset(), kNoPP);
 }
 
 
@@ -1305,7 +1300,7 @@
     // Check that the IC data array has NumArgsTested() == num_args.
     // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
     __ LoadFromOffset(R6, R5, ICData::state_bits_offset() - kHeapObjectTag,
-                      kUnsignedWord);
+                      kNoPP, kUnsignedWord);
     ASSERT(ICData::NumArgsTestedShift() == 0);  // No shift needed.
     __ andi(R6, R6, ICData::NumArgsTestedMask());
     __ CompareImmediate(R6, num_args, kNoPP);
@@ -1317,8 +1312,9 @@
 
   // Check single stepping.
   Label not_stepping;
-  __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset());
-  __ LoadFromOffset(R6, R6, Isolate::single_step_offset(), kUnsignedByte);
+  __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadFromOffset(
+      R6, R6, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
   __ CompareRegisters(R6, ZR);
   __ b(&not_stepping, EQ);
   __ EnterStubFrame();
@@ -1329,18 +1325,18 @@
   __ Bind(&not_stepping);
 
   // Load arguments descriptor into R4.
-  __ LoadFieldFromOffset(R4, R5, ICData::arguments_descriptor_offset());
+  __ LoadFieldFromOffset(R4, R5, ICData::arguments_descriptor_offset(), kNoPP);
   // Loop that checks if there is an IC data match.
   Label loop, update, test, found, get_class_id_as_smi;
   // R5: IC data object (preserved).
-  __ LoadFieldFromOffset(R6, R5, ICData::ic_data_offset());
+  __ LoadFieldFromOffset(R6, R5, ICData::ic_data_offset(), kNoPP);
   // R6: ic_data_array with check entries: classes and target functions.
   __ AddImmediate(R6, R6, Array::data_offset() - kHeapObjectTag, kNoPP);
   // R6: points directly to the first ic data array element.
 
   // Get the receiver's class ID (first read number of arguments from
   // arguments descriptor array and then access the receiver from the stack).
-  __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset());
+  __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset(), kNoPP);
   __ SmiUntag(R7);  // Untag so we can use the LSL 3 addressing mode.
   __ sub(R7, R7, Operand(1));
 
@@ -1359,7 +1355,7 @@
     __ b(&done);
 
     __ Bind(&not_smi);
-    __ LoadClassId(R0, R0);
+    __ LoadClassId(R0, R0, kNoPP);
     __ SmiTag(R0);
     __ Bind(&done);
   }
@@ -1386,12 +1382,12 @@
         __ b(&done);
 
         __ Bind(&not_smi);
-        __ LoadClassId(R0, R0);
+        __ LoadClassId(R0, R0, kNoPP);
         __ SmiTag(R0);
         __ Bind(&done);
       }
       // R0: next argument class ID (smi).
-      __ LoadFromOffset(R1, R6, i * kWordSize);
+      __ LoadFromOffset(R1, R6, i * kWordSize, kNoPP);
       // R1: next class ID to check (smi).
     }
     __ CompareRegisters(R0, R1);  // Class id match?
@@ -1416,7 +1412,7 @@
       __ b(&done);
 
       __ Bind(&not_smi);
-      __ LoadClassId(R0, R0);
+      __ LoadClassId(R0, R0, kNoPP);
       __ SmiTag(R0);
       __ Bind(&done);
     }
@@ -1447,7 +1443,7 @@
   __ PushObject(Object::null_object(), PP);
   // Push call arguments.
   for (intptr_t i = 0; i < num_args; i++) {
-    __ LoadFromOffset(TMP, R7, -i * kWordSize);
+    __ LoadFromOffset(TMP, R7, -i * kWordSize, kNoPP);
     __ Push(TMP);
   }
   // Pass IC data object.
@@ -1468,18 +1464,18 @@
   // R6: pointer to an IC data check group.
   const intptr_t target_offset = ICData::TargetIndexFor(num_args) * kWordSize;
   const intptr_t count_offset = ICData::CountIndexFor(num_args) * kWordSize;
-  __ LoadFromOffset(R0, R6, target_offset);
-  __ LoadFromOffset(R1, R6, count_offset);
+  __ LoadFromOffset(R0, R6, target_offset, kNoPP);
+  __ LoadFromOffset(R1, R6, count_offset, kNoPP);
   __ adds(R1, R1, Operand(Smi::RawValue(1)));
-  __ StoreToOffset(R1, R6, count_offset);
+  __ StoreToOffset(R1, R6, count_offset, kNoPP);
   __ b(&call_target_function, VC);  // No overflow.
   __ LoadImmediate(R1, Smi::RawValue(Smi::kMaxValue), kNoPP);
-  __ StoreToOffset(R1, R6, count_offset);
+  __ StoreToOffset(R1, R6, count_offset, kNoPP);
 
   __ Bind(&call_target_function);
   // R0: target function.
-  __ LoadFieldFromOffset(R2, R0, Function::code_offset());
-  __ LoadFieldFromOffset(R2, R2, Code::instructions_offset());
+  __ LoadFieldFromOffset(R2, R0, Function::code_offset(), kNoPP);
+  __ LoadFieldFromOffset(R2, R2, Code::instructions_offset(), kNoPP);
   __ AddImmediate(
       R2, R2, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
   __ br(R2);
@@ -1553,7 +1549,7 @@
     // Check that the IC data array has NumArgsTested() == 0.
     // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
     __ LoadFromOffset(R6, R5, ICData::state_bits_offset() - kHeapObjectTag,
-                      kUnsignedWord);
+                      kNoPP, kUnsignedWord);
     ASSERT(ICData::NumArgsTestedShift() == 0);  // No shift needed.
     __ andi(R6, R6, ICData::NumArgsTestedMask());
     __ CompareImmediate(R6, 0, kNoPP);
@@ -1565,8 +1561,9 @@
 
   // Check single stepping.
   Label not_stepping;
-  __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset());
-  __ LoadFromOffset(R6, R6, Isolate::single_step_offset(), kUnsignedByte);
+  __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadFromOffset(
+      R6, R6, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
   __ CompareImmediate(R6, 0, kNoPP);
   __ b(&not_stepping, EQ);
   __ EnterStubFrame();
@@ -1577,7 +1574,7 @@
   __ Bind(&not_stepping);
 
   // R5: IC data object (preserved).
-  __ LoadFieldFromOffset(R6, R5, ICData::ic_data_offset());
+  __ LoadFieldFromOffset(R6, R5, ICData::ic_data_offset(), kNoPP);
   // R6: ic_data_array with entries: target functions and count.
   __ AddImmediate(R6, R6, Array::data_offset() - kHeapObjectTag, kNoPP);
   // R6: points directly to the first ic data array element.
@@ -1586,24 +1583,24 @@
 
   // Increment count for this call.
   Label increment_done;
-  __ LoadFromOffset(R1, R6, count_offset);
+  __ LoadFromOffset(R1, R6, count_offset, kNoPP);
   __ adds(R1, R1, Operand(Smi::RawValue(1)));
-  __ StoreToOffset(R1, R6, count_offset);
+  __ StoreToOffset(R1, R6, count_offset, kNoPP);
   __ b(&increment_done, VC);  // No overflow.
   __ LoadImmediate(R1, Smi::RawValue(Smi::kMaxValue), kNoPP);
-  __ StoreToOffset(R1, R6, count_offset);
+  __ StoreToOffset(R1, R6, count_offset, kNoPP);
   __ Bind(&increment_done);
 
   // Load arguments descriptor into R4.
-  __ LoadFieldFromOffset(R4, R5, ICData::arguments_descriptor_offset());
+  __ LoadFieldFromOffset(R4, R5, ICData::arguments_descriptor_offset(), kNoPP);
 
   // Get function and call it, if possible.
-  __ LoadFromOffset(R0, R6, target_offset);
-  __ LoadFieldFromOffset(R2, R0, Function::code_offset());
+  __ LoadFromOffset(R0, R6, target_offset, kNoPP);
+  __ LoadFieldFromOffset(R2, R0, Function::code_offset(), kNoPP);
 
   // R0: function.
   // R2: target code.
-  __ LoadFieldFromOffset(R2, R2, Code::instructions_offset());
+  __ LoadFieldFromOffset(R2, R2, Code::instructions_offset(), kNoPP);
   __ AddImmediate(
       R2, R2, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
   __ br(R2);
@@ -1611,7 +1608,9 @@
 
 
 void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
-  __ Stop("GenerateTwoArgsUnoptimizedStaticCallStub");
+  GenerateUsageCounterIncrement(assembler, R6);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry);
 }
 
 
@@ -1631,8 +1630,8 @@
   __ Pop(R5);  // Restore IC Data.
   __ LeaveStubFrame();
 
-  __ LoadFieldFromOffset(R2, R0, Function::code_offset());
-  __ LoadFieldFromOffset(R2, R2, Code::instructions_offset());
+  __ LoadFieldFromOffset(R2, R0, Function::code_offset(), kNoPP);
+  __ LoadFieldFromOffset(R2, R2, Code::instructions_offset(), kNoPP);
   __ AddImmediate(
       R2, R2, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
   __ br(R2);
@@ -1640,7 +1639,16 @@
 
 
 void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) {
-  __ Stop("GenerateBreakpointRuntimeStub");
+  __ EnterStubFrame();
+  __ Push(R5);  // Save IC Data.
+  __ Push(R4);  // Save arg. desc.
+  __ PushObject(Object::null_object(), PP);  // Space for result.
+  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
+  __ Pop(R0);
+  __ Pop(R4);
+  __ Pop(R5);
+  __ LeaveStubFrame();
+  __ br(R0);
 }
 
 
@@ -1649,8 +1657,9 @@
     Assembler* assembler) {
   // Check single stepping.
   Label not_stepping;
-  __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset());
-  __ LoadFromOffset(R1, R1, Isolate::single_step_offset(), kUnsignedByte);
+  __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadFromOffset(
+      R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
   __ CompareImmediate(R1, 0, kNoPP);
   __ b(&not_stepping, EQ);
   __ EnterStubFrame();
@@ -1671,25 +1680,25 @@
   ASSERT((1 <= n) && (n <= 3));
   if (n > 1) {
     // Get instance type arguments.
-    __ LoadClass(R3, R0);
+    __ LoadClass(R3, R0, kNoPP);
     // Compute instance type arguments into R4.
     Label has_no_type_arguments;
     __ LoadObject(R4, Object::null_object(), PP);
     __ LoadFieldFromOffset(
-        R5, R3, Class::type_arguments_field_offset_in_words_offset());
+        R5, R3, Class::type_arguments_field_offset_in_words_offset(), kNoPP);
     __ CompareImmediate(R5, Class::kNoTypeArguments, kNoPP);
     __ b(&has_no_type_arguments, EQ);
     __ add(R5, R0, Operand(R5, LSL, 3));
-    __ LoadFieldFromOffset(R4, R5, 0);
+    __ LoadFieldFromOffset(R4, R5, 0, kNoPP);
     __ Bind(&has_no_type_arguments);
   }
-  __ LoadClassId(R3, R0);
+  __ LoadClassId(R3, R0, kNoPP);
   // R0: instance.
   // R1: instantiator type arguments or NULL.
   // R2: SubtypeTestCache.
   // R3: instance class id.
   // R4: instance type arguments (null if none), used only if n > 1.
-  __ LoadFieldFromOffset(R2, R2, SubtypeTestCache::cache_offset());
+  __ LoadFieldFromOffset(R2, R2, SubtypeTestCache::cache_offset(), kNoPP);
   __ AddImmediate(R2, R2, Array::data_offset() - kHeapObjectTag, kNoPP);
 
   Label loop, found, not_found, next_iteration;
@@ -1698,7 +1707,8 @@
   // R4: instance type arguments.
   __ SmiTag(R3);
   __ Bind(&loop);
-  __ LoadFromOffset(R5, R2, kWordSize * SubtypeTestCache::kInstanceClassId);
+  __ LoadFromOffset(
+      R5, R2, kWordSize * SubtypeTestCache::kInstanceClassId, kNoPP);
   __ CompareObject(R5, Object::null_object(), PP);
   __ b(&not_found, EQ);
   __ CompareRegisters(R5, R3);
@@ -1707,14 +1717,14 @@
   } else {
     __ b(&next_iteration, NE);
     __ LoadFromOffset(
-        R5, R2, kWordSize * SubtypeTestCache::kInstanceTypeArguments);
+        R5, R2, kWordSize * SubtypeTestCache::kInstanceTypeArguments, kNoPP);
     __ CompareRegisters(R5, R4);
     if (n == 2) {
       __ b(&found, EQ);
     } else {
       __ b(&next_iteration, NE);
-      __ LoadFromOffset(
-          R5, R2, kWordSize * SubtypeTestCache::kInstantiatorTypeArguments);
+      __ LoadFromOffset(R5, R2,
+          kWordSize * SubtypeTestCache::kInstantiatorTypeArguments, kNoPP);
       __ CompareRegisters(R5, R1);
       __ b(&found, EQ);
     }
@@ -1729,7 +1739,7 @@
   __ ret();
 
   __ Bind(&found);
-  __ LoadFromOffset(R1, R2, kWordSize * SubtypeTestCache::kTestResult);
+  __ LoadFromOffset(R1, R2, kWordSize * SubtypeTestCache::kTestResult, kNoPP);
   __ ret();
 }
 
@@ -1790,7 +1800,7 @@
   __ Pop(R0);  // Discard argument.
   __ Pop(R0);  // Get Code object
   __ Pop(R4);  // Restore argument descriptor.
-  __ LoadFieldFromOffset(R0, R0, Code::instructions_offset());
+  __ LoadFieldFromOffset(R0, R0, Code::instructions_offset(), kNoPP);
   __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag, PP);
   __ LeaveStubFrame();
   __ br(R0);
@@ -1823,35 +1833,35 @@
   __ b(&reference_compare, EQ);
 
   // Value compare for two doubles.
-  __ CompareClassId(left, kDoubleCid);
+  __ CompareClassId(left, kDoubleCid, kNoPP);
   __ b(&check_mint, NE);
-  __ CompareClassId(right, kDoubleCid);
+  __ CompareClassId(right, kDoubleCid, kNoPP);
   __ b(&done, NE);
 
   // Double values bitwise compare.
-  __ LoadFieldFromOffset(left, left, Double::value_offset());
-  __ LoadFieldFromOffset(right, right, Double::value_offset());
+  __ LoadFieldFromOffset(left, left, Double::value_offset(), kNoPP);
+  __ LoadFieldFromOffset(right, right, Double::value_offset(), kNoPP);
   __ CompareRegisters(left, right);
   __ b(&done);
 
   __ Bind(&check_mint);
-  __ CompareClassId(left, kMintCid);
+  __ CompareClassId(left, kMintCid, kNoPP);
   __ b(&check_bigint, NE);
-  __ CompareClassId(right, kMintCid);
+  __ CompareClassId(right, kMintCid, kNoPP);
   __ b(&done, NE);
-  __ LoadFieldFromOffset(left, left, Mint::value_offset());
-  __ LoadFieldFromOffset(right, right, Mint::value_offset());
+  __ LoadFieldFromOffset(left, left, Mint::value_offset(), kNoPP);
+  __ LoadFieldFromOffset(right, right, Mint::value_offset(), kNoPP);
   __ b(&done);
 
   __ Bind(&check_bigint);
-  __ CompareClassId(left, kBigintCid);
+  __ CompareClassId(left, kBigintCid, kNoPP);
   __ b(&reference_compare, NE);
-  __ CompareClassId(right, kBigintCid);
+  __ CompareClassId(right, kBigintCid, kNoPP);
   __ b(&done, NE);
   __ EnterFrame(0);
   __ ReserveAlignedFrameSpace(2 * kWordSize);
-  __ StoreToOffset(left, SP, 0 * kWordSize);
-  __ StoreToOffset(right, SP, 1 * kWordSize);
+  __ StoreToOffset(left, SP, 0 * kWordSize, kNoPP);
+  __ StoreToOffset(right, SP, 1 * kWordSize, kNoPP);
   __ CallRuntime(kBigintCompareRuntimeEntry, 2);
   // Result in R0, 0 means equal.
   __ LeaveFrame();
@@ -1873,8 +1883,9 @@
     Assembler* assembler) {
   // Check single stepping.
   Label not_stepping;
-  __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset());
-  __ LoadFromOffset(R1, R1, Isolate::single_step_offset(), kUnsignedByte);
+  __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadFromOffset(
+      R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
   __ CompareImmediate(R1, 0, kNoPP);
   __ b(&not_stepping, EQ);
   __ EnterStubFrame();
@@ -1884,8 +1895,8 @@
 
   const Register left = R1;
   const Register right = R0;
-  __ LoadFromOffset(left, SP, 1 * kWordSize);
-  __ LoadFromOffset(right, SP, 0 * kWordSize);
+  __ LoadFromOffset(left, SP, 1 * kWordSize, kNoPP);
+  __ LoadFromOffset(right, SP, 0 * kWordSize, kNoPP);
   GenerateIdenticalWithNumberCheckStub(assembler, left, right);
   __ ret();
 }
@@ -1901,8 +1912,8 @@
   const Register temp = R2;
   const Register left = R1;
   const Register right = R0;
-  __ LoadFromOffset(left, SP, 1 * kWordSize);
-  __ LoadFromOffset(right, SP, 0 * kWordSize);
+  __ LoadFromOffset(left, SP, 1 * kWordSize, kNoPP);
+  __ LoadFromOffset(right, SP, 0 * kWordSize, kNoPP);
   GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp);
   __ ret();
 }
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 4f96395..28b67ac 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -599,128 +599,122 @@
 
 // Called for inline allocation of arrays.
 // Input parameters:
-//   EDX : Array length as Smi.
+//   EDX : Array length as Smi (must be preserved).
 //   ECX : array element type (either NULL or an instantiated type).
 // Uses EAX, EBX, ECX, EDI  as temporary registers.
-// NOTE: EDX cannot be clobbered here as the caller relies on it being saved.
 // The newly allocated object is returned in EAX.
 void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
   Label slow_case;
   const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
 
-  if (FLAG_inline_alloc) {
-    // Compute the size to be allocated, it is based on the array length
-    // and is computed as:
-    // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
-    // Assert that length is a Smi.
-    __ testl(EDX, Immediate(kSmiTagMask));
-    if (FLAG_use_slow_path) {
-      __ jmp(&slow_case);
-    } else {
-      __ j(NOT_ZERO, &slow_case);
-    }
-    __ movl(EDI, FieldAddress(CTX, Context::isolate_offset()));
-    __ movl(EDI, Address(EDI, Isolate::heap_offset()));
-    __ movl(EDI, Address(EDI, Heap::new_space_offset()));
+  // Compute the size to be allocated, it is based on the array length
+  // and is computed as:
+  // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
+  // Assert that length is a Smi.
+  __ testl(EDX, Immediate(kSmiTagMask));
+  if (FLAG_use_slow_path) {
+    __ jmp(&slow_case);
+  } else {
+    __ j(NOT_ZERO, &slow_case);
+  }
+  __ cmpl(EDX, Immediate(0));
+  __ j(LESS,  &slow_case);
 
-    // Calculate and align allocation size.
-    // Load new object start and calculate next object start.
-    // ECX: array element type.
-    // EDX: Array length as Smi.
-    // EDI: Points to new space object.
-    __ movl(EAX, Address(EDI, Scavenger::top_offset()));
-    intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
-    __ leal(EBX, Address(EDX, TIMES_2, fixed_size));  // EDX is Smi.
-    ASSERT(kSmiTagShift == 1);
-    __ andl(EBX, Immediate(-kObjectAlignment));
-    __ leal(EBX, Address(EAX, EBX, TIMES_1, 0));
+  // Check for maximum allowed length.
+  const Immediate& max_len =
+      Immediate(reinterpret_cast<int32_t>(Smi::New(Array::kMaxElements)));
+  __ cmpl(EDX, max_len);
+  __ j(GREATER, &slow_case);
 
-    // Check if the allocation fits into the remaining space.
-    // EAX: potential new object start.
-    // EBX: potential next object start.
-    // ECX: array element type.
-    // EDX: Array length as Smi.
-    // EDI: Points to new space object.
-    __ cmpl(EBX, Address(EDI, Scavenger::end_offset()));
-    __ j(ABOVE_EQUAL, &slow_case);
+  const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
+  __ leal(EDI, Address(EDX, TIMES_2, fixed_size));  // EDX is Smi.
+  ASSERT(kSmiTagShift == 1);
+  __ andl(EDI, Immediate(-kObjectAlignment));
 
-    // Successfully allocated the object(s), now update top to point to
-    // next object start and initialize the object.
-    // EAX: potential new object start.
-    // EBX: potential next object start.
-    // EDX: Array length as Smi.
-    // EDI: Points to new space object.
-    __ movl(Address(EDI, Scavenger::top_offset()), EBX);
-    __ addl(EAX, Immediate(kHeapObjectTag));
-    // EDI: Size of allocation in bytes.
-    __ movl(EDI, EBX);
-    __ subl(EDI, EAX);
-    __ UpdateAllocationStatsWithSize(kArrayCid, EDI, kNoRegister);
+  // ECX: array element type.
+  // EDX: array length as Smi.
+  // EDI: allocation size.
 
-    // EAX: new object start as a tagged pointer.
-    // EBX: new object end address.
-    // ECX: array element type.
-    // EDX: Array length as Smi.
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
 
-    // Store the type argument field.
-    __ StoreIntoObjectNoBarrier(
-        EAX,
-        FieldAddress(EAX, Array::type_arguments_offset()),
-        ECX);
+  __ movl(EAX, Address::Absolute(heap->TopAddress()));
+  __ movl(EBX, EAX);
 
-    // Set the length field.
-    __ StoreIntoObjectNoBarrier(
-        EAX,
-        FieldAddress(EAX, Array::length_offset()),
-        EDX);
+  // EDI: allocation size.
+  __ addl(EBX, EDI);
+  __ j(CARRY, &slow_case);
 
-    // Calculate the size tag.
-    // EAX: new object start as a tagged pointer.
-    // EBX: new object end address.
-    // EDX: Array length as Smi.
-    {
-      Label size_tag_overflow, done;
-      __ leal(ECX, Address(EDX, TIMES_2, fixed_size));  // EDX is Smi.
-      ASSERT(kSmiTagShift == 1);
-      __ andl(ECX, Immediate(-kObjectAlignment));
-      __ cmpl(ECX, Immediate(RawObject::SizeTag::kMaxSizeTag));
-      __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-      __ shll(ECX, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));
-      __ jmp(&done);
+  // Check if the allocation fits into the remaining space.
+  // EAX: potential new object start.
+  // EBX: potential next object start.
+  // EDI: allocation size.
+  // ECX: array element type.
+  // EDX: array length as Smi).
+  __ cmpl(EBX, Address::Absolute(heap->EndAddress()));
+  __ j(ABOVE_EQUAL, &slow_case);
 
-      __ Bind(&size_tag_overflow);
-      __ movl(ECX, Immediate(0));
-      __ Bind(&done);
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  __ movl(Address::Absolute(heap->TopAddress()), EBX);
+  __ addl(EAX, Immediate(kHeapObjectTag));
+  __ UpdateAllocationStatsWithSize(kArrayCid, EDI, kNoRegister);
 
-      // Get the class index and insert it into the tags.
-      __ orl(ECX, Immediate(RawObject::ClassIdTag::encode(kArrayCid)));
-      __ movl(FieldAddress(EAX, Array::tags_offset()), ECX);
-    }
+  // Initialize the tags.
+  // EAX: new object start as a tagged pointer.
+  // EBX: new object end address.
+  // EDI: allocation size.
+  // ECX: array element type.
+  // EDX: array length as Smi.
+  {
+    Label size_tag_overflow, done;
+    __ cmpl(EDI, Immediate(RawObject::SizeTag::kMaxSizeTag));
+    __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
+    __ shll(EDI, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));
+    __ jmp(&done, Assembler::kNearJump);
 
-    // Initialize all array elements to raw_null.
-    // EAX: new object start as a tagged pointer.
-    // EBX: new object end address.
-    // EDX: Array length as Smi.
-    __ leal(ECX, FieldAddress(EAX, Array::data_offset()));
-    // ECX: iterator which initially points to the start of the variable
-    // data area to be initialized.
-    Label done;
-    Label init_loop;
-    __ Bind(&init_loop);
-    __ cmpl(ECX, EBX);
-    __ j(ABOVE_EQUAL, &done, Assembler::kNearJump);
-    // TODO(cshapiro): StoreIntoObjectNoBarrier
-    __ movl(Address(ECX, 0), raw_null);
-    __ addl(ECX, Immediate(kWordSize));
-    __ jmp(&init_loop, Assembler::kNearJump);
+    __ Bind(&size_tag_overflow);
+    __ movl(EDI, Immediate(0));
     __ Bind(&done);
 
-    // Done allocating and initializing the array.
-    // EAX: new object.
-    // EDX: Array length as Smi (preserved for the caller.)
-    __ ret();
+    // Get the class index and insert it into the tags.
+    const Class& cls = Class::Handle(isolate->object_store()->array_class());
+    __ orl(EDI, Immediate(RawObject::ClassIdTag::encode(cls.id())));
+    __ movl(FieldAddress(EAX, Array::tags_offset()), EDI);  // Tags.
   }
+  // EAX: new object start as a tagged pointer.
+  // EBX: new object end address.
+  // ECX: array element type.
+  // EDX: Array length as Smi (preserved).
+  // Store the type argument field.
+  __ StoreIntoObjectNoBarrier(EAX,
+                              FieldAddress(EAX, Array::type_arguments_offset()),
+                              ECX);
+
+  // Set the length field.
+  __ StoreIntoObjectNoBarrier(EAX,
+                              FieldAddress(EAX, Array::length_offset()),
+                              EDX);
+
+  // Initialize all array elements to raw_null.
+  // EAX: new object start as a tagged pointer.
+  // EBX: new object end address.
+  // EDI: iterator which initially points to the start of the variable
+  // data area to be initialized.
+  // ECX: array element type.
+  // EDX: array length as Smi.
+  __ leal(EDI, FieldAddress(EAX, sizeof(RawArray)));
+  Label done;
+  Label init_loop;
+  __ Bind(&init_loop);
+  __ cmpl(EDI, EBX);
+  __ j(ABOVE_EQUAL, &done, Assembler::kNearJump);
+  __ movl(Address(EDI, 0), raw_null);
+  __ addl(EDI, Immediate(kWordSize));
+  __ jmp(&init_loop, Assembler::kNearJump);
+  __ Bind(&done);
+  __ ret();  // returns the newly allocated object in EAX.
 
   // Unable to allocate the array using the fast inline code, just call
   // into the runtime.
@@ -733,7 +727,7 @@
   __ pushl(ECX);  // Element type.
   __ CallRuntime(kAllocateArrayRuntimeEntry, 2);
   __ popl(EAX);  // Pop element type argument.
-  __ popl(EDX);  // Pop array length argument.
+  __ popl(EDX);  // Pop array length argument (preserved).
   __ popl(EAX);  // Pop return value from return slot.
   __ LeaveFrame();
   __ ret();
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 4c9777a..ea9c76c 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -682,122 +682,118 @@
 // Called for inline allocation of arrays.
 // Input parameters:
 //   RA: return address.
-//   A1: Array length as Smi.
+//   A1: Array length as Smi (must be preserved).
 //   A0: array element type (either NULL or an instantiated type).
 // NOTE: A1 cannot be clobbered here as the caller relies on it being saved.
 // The newly allocated object is returned in V0.
 void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
   __ TraceSimMsg("AllocateArrayStub");
   Label slow_case;
-  if (FLAG_inline_alloc) {
-    // Compute the size to be allocated, it is based on the array length
-    // and is computed as:
-    // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
-    // Assert that length is a Smi.
-    __ andi(CMPRES1, A1, Immediate(kSmiTagMask));
-    if (FLAG_use_slow_path) {
-      __ b(&slow_case);
-    } else {
-      __ bne(CMPRES1, ZR, &slow_case);
-    }
-    __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
-    __ lw(T0, Address(T0, Isolate::heap_offset()));
-    __ lw(T0, Address(T0, Heap::new_space_offset()));
 
-    // Calculate and align allocation size.
-    // Load new object start and calculate next object start.
-    // A0: array element type.
-    // A1: Array length as Smi.
-    // T0: Points to new space object.
-    __ lw(V0, Address(T0, Scavenger::top_offset()));
-    intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
-    __ LoadImmediate(T3, fixed_size);
-    __ sll(TMP, A1, 1);  // A1 is Smi.
-    __ addu(T3, T3, TMP);
-    ASSERT(kSmiTagShift == 1);
-    __ LoadImmediate(TMP, ~(kObjectAlignment - 1));
-    __ and_(T3, T3, TMP);
-    __ addu(T2, T3, V0);
+  // Compute the size to be allocated, it is based on the array length
+  // and is computed as:
+  // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
+  __ mov(T3, A1);  // Array length.
 
-    // Check if the allocation fits into the remaining space.
-    // V0: potential new object start.
-    // A0: array element type.
-    // A1: array length as Smi.
-    // T0: points to new space object.
-    // T2: potential next object start.
-    // T3: array size.
-    __ lw(CMPRES1, Address(T0, Scavenger::end_offset()));
-    __ BranchUnsignedGreaterEqual(T2, CMPRES1, &slow_case);
+  // Check that length is a positive Smi.
+  __ andi(CMPRES1, T3, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, &slow_case);
+  __ bltz(T3, &slow_case);
 
-    // Successfully allocated the object(s), now update top to point to
-    // next object start and initialize the object.
-    // V0: potential new object start.
-    // T2: potential next object start.
-    // T0: Points to new space object.
-    __ sw(T2, Address(T0, Scavenger::top_offset()));
-    __ addiu(V0, V0, Immediate(kHeapObjectTag));
-    // T1: Size of allocation in bytes.
-    __ subu(T1, T2, V0);
-    __ UpdateAllocationStatsWithSize(kArrayCid, T1, T5);
+  // Check for maximum allowed length.
+  const intptr_t max_len =
+      reinterpret_cast<int32_t>(Smi::New(Array::kMaxElements));
+  __ BranchUnsignedGreater(T3, max_len, &slow_case);
 
-    // V0: new object start as a tagged pointer.
-    // A0: array element type.
-    // A1: Array length as Smi.
-    // T2: new object end address.
+  const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
+  __ LoadImmediate(T2, fixed_size);
+  __ sll(T3, T3, 1);  // T3 is  a Smi.
+  __ addu(T2, T2, T3);
+  ASSERT(kSmiTagShift == 1);
+  __ LoadImmediate(T3, ~(kObjectAlignment - 1));
+  __ and_(T2, T2, T3);
 
-    // Store the type argument field.
-    __ StoreIntoObjectNoBarrier(
-        V0,
-        FieldAddress(V0, Array::type_arguments_offset()),
-        A0);
+  // T2: Allocation size.
 
-    // Set the length field.
-    __ StoreIntoObjectNoBarrier(
-        V0,
-        FieldAddress(V0, Array::length_offset()),
-        A1);
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
 
-    // Calculate the size tag.
-    // V0: new object start as a tagged pointer.
-    // A1: Array length as Smi.
-    // T2: new object end address.
-    // T3: array size.
+  __ LoadImmediate(T3, heap->TopAddress());
+  __ lw(T0, Address(T3, 0));  // Potential new object start.
+
+  __ AdduDetectOverflow(T1, T0, T2, CMPRES1);  // Potential next object start.
+  __ bltz(CMPRES1, &slow_case);  // CMPRES1 < 0 on overflow.
+
+  // Check if the allocation fits into the remaining space.
+  // T0: potential new object start.
+  // T1: potential next object start.
+  // T2: allocation size.
+  __ LoadImmediate(T4, heap->EndAddress());
+  __ lw(T4, Address(T4, 0));
+  __ BranchUnsignedGreaterEqual(T1, T4, &slow_case);
+
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  __ sw(T1, Address(T3, 0));
+  __ addiu(T0, T0, Immediate(kHeapObjectTag));
+  __ UpdateAllocationStatsWithSize(kArrayCid, T2, T4);
+
+  // Initialize the tags.
+  // T0: new object start as a tagged pointer.
+  // T1: new object end address.
+  // T2: allocation size.
+  {
+    Label overflow, done;
     const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
-    // If no size tag overflow, shift T3 left, else set T3 to zero.
-    __ LoadImmediate(T4, RawObject::SizeTag::kMaxSizeTag);
-    __ sltu(CMPRES1, T4, T3);  // CMPRES1 = T4 < T3 ? 1 : 0
-    __ sll(TMP, T3, shift);  // TMP = T3 << shift;
-    __ movz(T3, TMP, CMPRES1);  // T3 = T4 >= T3 ? 0 : T3
-    __ movn(T3, ZR, CMPRES1);  // T3 = T4 < T3 ? TMP : T3
+    const Class& cls = Class::Handle(isolate->object_store()->array_class());
+
+    __ BranchUnsignedGreater(T2, RawObject::SizeTag::kMaxSizeTag, &overflow);
+    __ b(&done);
+    __ delay_slot()->sll(T2, T2, shift);
+    __ Bind(&overflow);
+    __ mov(T2, ZR);
+    __ Bind(&done);
 
     // Get the class index and insert it into the tags.
-    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(kArrayCid));
-    __ or_(T3, T3, TMP);
-    __ sw(T3, FieldAddress(V0, Array::tags_offset()));
-
-    // Initialize all array elements to raw_null.
-    // V0: new object start as a tagged pointer.
-    // T2: new object end address.
-    // A1: Array length as Smi.
-    __ AddImmediate(T3, V0, Array::data_offset() - kHeapObjectTag);
-    // T3: iterator which initially points to the start of the variable
-    // data area to be initialized.
-
-    __ LoadImmediate(T7, reinterpret_cast<intptr_t>(Object::null()));
-    Label loop, loop_exit;
-    __ BranchUnsignedGreaterEqual(T3, T2, &loop_exit);
-    __ Bind(&loop);
-    __ addiu(T3, T3, Immediate(kWordSize));
-    __ bne(T3, T2, &loop);
-    __ delay_slot()->sw(T7, Address(T3, -kWordSize));
-    __ Bind(&loop_exit);
-
-    // Done allocating and initializing the array.
-    // V0: new object.
-    // A1: Array length as Smi (preserved for the caller.)
-    __ Ret();
+    // T2: size and bit tags.
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cls.id()));
+    __ or_(T2, T2, TMP);
+    __ sw(T2, FieldAddress(T0, Array::tags_offset()));  // Store tags.
   }
 
+  // T0: new object start as a tagged pointer.
+  // T1: new object end address.
+  // Store the type argument field.
+  __ StoreIntoObjectNoBarrier(T0,
+                              FieldAddress(T0, Array::type_arguments_offset()),
+                              A0);
+
+  // Set the length field.
+  __ StoreIntoObjectNoBarrier(T0,
+                              FieldAddress(T0, Array::length_offset()),
+                              A1);
+
+  __ LoadImmediate(T7, reinterpret_cast<int32_t>(Object::null()));
+  // Initialize all array elements to raw_null.
+  // T0: new object start as a tagged pointer.
+  // T1: new object end address.
+  // T2: iterator which initially points to the start of the variable
+  // data area to be initialized.
+  // T7: null.
+  __ AddImmediate(T2, T0, sizeof(RawArray) - kHeapObjectTag);
+
+  Label done;
+  Label init_loop;
+  __ Bind(&init_loop);
+  __ BranchUnsignedGreaterEqual(T2, T1, &done);
+  __ sw(T7, Address(T2, 0));
+  __ b(&init_loop);
+  __ delay_slot()->addiu(T2, T2, Immediate(kWordSize));
+  __ Bind(&done);
+
+  __ Ret();  // Returns the newly allocated object in V0.
+  __ delay_slot()->mov(V0, T0);
+
   // Unable to allocate the array using the fast inline code, just call
   // into the runtime.
   __ Bind(&slow_case);
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index e8834e5..d6324d2 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -562,116 +562,99 @@
 // The newly allocated object is returned in RAX.
 void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
   Label slow_case;
+  // Compute the size to be allocated, it is based on the array length
+  // and is computed as:
+  // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
+  __ movq(RDI, R10);  // Array Length.
+  // Check that length is a positive Smi.
+  __ testq(RDI, Immediate(kSmiTagMask));
+  __ j(NOT_ZERO, &slow_case);
+  __ cmpq(RDI, Immediate(0));
+  __ j(LESS, &slow_case);
+  // Check for maximum allowed length.
+  const Immediate& max_len =
+      Immediate(reinterpret_cast<int64_t>(Smi::New(Array::kMaxElements)));
+  __ cmpq(RDI, max_len);
+  __ j(GREATER, &slow_case);
+  const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
+  __ leaq(RDI, Address(RDI, TIMES_4, fixed_size));  // RDI is a Smi.
+  ASSERT(kSmiTagShift == 1);
+  __ andq(RDI, Immediate(-kObjectAlignment));
 
-  if (FLAG_inline_alloc) {
-    // Compute the size to be allocated, it is based on the array length
-    // and is computed as:
-    // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
-    // Assert that length is a Smi.
-    __ testq(R10, Immediate(kSmiTagMask));
-    if (FLAG_use_slow_path) {
-      __ jmp(&slow_case);
-    } else {
-      __ j(NOT_ZERO, &slow_case);
-    }
-    __ movq(R13, FieldAddress(CTX, Context::isolate_offset()));
-    __ movq(R13, Address(R13, Isolate::heap_offset()));
-    __ movq(R13, Address(R13, Heap::new_space_offset()));
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
 
-    // Calculate and align allocation size.
-    // Load new object start and calculate next object start.
-    // RBX: array element type.
-    // R10: Array length as Smi.
-    // R13: Points to new space object.
-    __ movq(RAX, Address(R13, Scavenger::top_offset()));
-    intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
-    __ leaq(R12, Address(R10, TIMES_4, fixed_size));  // R10 is Smi.
-    ASSERT(kSmiTagShift == 1);
-    __ andq(R12, Immediate(-kObjectAlignment));
-    __ leaq(R12, Address(RAX, R12, TIMES_1, 0));
+  __ movq(RAX, Immediate(heap->TopAddress()));
+  __ movq(RAX, Address(RAX, 0));
 
-    // Check if the allocation fits into the remaining space.
-    // RAX: potential new object start.
-    // R12: potential next object start.
-    // RBX: array element type.
-    // R10: Array length as Smi.
-    // R13: Points to new space object.
-    __ cmpq(R12, Address(R13, Scavenger::end_offset()));
-    __ j(ABOVE_EQUAL, &slow_case);
+  // RDI: allocation size.
+  __ movq(RCX, RAX);
+  __ addq(RCX, RDI);
+  __ j(CARRY, &slow_case);
 
-    // Successfully allocated the object(s), now update top to point to
-    // next object start and initialize the object.
-    // RAX: potential new object start.
-    // R12: potential next object start.
-    // R13: Points to new space object.
-    __ movq(Address(R13, Scavenger::top_offset()), R12);
-    __ addq(RAX, Immediate(kHeapObjectTag));
-    // R13: Size of allocation in bytes.
-    __ movq(R13, R12);
-    __ subq(R13, RAX);
-    __ UpdateAllocationStatsWithSize(kArrayCid, R13);
+  // Check if the allocation fits into the remaining space.
+  // RAX: potential new object start.
+  // RCX: potential next object start.
+  // RDI: allocation size.
+  __ movq(R13, Immediate(heap->EndAddress()));
+  __ cmpq(RCX, Address(R13, 0));
+  __ j(ABOVE_EQUAL, &slow_case);
 
-    // RAX: new object start as a tagged pointer.
-    // R12: new object end address.
-    // RBX: array element type.
-    // R10: Array length as Smi.
+  // Successfully allocated the object(s), now update top to point to
+  // next object start and initialize the object.
+  __ movq(R13, Immediate(heap->TopAddress()));
+  __ movq(Address(R13, 0), RCX);
+  __ addq(RAX, Immediate(kHeapObjectTag));
+  __ UpdateAllocationStatsWithSize(kArrayCid, RDI);
+  // Initialize the tags.
+  // RAX: new object start as a tagged pointer.
+  // RDI: allocation size.
+  {
+    Label size_tag_overflow, done;
+    __ cmpq(RDI, Immediate(RawObject::SizeTag::kMaxSizeTag));
+    __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
+    __ shlq(RDI, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));
+    __ jmp(&done, Assembler::kNearJump);
 
-    // Store the type argument field.
-    __ StoreIntoObjectNoBarrier(
-        RAX, FieldAddress(RAX, Array::type_arguments_offset()), RBX);
-
-    // Set the length field.
-    __ StoreIntoObjectNoBarrier(
-        RAX, FieldAddress(RAX, Array::length_offset()), R10);
-
-    // Calculate the size tag.
-    // RAX: new object start as a tagged pointer.
-    // R12: new object end address.
-    // R10: Array length as Smi.
-    {
-      Label size_tag_overflow, done;
-      __ leaq(RBX, Address(R10, TIMES_4, fixed_size));  // R10 is Smi.
-      ASSERT(kSmiTagShift == 1);
-      __ andq(RBX, Immediate(-kObjectAlignment));
-      __ cmpq(RBX, Immediate(RawObject::SizeTag::kMaxSizeTag));
-      __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-      __ shlq(RBX, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));
-      __ jmp(&done);
-
-      __ Bind(&size_tag_overflow);
-      __ movq(RBX, Immediate(0));
-      __ Bind(&done);
-
-      // Get the class index and insert it into the tags.
-      __ orq(RBX, Immediate(RawObject::ClassIdTag::encode(kArrayCid)));
-      __ movq(FieldAddress(RAX, Array::tags_offset()), RBX);
-    }
-
-    // Initialize all array elements to raw_null.
-    // RAX: new object start as a tagged pointer.
-    // R12: new object end address.
-    // R10: Array length as Smi.
-    __ leaq(RBX, FieldAddress(RAX, Array::data_offset()));
-    // RBX: iterator which initially points to the start of the variable
-    // data area to be initialized.
-    __ LoadObject(R13, Object::null_object(), PP);
-    Label done;
-    Label init_loop;
-    __ Bind(&init_loop);
-    __ cmpq(RBX, R12);
-    __ j(ABOVE_EQUAL, &done, Assembler::kNearJump);
-    // TODO(cshapiro): StoreIntoObjectNoBarrier
-    __ movq(Address(RBX, 0), R13);
-    __ addq(RBX, Immediate(kWordSize));
-    __ jmp(&init_loop, Assembler::kNearJump);
+    __ Bind(&size_tag_overflow);
+    __ movq(RDI, Immediate(0));
     __ Bind(&done);
 
-    // Done allocating and initializing the array.
-    // RAX: new object.
-    // R10: Array length as Smi (preserved for the caller.)
-    __ ret();
+    // Get the class index and insert it into the tags.
+    const Class& cls = Class::Handle(isolate->object_store()->array_class());
+    __ orq(RDI, Immediate(RawObject::ClassIdTag::encode(cls.id())));
+    __ movq(FieldAddress(RAX, Array::tags_offset()), RDI);  // Tags.
   }
 
+  // RAX: new object start as a tagged pointer.
+  // Store the type argument field.
+  __ StoreIntoObjectNoBarrier(RAX,
+                              FieldAddress(RAX, Array::type_arguments_offset()),
+                              RBX);
+
+  // Set the length field.
+  __ StoreIntoObjectNoBarrier(RAX,
+                              FieldAddress(RAX, Array::length_offset()),
+                              R10);
+
+  // Initialize all array elements to raw_null.
+  // RAX: new object start as a tagged pointer.
+  // RCX: new object end address.
+  // RDI: iterator which initially points to the start of the variable
+  // data area to be initialized.
+  __ LoadObject(R12, Object::null_object(), PP);
+  __ leaq(RDI, FieldAddress(RAX, sizeof(RawArray)));
+  Label done;
+  Label init_loop;
+  __ Bind(&init_loop);
+  __ cmpq(RDI, RCX);
+  __ j(ABOVE_EQUAL, &done, Assembler::kNearJump);
+  __ movq(Address(RDI, 0), R12);
+  __ addq(RDI, Immediate(kWordSize));
+  __ jmp(&init_loop, Assembler::kNearJump);
+  __ Bind(&done);
+  __ ret();  // returns the newly allocated object in RAX.
+
   // Unable to allocate the array using the fast inline code, just call
   // into the runtime.
   __ Bind(&slow_case);
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index 0116236..754de7e 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -151,11 +151,10 @@
 }
 
 
-RawString* Symbols::New(const char* cstr) {
-  ASSERT(cstr != NULL);
-  intptr_t array_len = strlen(cstr);
+RawString* Symbols::New(const char* cstr, intptr_t len) {
+  ASSERT((cstr != NULL) && (len >= 0));
   const uint8_t* utf8_array = reinterpret_cast<const uint8_t*>(cstr);
-  return Symbols::FromUTF8(utf8_array, array_len);
+  return Symbols::FromUTF8(utf8_array, len);
 }
 
 
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 77c0455..a7eb3f0 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -254,6 +254,7 @@
   V(IsolateSpawnException, "IsolateSpawnException")                            \
   V(IsolateUnhandledException, "_IsolateUnhandledException")                   \
   V(JavascriptIntegerOverflowError, "_JavascriptIntegerOverflowError")         \
+  V(JavascriptCompatibilityError, "_JavascriptCompatibilityError")             \
   V(MirroredCompilationError, "MirroredCompilationError")                      \
   V(_setupFullStackTrace, "_setupFullStackTrace")                              \
   V(BooleanExpression, "boolean expression")                                   \
@@ -442,7 +443,10 @@
   // Creates a Symbol given a C string that is assumed to contain
   // UTF-8 encoded characters and '\0' is considered a termination character.
   // TODO(7123) - Rename this to FromCString(....).
-  static RawString* New(const char* cstr);
+  static RawString* New(const char* cstr) {
+    return New(cstr, strlen(cstr));
+  }
+  static RawString* New(const char* cstr, intptr_t length);
 
   // Creates a new Symbol from an array of UTF-8 encoded characters.
   static RawString* FromUTF8(const uint8_t* utf8_array, intptr_t len);
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 1dc7b33..93b5ed8 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -81,7 +81,12 @@
     Dart_Handle builtin_lib =
         Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary);
     DART_CHECK_VALID(builtin_lib);
-    return DartUtils::CanonicalizeURL(NULL, library, url_chars);
+
+    Dart_Handle library_url = Dart_LibraryUrl(library);
+    if (Dart_IsError(library_url)) {
+      return library_url;
+    }
+    return DartUtils::ResolveUri(library_url, url, builtin_lib);
   }
   if (is_dart_scheme_url) {
     ASSERT(tag == Dart_kImportTag);
@@ -101,17 +106,14 @@
                            Builtin::PartSource(Builtin::kIOLibrary,
                                                url_chars));
   }
-  return DartUtils::LoadSource(NULL,
-                               library,
-                               url,
-                               tag,
-                               url_chars);
+  return DartUtils::LoadSource(library, url, tag, url_chars);
 }
 
 
 Dart_Handle TestCase::LoadTestScript(const char* script,
-                                     Dart_NativeEntryResolver resolver) {
-  Dart_Handle url = NewString(TestCase::url());
+                                     Dart_NativeEntryResolver resolver,
+                                     const char* lib_url) {
+  Dart_Handle url = NewString(lib_url);
   Dart_Handle source = NewString(script);
   Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler);
   EXPECT_VALID(result);
@@ -124,6 +126,12 @@
 }
 
 
+Dart_Handle TestCase::LoadCoreTestScript(const char* script,
+                                         Dart_NativeEntryResolver resolver) {
+  return LoadTestScript(script, resolver, CORELIB_TEST_URI);
+}
+
+
 Dart_Handle TestCase::lib() {
   Dart_Handle url = NewString(TestCase::url());
   Dart_Handle lib = Dart_LookupLibrary(url);
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 2e370e2..98b1926 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -90,7 +90,7 @@
     EXPECT(!result.IsError());                                                 \
     Instance& actual = Instance::Handle();                                     \
     actual ^= result.raw();                                                    \
-    EXPECT(actual.Equals(Instance::Handle(expected)));                         \
+    EXPECT(actual.CanonicalizeEquals(Instance::Handle(expected)));             \
   }
 
 
@@ -128,7 +128,7 @@
     EXPECT(!result.IsError());                                                 \
     Instance& actual = Instance::Handle();                                     \
     actual ^= result.raw();                                                    \
-    EXPECT(actual.Equals(Instance::Handle(expected)));                         \
+    EXPECT(actual.CanonicalizeEquals(Instance::Handle(expected)));             \
   }
 
 
@@ -233,6 +233,8 @@
   DISALLOW_COPY_AND_ASSIGN(TestCaseBase);
 };
 
+#define USER_TEST_URI "test-lib"
+#define CORELIB_TEST_URI "dart:test-lib"
 
 class TestCase : TestCaseBase {
  public:
@@ -241,9 +243,13 @@
   TestCase(RunEntry* run, const char* name) : TestCaseBase(name), run_(run) { }
 
   static Dart_Handle LoadTestScript(const char* script,
-                                    Dart_NativeEntryResolver resolver);
+                                    Dart_NativeEntryResolver resolver,
+                                    const char* lib_uri = USER_TEST_URI);
+
+  static Dart_Handle LoadCoreTestScript(const char* script,
+                                        Dart_NativeEntryResolver resolver);
   static Dart_Handle lib();
-  static const char* url() { return "dart:test-lib"; }
+  static const char* url() { return USER_TEST_URI; }
   static Dart_Isolate CreateTestIsolateFromSnapshot(uint8_t* buffer) {
     return CreateIsolate(buffer);
   }
diff --git a/sdk/lib/_blink/dartium/_blink_dartium.dart b/sdk/lib/_blink/dartium/_blink_dartium.dart
index 31c2153..0cac4d5 100644
--- a/sdk/lib/_blink/dartium/_blink_dartium.dart
+++ b/sdk/lib/_blink/dartium/_blink_dartium.dart
@@ -17,11 +17,13 @@
 import 'dart:nativewrappers';
 import 'dart:typed_data';
 import 'dart:web_gl' as gl;
+import 'dart:web_gl' show web_glBlinkMap;
 import 'dart:web_sql';
 import 'dart:svg' as svg;
 import 'dart:svg' show Matrix;
 import 'dart:svg' show SvgSvgElement;
-import 'dart:web_audio' show AudioNode, AudioParam;
+import 'dart:svg' show svgBlinkMap;
+import 'dart:web_audio' show AudioNode, AudioParam, web_audioBlinkMap;
 // 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.
@@ -38,19 +40,19 @@
 
 
 
-Native_ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback(mthis, mode, first, count, primcount) native "ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback";
+Native_ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback(mthis, mode, first, count, primcount) native "ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback_RESOLVER_STRING_4_unsigned long_long_long_long";
 
-Native_ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback(mthis, mode, count, type, offset, primcount) native "ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback";
+Native_ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback(mthis, mode, count, type, offset, primcount) native "ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback_RESOLVER_STRING_5_unsigned long_long_unsigned long_long long_long";
 
-Native_ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback(mthis, index, divisor) native "ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback";
+Native_ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback(mthis, index, divisor) native "ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback_RESOLVER_STRING_2_unsigned long_long";
 
 Native_Algorithm_name_Getter(mthis) native "Algorithm_name_Getter";
 
-Native_EventTarget_addEventListener_Callback(mthis, type, listener, useCapture) native "EventTarget_addEventListener_Callback";
+Native_EventTarget_addEventListener_Callback(mthis, type, listener, useCapture) native "EventTarget_addEventListener_Callback_RESOLVER_STRING_3_DOMString_EventListener_boolean";
 
-Native_EventTarget_dispatchEvent_Callback(mthis, event) native "EventTarget_dispatchEvent_Callback";
+Native_EventTarget_dispatchEvent_Callback(mthis, event) native "EventTarget_dispatchEvent_Callback_RESOLVER_STRING_1_Event";
 
-Native_EventTarget_removeEventListener_Callback(mthis, type, listener, useCapture) native "EventTarget_removeEventListener_Callback";
+Native_EventTarget_removeEventListener_Callback(mthis, type, listener, useCapture) native "EventTarget_removeEventListener_Callback_RESOLVER_STRING_3_DOMString_EventListener_boolean";
 
 Native_AudioNode_channelCount_Getter(mthis) native "AudioNode_channelCount_Getter";
 
@@ -83,17 +85,11 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_AudioNode__connect_1_Callback(mthis, destination, output, input) native "AudioNode__connect_1_Callback";
+Native_AudioNode__connect_1_Callback(mthis, destination, output, input) native "AudioNode_connect_Callback_RESOLVER_STRING_3_AudioNode_unsigned long_unsigned long";
 
-Native_AudioNode__connect_2_Callback(mthis, destination, output) native "AudioNode__connect_2_Callback";
+Native_AudioNode__connect_2_Callback(mthis, destination, output) native "AudioNode_connect_Callback_RESOLVER_STRING_2_AudioParam_unsigned long";
 
-Native_AudioNode_disconnect_Callback(mthis, output) native "AudioNode_disconnect_Callback";
-
-Native_AudioNode_addEventListener_Callback(mthis, type, listener, useCapture) native "AudioNode_addEventListener_Callback";
-
-Native_AudioNode_dispatchEvent_Callback(mthis, event) native "AudioNode_dispatchEvent_Callback";
-
-Native_AudioNode_removeEventListener_Callback(mthis, type, listener, useCapture) native "AudioNode_removeEventListener_Callback";
+Native_AudioNode_disconnect_Callback(mthis, output) native "AudioNode_disconnect_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_AnalyserNode_fftSize_Getter(mthis) native "AnalyserNode_fftSize_Getter";
 
@@ -113,11 +109,11 @@
 
 Native_AnalyserNode_smoothingTimeConstant_Setter(mthis, value) native "AnalyserNode_smoothingTimeConstant_Setter";
 
-Native_AnalyserNode_getByteFrequencyData_Callback(mthis, array) native "AnalyserNode_getByteFrequencyData_Callback";
+Native_AnalyserNode_getByteFrequencyData_Callback(mthis, array) native "AnalyserNode_getByteFrequencyData_Callback_RESOLVER_STRING_1_Uint8Array";
 
-Native_AnalyserNode_getByteTimeDomainData_Callback(mthis, array) native "AnalyserNode_getByteTimeDomainData_Callback";
+Native_AnalyserNode_getByteTimeDomainData_Callback(mthis, array) native "AnalyserNode_getByteTimeDomainData_Callback_RESOLVER_STRING_1_Uint8Array";
 
-Native_AnalyserNode_getFloatFrequencyData_Callback(mthis, array) native "AnalyserNode_getFloatFrequencyData_Callback";
+Native_AnalyserNode_getFloatFrequencyData_Callback(mthis, array) native "AnalyserNode_getFloatFrequencyData_Callback_RESOLVER_STRING_1_Float32Array";
 
 Native_TimedItem_activeDuration_Getter(mthis) native "TimedItem_activeDuration_Getter";
 
@@ -149,25 +145,19 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Animation__create_1constructorCallback(target, keyframes, timingInput) native "Animation__create_1constructorCallback";
+Native_Animation__create_1constructorCallback(target, keyframes, timingInput) native "Animation_constructorCallback_RESOLVER_STRING_3_Element_sequence<Dictionary>_Dictionary";
 
-Native_Animation__create_2constructorCallback(target, keyframes, timingInput) native "Animation__create_2constructorCallback";
+Native_Animation__create_2constructorCallback(target, keyframes, timingInput) native "Animation_constructorCallback_RESOLVER_STRING_3_Element_sequence<Dictionary>_double";
 
-Native_Animation__create_3constructorCallback(target, keyframes) native "Animation__create_3constructorCallback";
+Native_Animation__create_3constructorCallback(target, keyframes) native "Animation_constructorCallback_RESOLVER_STRING_2_Element_sequence<Dictionary>";
 
 Native_ApplicationCache_status_Getter(mthis) native "ApplicationCache_status_Getter";
 
-Native_ApplicationCache_abort_Callback(mthis) native "ApplicationCache_abort_Callback";
+Native_ApplicationCache_abort_Callback(mthis) native "ApplicationCache_abort_Callback_RESOLVER_STRING_0_";
 
-Native_ApplicationCache_swapCache_Callback(mthis) native "ApplicationCache_swapCache_Callback";
+Native_ApplicationCache_swapCache_Callback(mthis) native "ApplicationCache_swapCache_Callback_RESOLVER_STRING_0_";
 
-Native_ApplicationCache_update_Callback(mthis) native "ApplicationCache_update_Callback";
-
-Native_ApplicationCache_addEventListener_Callback(mthis, type, listener, useCapture) native "ApplicationCache_addEventListener_Callback";
-
-Native_ApplicationCache_dispatchEvent_Callback(mthis, event) native "ApplicationCache_dispatchEvent_Callback";
-
-Native_ApplicationCache_removeEventListener_Callback(mthis, type, listener, useCapture) native "ApplicationCache_removeEventListener_Callback";
+Native_ApplicationCache_update_Callback(mthis) native "ApplicationCache_update_Callback_RESOLVER_STRING_0_";
 
 Native_Node_baseURI_Getter(mthis) native "Node_baseURI_Getter";
 
@@ -205,9 +195,9 @@
 
 Native_Node_cloneNode_Callback(mthis, deep) native "Node_cloneNode_Callback";
 
-Native_Node_contains_Callback(mthis, other) native "Node_contains_Callback";
+Native_Node_contains_Callback(mthis, other) native "Node_contains_Callback_RESOLVER_STRING_1_Node";
 
-Native_Node_hasChildNodes_Callback(mthis) native "Node_hasChildNodes_Callback";
+Native_Node_hasChildNodes_Callback(mthis) native "Node_hasChildNodes_Callback_RESOLVER_STRING_0_";
 
 Native_Node_insertBefore_Callback(mthis, newChild, refChild) native "Node_insertBefore_Callback";
 
@@ -215,12 +205,6 @@
 
 Native_Node_replaceChild_Callback(mthis, newChild, oldChild) native "Node_replaceChild_Callback";
 
-Native_Node_addEventListener_Callback(mthis, type, listener, useCapture) native "Node_addEventListener_Callback";
-
-Native_Node_dispatchEvent_Callback(mthis, event) native "Node_dispatchEvent_Callback";
-
-Native_Node_removeEventListener_Callback(mthis, type, listener, useCapture) native "Node_removeEventListener_Callback";
-
 Native_Attr_localName_Getter(mthis) native "Attr_localName_Getter";
 
 Native_Attr_name_Getter(mthis) native "Attr_name_Getter";
@@ -243,7 +227,7 @@
 
 Native_AudioBuffer_sampleRate_Getter(mthis) native "AudioBuffer_sampleRate_Getter";
 
-Native_AudioBuffer_getChannelData_Callback(mthis, channelIndex) native "AudioBuffer_getChannelData_Callback";
+Native_AudioBuffer_getChannelData_Callback(mthis, channelIndex) native "AudioBuffer_getChannelData_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_AudioBufferSourceNode_buffer_Getter(mthis) native "AudioBufferSourceNode_buffer_Getter";
 
@@ -267,11 +251,11 @@
 
 Native_AudioBufferSourceNode_playbackState_Getter(mthis) native "AudioBufferSourceNode_playbackState_Getter";
 
-Native_AudioBufferSourceNode_noteGrainOn_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode_noteGrainOn_Callback";
+Native_AudioBufferSourceNode_noteGrainOn_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode_noteGrainOn_Callback_RESOLVER_STRING_3_double_double_double";
 
-Native_AudioBufferSourceNode_noteOff_Callback(mthis, when) native "AudioBufferSourceNode_noteOff_Callback";
+Native_AudioBufferSourceNode_noteOff_Callback(mthis, when) native "AudioBufferSourceNode_noteOff_Callback_RESOLVER_STRING_1_double";
 
-Native_AudioBufferSourceNode_noteOn_Callback(mthis, when) native "AudioBufferSourceNode_noteOn_Callback";
+Native_AudioBufferSourceNode_noteOn_Callback(mthis, when) native "AudioBufferSourceNode_noteOn_Callback_RESOLVER_STRING_1_double";
 
   // Generated overload resolver
 Native_AudioBufferSourceNode_start(mthis, when, grainOffset, grainDuration) {
@@ -291,13 +275,13 @@
     return;
   }
 
-Native_AudioBufferSourceNode__start_1_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode__start_1_Callback";
+Native_AudioBufferSourceNode__start_1_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_3_double_double_double";
 
-Native_AudioBufferSourceNode__start_2_Callback(mthis, when, grainOffset) native "AudioBufferSourceNode__start_2_Callback";
+Native_AudioBufferSourceNode__start_2_Callback(mthis, when, grainOffset) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_2_double_double";
 
-Native_AudioBufferSourceNode__start_3_Callback(mthis, when) native "AudioBufferSourceNode__start_3_Callback";
+Native_AudioBufferSourceNode__start_3_Callback(mthis, when) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_1_double";
 
-Native_AudioBufferSourceNode__start_4_Callback(mthis) native "AudioBufferSourceNode__start_4_Callback";
+Native_AudioBufferSourceNode__start_4_Callback(mthis) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_AudioBufferSourceNode_stop(mthis, when) {
@@ -309,16 +293,16 @@
     return;
   }
 
-Native_AudioBufferSourceNode__stop_1_Callback(mthis, when) native "AudioBufferSourceNode__stop_1_Callback";
+Native_AudioBufferSourceNode__stop_1_Callback(mthis, when) native "AudioBufferSourceNode_stop_Callback_RESOLVER_STRING_1_double";
 
-Native_AudioBufferSourceNode__stop_2_Callback(mthis) native "AudioBufferSourceNode__stop_2_Callback";
+Native_AudioBufferSourceNode__stop_2_Callback(mthis) native "AudioBufferSourceNode_stop_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_AudioContext_AudioContext() {
     return Native_AudioContext__create_1constructorCallback();
   }
 
-Native_AudioContext__create_1constructorCallback() native "AudioContext__create_1constructorCallback";
+Native_AudioContext__create_1constructorCallback() native "AudioContext_constructorCallback_RESOLVER_STRING_0_";
 
 Native_AudioContext_activeSourceCount_Getter(mthis) native "AudioContext_activeSourceCount_Getter";
 
@@ -330,15 +314,15 @@
 
 Native_AudioContext_sampleRate_Getter(mthis) native "AudioContext_sampleRate_Getter";
 
-Native_AudioContext_createAnalyser_Callback(mthis) native "AudioContext_createAnalyser_Callback";
+Native_AudioContext_createAnalyser_Callback(mthis) native "AudioContext_createAnalyser_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createBiquadFilter_Callback(mthis) native "AudioContext_createBiquadFilter_Callback";
+Native_AudioContext_createBiquadFilter_Callback(mthis) native "AudioContext_createBiquadFilter_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createBuffer_Callback(mthis, numberOfChannels, numberOfFrames, sampleRate) native "AudioContext_createBuffer_Callback";
+Native_AudioContext_createBuffer_Callback(mthis, numberOfChannels, numberOfFrames, sampleRate) native "AudioContext_createBuffer_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_float";
 
-Native_AudioContext_createBufferFromBuffer_Callback(mthis, buffer, mixToMono) native "AudioContext_createBufferFromBuffer_Callback";
+Native_AudioContext_createBufferFromBuffer_Callback(mthis, buffer, mixToMono) native "AudioContext_createBuffer_Callback_RESOLVER_STRING_2_ArrayBuffer_boolean";
 
-Native_AudioContext_createBufferSource_Callback(mthis) native "AudioContext_createBufferSource_Callback";
+Native_AudioContext_createBufferSource_Callback(mthis) native "AudioContext_createBufferSource_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_AudioContext_createChannelMerger(mthis, numberOfInputs) {
@@ -348,9 +332,9 @@
     return Native_AudioContext__createChannelMerger_2_Callback(mthis);
   }
 
-Native_AudioContext__createChannelMerger_1_Callback(mthis, numberOfInputs) native "AudioContext__createChannelMerger_1_Callback";
+Native_AudioContext__createChannelMerger_1_Callback(mthis, numberOfInputs) native "AudioContext_createChannelMerger_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_AudioContext__createChannelMerger_2_Callback(mthis) native "AudioContext__createChannelMerger_2_Callback";
+Native_AudioContext__createChannelMerger_2_Callback(mthis) native "AudioContext_createChannelMerger_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_AudioContext_createChannelSplitter(mthis, numberOfOutputs) {
@@ -360,11 +344,11 @@
     return Native_AudioContext__createChannelSplitter_2_Callback(mthis);
   }
 
-Native_AudioContext__createChannelSplitter_1_Callback(mthis, numberOfOutputs) native "AudioContext__createChannelSplitter_1_Callback";
+Native_AudioContext__createChannelSplitter_1_Callback(mthis, numberOfOutputs) native "AudioContext_createChannelSplitter_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_AudioContext__createChannelSplitter_2_Callback(mthis) native "AudioContext__createChannelSplitter_2_Callback";
+Native_AudioContext__createChannelSplitter_2_Callback(mthis) native "AudioContext_createChannelSplitter_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createConvolver_Callback(mthis) native "AudioContext_createConvolver_Callback";
+Native_AudioContext_createConvolver_Callback(mthis) native "AudioContext_createConvolver_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_AudioContext_createDelay(mthis, maxDelayTime) {
@@ -374,9 +358,9 @@
     return Native_AudioContext__createDelay_2_Callback(mthis);
   }
 
-Native_AudioContext__createDelay_1_Callback(mthis, maxDelayTime) native "AudioContext__createDelay_1_Callback";
+Native_AudioContext__createDelay_1_Callback(mthis, maxDelayTime) native "AudioContext_createDelay_Callback_RESOLVER_STRING_1_double";
 
-Native_AudioContext__createDelay_2_Callback(mthis) native "AudioContext__createDelay_2_Callback";
+Native_AudioContext__createDelay_2_Callback(mthis) native "AudioContext_createDelay_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_AudioContext_createDelayNode(mthis, maxDelayTime) {
@@ -386,15 +370,15 @@
     return Native_AudioContext__createDelayNode_2_Callback(mthis);
   }
 
-Native_AudioContext__createDelayNode_1_Callback(mthis, maxDelayTime) native "AudioContext__createDelayNode_1_Callback";
+Native_AudioContext__createDelayNode_1_Callback(mthis, maxDelayTime) native "AudioContext_createDelayNode_Callback_RESOLVER_STRING_1_double";
 
-Native_AudioContext__createDelayNode_2_Callback(mthis) native "AudioContext__createDelayNode_2_Callback";
+Native_AudioContext__createDelayNode_2_Callback(mthis) native "AudioContext_createDelayNode_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createDynamicsCompressor_Callback(mthis) native "AudioContext_createDynamicsCompressor_Callback";
+Native_AudioContext_createDynamicsCompressor_Callback(mthis) native "AudioContext_createDynamicsCompressor_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createGain_Callback(mthis) native "AudioContext_createGain_Callback";
+Native_AudioContext_createGain_Callback(mthis) native "AudioContext_createGain_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createGainNode_Callback(mthis) native "AudioContext_createGainNode_Callback";
+Native_AudioContext_createGainNode_Callback(mthis) native "AudioContext_createGainNode_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_AudioContext_createJavaScriptNode(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) {
@@ -407,23 +391,23 @@
     return Native_AudioContext__createJavaScriptNode_3_Callback(mthis, bufferSize);
   }
 
-Native_AudioContext__createJavaScriptNode_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext__createJavaScriptNode_1_Callback";
+Native_AudioContext__createJavaScriptNode_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext_createJavaScriptNode_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_unsigned long";
 
-Native_AudioContext__createJavaScriptNode_2_Callback(mthis, bufferSize, numberOfInputChannels) native "AudioContext__createJavaScriptNode_2_Callback";
+Native_AudioContext__createJavaScriptNode_2_Callback(mthis, bufferSize, numberOfInputChannels) native "AudioContext_createJavaScriptNode_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_AudioContext__createJavaScriptNode_3_Callback(mthis, bufferSize) native "AudioContext__createJavaScriptNode_3_Callback";
+Native_AudioContext__createJavaScriptNode_3_Callback(mthis, bufferSize) native "AudioContext_createJavaScriptNode_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_AudioContext_createMediaElementSource_Callback(mthis, mediaElement) native "AudioContext_createMediaElementSource_Callback";
+Native_AudioContext_createMediaElementSource_Callback(mthis, mediaElement) native "AudioContext_createMediaElementSource_Callback_RESOLVER_STRING_1_HTMLMediaElement";
 
-Native_AudioContext_createMediaStreamDestination_Callback(mthis) native "AudioContext_createMediaStreamDestination_Callback";
+Native_AudioContext_createMediaStreamDestination_Callback(mthis) native "AudioContext_createMediaStreamDestination_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createMediaStreamSource_Callback(mthis, mediaStream) native "AudioContext_createMediaStreamSource_Callback";
+Native_AudioContext_createMediaStreamSource_Callback(mthis, mediaStream) native "AudioContext_createMediaStreamSource_Callback_RESOLVER_STRING_1_MediaStream";
 
-Native_AudioContext_createOscillator_Callback(mthis) native "AudioContext_createOscillator_Callback";
+Native_AudioContext_createOscillator_Callback(mthis) native "AudioContext_createOscillator_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createPanner_Callback(mthis) native "AudioContext_createPanner_Callback";
+Native_AudioContext_createPanner_Callback(mthis) native "AudioContext_createPanner_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createPeriodicWave_Callback(mthis, real, imag) native "AudioContext_createPeriodicWave_Callback";
+Native_AudioContext_createPeriodicWave_Callback(mthis, real, imag) native "AudioContext_createPeriodicWave_Callback_RESOLVER_STRING_2_Float32Array_Float32Array";
 
   // Generated overload resolver
 Native_AudioContext_createScriptProcessor(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) {
@@ -439,25 +423,19 @@
     return Native_AudioContext__createScriptProcessor_4_Callback(mthis);
   }
 
-Native_AudioContext__createScriptProcessor_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext__createScriptProcessor_1_Callback";
+Native_AudioContext__createScriptProcessor_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_unsigned long";
 
-Native_AudioContext__createScriptProcessor_2_Callback(mthis, bufferSize, numberOfInputChannels) native "AudioContext__createScriptProcessor_2_Callback";
+Native_AudioContext__createScriptProcessor_2_Callback(mthis, bufferSize, numberOfInputChannels) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_AudioContext__createScriptProcessor_3_Callback(mthis, bufferSize) native "AudioContext__createScriptProcessor_3_Callback";
+Native_AudioContext__createScriptProcessor_3_Callback(mthis, bufferSize) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_AudioContext__createScriptProcessor_4_Callback(mthis) native "AudioContext__createScriptProcessor_4_Callback";
+Native_AudioContext__createScriptProcessor_4_Callback(mthis) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createWaveShaper_Callback(mthis) native "AudioContext_createWaveShaper_Callback";
+Native_AudioContext_createWaveShaper_Callback(mthis) native "AudioContext_createWaveShaper_Callback_RESOLVER_STRING_0_";
 
 Native_AudioContext_decodeAudioData_Callback(mthis, audioData, successCallback, errorCallback) native "AudioContext_decodeAudioData_Callback";
 
-Native_AudioContext_startRendering_Callback(mthis) native "AudioContext_startRendering_Callback";
-
-Native_AudioContext_addEventListener_Callback(mthis, type, listener, useCapture) native "AudioContext_addEventListener_Callback";
-
-Native_AudioContext_dispatchEvent_Callback(mthis, event) native "AudioContext_dispatchEvent_Callback";
-
-Native_AudioContext_removeEventListener_Callback(mthis, type, listener, useCapture) native "AudioContext_removeEventListener_Callback";
+Native_AudioContext_startRendering_Callback(mthis) native "AudioContext_startRendering_Callback_RESOLVER_STRING_0_";
 
 Native_AudioDestinationNode_maxChannelCount_Getter(mthis) native "AudioDestinationNode_maxChannelCount_Getter";
 
@@ -469,11 +447,11 @@
 
 Native_AudioListener_speedOfSound_Setter(mthis, value) native "AudioListener_speedOfSound_Setter";
 
-Native_AudioListener_setOrientation_Callback(mthis, x, y, z, xUp, yUp, zUp) native "AudioListener_setOrientation_Callback";
+Native_AudioListener_setOrientation_Callback(mthis, x, y, z, xUp, yUp, zUp) native "AudioListener_setOrientation_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_AudioListener_setPosition_Callback(mthis, x, y, z) native "AudioListener_setPosition_Callback";
+Native_AudioListener_setPosition_Callback(mthis, x, y, z) native "AudioListener_setPosition_Callback_RESOLVER_STRING_3_float_float_float";
 
-Native_AudioListener_setVelocity_Callback(mthis, x, y, z) native "AudioListener_setVelocity_Callback";
+Native_AudioListener_setVelocity_Callback(mthis, x, y, z) native "AudioListener_setVelocity_Callback_RESOLVER_STRING_3_float_float_float";
 
 Native_AudioParam_defaultValue_Getter(mthis) native "AudioParam_defaultValue_Getter";
 
@@ -489,17 +467,17 @@
 
 Native_AudioParam_value_Setter(mthis, value) native "AudioParam_value_Setter";
 
-Native_AudioParam_cancelScheduledValues_Callback(mthis, startTime) native "AudioParam_cancelScheduledValues_Callback";
+Native_AudioParam_cancelScheduledValues_Callback(mthis, startTime) native "AudioParam_cancelScheduledValues_Callback_RESOLVER_STRING_1_double";
 
-Native_AudioParam_exponentialRampToValueAtTime_Callback(mthis, value, time) native "AudioParam_exponentialRampToValueAtTime_Callback";
+Native_AudioParam_exponentialRampToValueAtTime_Callback(mthis, value, time) native "AudioParam_exponentialRampToValueAtTime_Callback_RESOLVER_STRING_2_float_double";
 
-Native_AudioParam_linearRampToValueAtTime_Callback(mthis, value, time) native "AudioParam_linearRampToValueAtTime_Callback";
+Native_AudioParam_linearRampToValueAtTime_Callback(mthis, value, time) native "AudioParam_linearRampToValueAtTime_Callback_RESOLVER_STRING_2_float_double";
 
-Native_AudioParam_setTargetAtTime_Callback(mthis, target, time, timeConstant) native "AudioParam_setTargetAtTime_Callback";
+Native_AudioParam_setTargetAtTime_Callback(mthis, target, time, timeConstant) native "AudioParam_setTargetAtTime_Callback_RESOLVER_STRING_3_float_double_double";
 
-Native_AudioParam_setTargetValueAtTime_Callback(mthis, targetValue, time, timeConstant) native "AudioParam_setTargetValueAtTime_Callback";
+Native_AudioParam_setTargetValueAtTime_Callback(mthis, targetValue, time, timeConstant) native "AudioParam_setTargetValueAtTime_Callback_RESOLVER_STRING_3_float_double_double";
 
-Native_AudioParam_setValueAtTime_Callback(mthis, value, time) native "AudioParam_setValueAtTime_Callback";
+Native_AudioParam_setValueAtTime_Callback(mthis, value, time) native "AudioParam_setValueAtTime_Callback_RESOLVER_STRING_2_float_double";
 
 Native_AudioParam_setValueCurveAtTime_Callback(mthis, values, time, duration) native "AudioParam_setValueCurveAtTime_Callback";
 
@@ -523,13 +501,13 @@
 
 Native_Event_type_Getter(mthis) native "Event_type_Getter";
 
-Native_Event_initEvent_Callback(mthis, eventTypeArg, canBubbleArg, cancelableArg) native "Event_initEvent_Callback";
+Native_Event_initEvent_Callback(mthis, eventTypeArg, canBubbleArg, cancelableArg) native "Event_initEvent_Callback_RESOLVER_STRING_3_DOMString_boolean_boolean";
 
-Native_Event_preventDefault_Callback(mthis) native "Event_preventDefault_Callback";
+Native_Event_preventDefault_Callback(mthis) native "Event_preventDefault_Callback_RESOLVER_STRING_0_";
 
-Native_Event_stopImmediatePropagation_Callback(mthis) native "Event_stopImmediatePropagation_Callback";
+Native_Event_stopImmediatePropagation_Callback(mthis) native "Event_stopImmediatePropagation_Callback_RESOLVER_STRING_0_";
 
-Native_Event_stopPropagation_Callback(mthis) native "Event_stopPropagation_Callback";
+Native_Event_stopPropagation_Callback(mthis) native "Event_stopPropagation_Callback_RESOLVER_STRING_0_";
 
 Native_AudioProcessingEvent_inputBuffer_Getter(mthis) native "AudioProcessingEvent_inputBuffer_Getter";
 
@@ -557,7 +535,7 @@
 
 Native_BiquadFilterNode_type_Setter(mthis, value) native "BiquadFilterNode_type_Setter";
 
-Native_BiquadFilterNode_getFrequencyResponse_Callback(mthis, frequencyHz, magResponse, phaseResponse) native "BiquadFilterNode_getFrequencyResponse_Callback";
+Native_BiquadFilterNode_getFrequencyResponse_Callback(mthis, frequencyHz, magResponse, phaseResponse) native "BiquadFilterNode_getFrequencyResponse_Callback_RESOLVER_STRING_3_Float32Array_Float32Array_Float32Array";
 
 Native_Blob_constructorCallback(blobParts, type, endings) native "Blob_constructorCallback";
 
@@ -579,19 +557,19 @@
     return Native_Blob__slice_4_Callback(mthis);
   }
 
-Native_Blob__slice_1_Callback(mthis, start, end, contentType) native "Blob__slice_1_Callback";
+Native_Blob__slice_1_Callback(mthis, start, end, contentType) native "Blob_slice_Callback_RESOLVER_STRING_3_long long_long long_DOMString";
 
-Native_Blob__slice_2_Callback(mthis, start, end) native "Blob__slice_2_Callback";
+Native_Blob__slice_2_Callback(mthis, start, end) native "Blob_slice_Callback_RESOLVER_STRING_2_long long_long long";
 
-Native_Blob__slice_3_Callback(mthis, start) native "Blob__slice_3_Callback";
+Native_Blob__slice_3_Callback(mthis, start) native "Blob_slice_Callback_RESOLVER_STRING_1_long long";
 
-Native_Blob__slice_4_Callback(mthis) native "Blob__slice_4_Callback";
+Native_Blob__slice_4_Callback(mthis) native "Blob_slice_Callback_RESOLVER_STRING_0_";
 
 Native_ChildNode_nextElementSibling_Getter(mthis) native "ChildNode_nextElementSibling_Getter";
 
 Native_ChildNode_previousElementSibling_Getter(mthis) native "ChildNode_previousElementSibling_Getter";
 
-Native_ChildNode_remove_Callback(mthis) native "ChildNode_remove_Callback";
+Native_ChildNode_remove_Callback(mthis) native "ChildNode_remove_Callback_RESOLVER_STRING_0_";
 
 Native_CharacterData_data_Getter(mthis) native "CharacterData_data_Getter";
 
@@ -599,15 +577,15 @@
 
 Native_CharacterData_length_Getter(mthis) native "CharacterData_length_Getter";
 
-Native_CharacterData_appendData_Callback(mthis, data) native "CharacterData_appendData_Callback";
+Native_CharacterData_appendData_Callback(mthis, data) native "CharacterData_appendData_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CharacterData_deleteData_Callback(mthis, offset, length) native "CharacterData_deleteData_Callback";
+Native_CharacterData_deleteData_Callback(mthis, offset, length) native "CharacterData_deleteData_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_CharacterData_insertData_Callback(mthis, offset, data) native "CharacterData_insertData_Callback";
+Native_CharacterData_insertData_Callback(mthis, offset, data) native "CharacterData_insertData_Callback_RESOLVER_STRING_2_unsigned long_DOMString";
 
-Native_CharacterData_replaceData_Callback(mthis, offset, length, data) native "CharacterData_replaceData_Callback";
+Native_CharacterData_replaceData_Callback(mthis, offset, length, data) native "CharacterData_replaceData_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_DOMString";
 
-Native_CharacterData_substringData_Callback(mthis, offset, length) native "CharacterData_substringData_Callback";
+Native_CharacterData_substringData_Callback(mthis, offset, length) native "CharacterData_substringData_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
 Native_CharacterData_nextElementSibling_Getter(mthis) native "CharacterData_nextElementSibling_Getter";
 
@@ -615,13 +593,13 @@
 
 Native_Text_wholeText_Getter(mthis) native "Text_wholeText_Getter";
 
-Native_Text_getDestinationInsertionPoints_Callback(mthis) native "Text_getDestinationInsertionPoints_Callback";
+Native_Text_getDestinationInsertionPoints_Callback(mthis) native "Text_getDestinationInsertionPoints_Callback_RESOLVER_STRING_0_";
 
-Native_Text_splitText_Callback(mthis, offset) native "Text_splitText_Callback";
+Native_Text_splitText_Callback(mthis, offset) native "Text_splitText_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSS_supports_Callback(mthis, property, value) native "CSS_supports_Callback";
+Native_CSS_supports_Callback(mthis, property, value) native "CSS_supports_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_CSS_supportsCondition_Callback(mthis, conditionText) native "CSS_supportsCondition_Callback";
+Native_CSS_supportsCondition_Callback(mthis, conditionText) native "CSS_supports_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_CSSRule_cssText_Getter(mthis) native "CSSRule_cssText_Getter";
 
@@ -659,21 +637,21 @@
 
 Native_CSSKeyframesRule_name_Setter(mthis, value) native "CSSKeyframesRule_name_Setter";
 
-Native_CSSKeyframesRule___getter___Callback(mthis, index) native "CSSKeyframesRule___getter___Callback";
+Native_CSSKeyframesRule___getter___Callback(mthis, index) native "CSSKeyframesRule___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSKeyframesRule_deleteRule_Callback(mthis, key) native "CSSKeyframesRule_deleteRule_Callback";
+Native_CSSKeyframesRule_deleteRule_Callback(mthis, key) native "CSSKeyframesRule_deleteRule_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSKeyframesRule_findRule_Callback(mthis, key) native "CSSKeyframesRule_findRule_Callback";
+Native_CSSKeyframesRule_findRule_Callback(mthis, key) native "CSSKeyframesRule_findRule_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSKeyframesRule_insertRule_Callback(mthis, rule) native "CSSKeyframesRule_insertRule_Callback";
+Native_CSSKeyframesRule_insertRule_Callback(mthis, rule) native "CSSKeyframesRule_insertRule_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_CSSMediaRule_cssRules_Getter(mthis) native "CSSMediaRule_cssRules_Getter";
 
 Native_CSSMediaRule_media_Getter(mthis) native "CSSMediaRule_media_Getter";
 
-Native_CSSMediaRule_deleteRule_Callback(mthis, index) native "CSSMediaRule_deleteRule_Callback";
+Native_CSSMediaRule_deleteRule_Callback(mthis, index) native "CSSMediaRule_deleteRule_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSMediaRule_insertRule_Callback(mthis, rule, index) native "CSSMediaRule_insertRule_Callback";
+Native_CSSMediaRule_insertRule_Callback(mthis, rule, index) native "CSSMediaRule_insertRule_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
 
 Native_CSSPageRule_selectorText_Getter(mthis) native "CSSPageRule_selectorText_Getter";
 
@@ -683,9 +661,9 @@
 
 Native_CSSRuleList_length_Getter(mthis) native "CSSRuleList_length_Getter";
 
-Native_CSSRuleList_NativeIndexed_Getter(mthis, index) native "CSSRuleList_item_Callback";
+Native_CSSRuleList_NativeIndexed_Getter(mthis, index) native "CSSRuleList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSRuleList_item_Callback(mthis, index) native "CSSRuleList_item_Callback";
+Native_CSSRuleList_item_Callback(mthis, index) native "CSSRuleList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_CSSStyleDeclaration_cssText_Getter(mthis) native "CSSStyleDeclaration_cssText_Getter";
 
@@ -697,15 +675,15 @@
 
 Native_CSSStyleDeclaration___setter___Callback(mthis, propertyName, propertyValue) native "CSSStyleDeclaration___setter___Callback";
 
-Native_CSSStyleDeclaration_getPropertyPriority_Callback(mthis, propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback";
+Native_CSSStyleDeclaration_getPropertyPriority_Callback(mthis, propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSStyleDeclaration_getPropertyValue_Callback(mthis, propertyName) native "CSSStyleDeclaration_getPropertyValue_Callback";
+Native_CSSStyleDeclaration_getPropertyValue_Callback(mthis, propertyName) native "CSSStyleDeclaration_getPropertyValue_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSStyleDeclaration_item_Callback(mthis, index) native "CSSStyleDeclaration_item_Callback";
+Native_CSSStyleDeclaration_item_Callback(mthis, index) native "CSSStyleDeclaration_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSStyleDeclaration_removeProperty_Callback(mthis, propertyName) native "CSSStyleDeclaration_removeProperty_Callback";
+Native_CSSStyleDeclaration_removeProperty_Callback(mthis, propertyName) native "CSSStyleDeclaration_removeProperty_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSStyleDeclaration_setProperty_Callback(mthis, propertyName, value, priority) native "CSSStyleDeclaration_setProperty_Callback";
+Native_CSSStyleDeclaration_setProperty_Callback(mthis, propertyName, value, priority) native "CSSStyleDeclaration_setProperty_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
 Native_CSSStyleRule_selectorText_Getter(mthis) native "CSSStyleRule_selectorText_Getter";
 
@@ -743,11 +721,11 @@
     return Native_CSSStyleSheet__addRule_2_Callback(mthis, selector, style);
   }
 
-Native_CSSStyleSheet__addRule_1_Callback(mthis, selector, style, index) native "CSSStyleSheet__addRule_1_Callback";
+Native_CSSStyleSheet__addRule_1_Callback(mthis, selector, style, index) native "CSSStyleSheet_addRule_Callback_RESOLVER_STRING_3_DOMString_DOMString_unsigned long";
 
-Native_CSSStyleSheet__addRule_2_Callback(mthis, selector, style) native "CSSStyleSheet__addRule_2_Callback";
+Native_CSSStyleSheet__addRule_2_Callback(mthis, selector, style) native "CSSStyleSheet_addRule_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_CSSStyleSheet_deleteRule_Callback(mthis, index) native "CSSStyleSheet_deleteRule_Callback";
+Native_CSSStyleSheet_deleteRule_Callback(mthis, index) native "CSSStyleSheet_deleteRule_Callback_RESOLVER_STRING_1_unsigned long";
 
   // Generated overload resolver
 Native_CSSStyleSheet_insertRule(mthis, rule, index) {
@@ -757,25 +735,25 @@
     return Native_CSSStyleSheet__insertRule_2_Callback(mthis, rule);
   }
 
-Native_CSSStyleSheet__insertRule_1_Callback(mthis, rule, index) native "CSSStyleSheet__insertRule_1_Callback";
+Native_CSSStyleSheet__insertRule_1_Callback(mthis, rule, index) native "CSSStyleSheet_insertRule_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
 
-Native_CSSStyleSheet__insertRule_2_Callback(mthis, rule) native "CSSStyleSheet__insertRule_2_Callback";
+Native_CSSStyleSheet__insertRule_2_Callback(mthis, rule) native "CSSStyleSheet_insertRule_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSStyleSheet_removeRule_Callback(mthis, index) native "CSSStyleSheet_removeRule_Callback";
+Native_CSSStyleSheet_removeRule_Callback(mthis, index) native "CSSStyleSheet_removeRule_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_CSSSupportsRule_conditionText_Getter(mthis) native "CSSSupportsRule_conditionText_Getter";
 
 Native_CSSSupportsRule_cssRules_Getter(mthis) native "CSSSupportsRule_cssRules_Getter";
 
-Native_CSSSupportsRule_deleteRule_Callback(mthis, index) native "CSSSupportsRule_deleteRule_Callback";
+Native_CSSSupportsRule_deleteRule_Callback(mthis, index) native "CSSSupportsRule_deleteRule_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSSupportsRule_insertRule_Callback(mthis, rule, index) native "CSSSupportsRule_insertRule_Callback";
+Native_CSSSupportsRule_insertRule_Callback(mthis, rule, index) native "CSSSupportsRule_insertRule_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
 
 Native_CSSValueList_length_Getter(mthis) native "CSSValueList_length_Getter";
 
-Native_CSSValueList_NativeIndexed_Getter(mthis, index) native "CSSValueList_item_Callback";
+Native_CSSValueList_NativeIndexed_Getter(mthis, index) native "CSSValueList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSValueList_item_Callback(mthis, index) native "CSSValueList_item_Callback";
+Native_CSSValueList_item_Callback(mthis, index) native "CSSValueList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_CSSViewportRule_style_Getter(mthis) native "CSSViewportRule_style_Getter";
 
@@ -783,9 +761,9 @@
 
 Native_Canvas2DContextAttributes_alpha_Setter(mthis, value) native "Canvas2DContextAttributes_alpha_Setter";
 
-Native_CanvasGradient_addColorStop_Callback(mthis, offset, color) native "CanvasGradient_addColorStop_Callback";
+Native_CanvasGradient_addColorStop_Callback(mthis, offset, color) native "CanvasGradient_addColorStop_Callback_RESOLVER_STRING_2_float_DOMString";
 
-Native_CanvasRenderingContext_canvas_Getter(mthis) native "CanvasRenderingContext_canvas_Getter";
+Native_CanvasRenderingContext_canvas_Getter(mthis) native "CanvasRenderingContext2D_canvas_Getter";
 
 Native_CanvasRenderingContext2D_currentPath_Getter(mthis) native "CanvasRenderingContext2D_currentPath_Getter";
 
@@ -865,15 +843,15 @@
 
 Native_CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter(mthis) native "CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter";
 
-Native_CanvasRenderingContext2D_arc_Callback(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_arc_Callback";
+Native_CanvasRenderingContext2D_arc_Callback(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_arc_Callback_RESOLVER_STRING_6_float_float_float_float_float_boolean";
 
-Native_CanvasRenderingContext2D_arcTo_Callback(mthis, x1, y1, x2, y2, radius) native "CanvasRenderingContext2D_arcTo_Callback";
+Native_CanvasRenderingContext2D_arcTo_Callback(mthis, x1, y1, x2, y2, radius) native "CanvasRenderingContext2D_arcTo_Callback_RESOLVER_STRING_5_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_beginPath_Callback(mthis) native "CanvasRenderingContext2D_beginPath_Callback";
+Native_CanvasRenderingContext2D_beginPath_Callback(mthis) native "CanvasRenderingContext2D_beginPath_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_bezierCurveTo_Callback(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "CanvasRenderingContext2D_bezierCurveTo_Callback";
+Native_CanvasRenderingContext2D_bezierCurveTo_Callback(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "CanvasRenderingContext2D_bezierCurveTo_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_clearRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_clearRect_Callback";
+Native_CanvasRenderingContext2D_clearRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_clearRect_Callback_RESOLVER_STRING_4_float_float_float_float";
 
   // Generated overload resolver
 Native_CanvasRenderingContext2D_clip(mthis, winding) {
@@ -885,25 +863,25 @@
     return;
   }
 
-Native_CanvasRenderingContext2D__clip_1_Callback(mthis, winding) native "CanvasRenderingContext2D__clip_1_Callback";
+Native_CanvasRenderingContext2D__clip_1_Callback(mthis, winding) native "CanvasRenderingContext2D_clip_Callback_RESOLVER_STRING_1_CanvasWindingRule";
 
-Native_CanvasRenderingContext2D__clip_2_Callback(mthis) native "CanvasRenderingContext2D__clip_2_Callback";
+Native_CanvasRenderingContext2D__clip_2_Callback(mthis) native "CanvasRenderingContext2D_clip_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_closePath_Callback(mthis) native "CanvasRenderingContext2D_closePath_Callback";
+Native_CanvasRenderingContext2D_closePath_Callback(mthis) native "CanvasRenderingContext2D_closePath_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_createImageData_Callback(mthis, sw, sh) native "CanvasRenderingContext2D_createImageData_Callback";
+Native_CanvasRenderingContext2D_createImageData_Callback(mthis, sw, sh) native "CanvasRenderingContext2D_createImageData_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_createImageDataFromImageData_Callback(mthis, imagedata) native "CanvasRenderingContext2D_createImageDataFromImageData_Callback";
+Native_CanvasRenderingContext2D_createImageDataFromImageData_Callback(mthis, imagedata) native "CanvasRenderingContext2D_createImageData_Callback_RESOLVER_STRING_1_ImageData";
 
-Native_CanvasRenderingContext2D_createLinearGradient_Callback(mthis, x0, y0, x1, y1) native "CanvasRenderingContext2D_createLinearGradient_Callback";
+Native_CanvasRenderingContext2D_createLinearGradient_Callback(mthis, x0, y0, x1, y1) native "CanvasRenderingContext2D_createLinearGradient_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_CanvasRenderingContext2D_createPattern_Callback(mthis, canvas, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback";
+Native_CanvasRenderingContext2D_createPattern_Callback(mthis, canvas, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback_RESOLVER_STRING_2_HTMLCanvasElement_DOMString";
 
-Native_CanvasRenderingContext2D_createPatternFromImage_Callback(mthis, image, repetitionType) native "CanvasRenderingContext2D_createPatternFromImage_Callback";
+Native_CanvasRenderingContext2D_createPatternFromImage_Callback(mthis, image, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback_RESOLVER_STRING_2_HTMLImageElement_DOMString";
 
-Native_CanvasRenderingContext2D_createRadialGradient_Callback(mthis, x0, y0, r0, x1, y1, r1) native "CanvasRenderingContext2D_createRadialGradient_Callback";
+Native_CanvasRenderingContext2D_createRadialGradient_Callback(mthis, x0, y0, r0, x1, y1, r1) native "CanvasRenderingContext2D_createRadialGradient_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_drawCustomFocusRing_Callback(mthis, element) native "CanvasRenderingContext2D_drawCustomFocusRing_Callback";
+Native_CanvasRenderingContext2D_drawCustomFocusRing_Callback(mthis, element) native "CanvasRenderingContext2D_drawCustomFocusRing_Callback_RESOLVER_STRING_1_Element";
 
   // Generated overload resolver
 Native_CanvasRenderingContext2D__drawImage(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) {
@@ -958,33 +936,33 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_CanvasRenderingContext2D__drawImage_1_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_1_Callback";
+Native_CanvasRenderingContext2D__drawImage_1_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_HTMLImageElement_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_2_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_2_Callback";
+Native_CanvasRenderingContext2D__drawImage_2_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_HTMLImageElement_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_3_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_3_Callback";
+Native_CanvasRenderingContext2D__drawImage_3_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_HTMLImageElement_float_float_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_4_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_4_Callback";
+Native_CanvasRenderingContext2D__drawImage_4_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_HTMLCanvasElement_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_5_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_5_Callback";
+Native_CanvasRenderingContext2D__drawImage_5_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_HTMLCanvasElement_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_6_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_6_Callback";
+Native_CanvasRenderingContext2D__drawImage_6_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_HTMLCanvasElement_float_float_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_7_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_7_Callback";
+Native_CanvasRenderingContext2D__drawImage_7_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_HTMLVideoElement_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_8_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_8_Callback";
+Native_CanvasRenderingContext2D__drawImage_8_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_HTMLVideoElement_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_9_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_9_Callback";
+Native_CanvasRenderingContext2D__drawImage_9_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_HTMLVideoElement_float_float_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_10_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_10_Callback";
+Native_CanvasRenderingContext2D__drawImage_10_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_ImageBitmap_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_11_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_11_Callback";
+Native_CanvasRenderingContext2D__drawImage_11_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_ImageBitmap_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_12_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_12_Callback";
+Native_CanvasRenderingContext2D__drawImage_12_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_ImageBitmap_float_float_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_drawSystemFocusRing_Callback(mthis, element) native "CanvasRenderingContext2D_drawSystemFocusRing_Callback";
+Native_CanvasRenderingContext2D_drawSystemFocusRing_Callback(mthis, element) native "CanvasRenderingContext2D_drawSystemFocusRing_Callback_RESOLVER_STRING_1_Element";
 
-Native_CanvasRenderingContext2D_ellipse_Callback(mthis, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_ellipse_Callback";
+Native_CanvasRenderingContext2D_ellipse_Callback(mthis, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_ellipse_Callback_RESOLVER_STRING_8_float_float_float_float_float_float_float_boolean";
 
   // Generated overload resolver
 Native_CanvasRenderingContext2D_fill(mthis, winding) {
@@ -996,11 +974,11 @@
     return;
   }
 
-Native_CanvasRenderingContext2D__fill_1_Callback(mthis, winding) native "CanvasRenderingContext2D__fill_1_Callback";
+Native_CanvasRenderingContext2D__fill_1_Callback(mthis, winding) native "CanvasRenderingContext2D_fill_Callback_RESOLVER_STRING_1_CanvasWindingRule";
 
-Native_CanvasRenderingContext2D__fill_2_Callback(mthis) native "CanvasRenderingContext2D__fill_2_Callback";
+Native_CanvasRenderingContext2D__fill_2_Callback(mthis) native "CanvasRenderingContext2D_fill_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_fillRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_fillRect_Callback";
+Native_CanvasRenderingContext2D_fillRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_fillRect_Callback_RESOLVER_STRING_4_float_float_float_float";
 
   // Generated overload resolver
 Native_CanvasRenderingContext2D_fillText(mthis, text, x, y, maxWidth) {
@@ -1012,15 +990,15 @@
     return;
   }
 
-Native_CanvasRenderingContext2D__fillText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D__fillText_1_Callback";
+Native_CanvasRenderingContext2D__fillText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D_fillText_Callback_RESOLVER_STRING_4_DOMString_float_float_float";
 
-Native_CanvasRenderingContext2D__fillText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D__fillText_2_Callback";
+Native_CanvasRenderingContext2D__fillText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D_fillText_Callback_RESOLVER_STRING_3_DOMString_float_float";
 
-Native_CanvasRenderingContext2D_getContextAttributes_Callback(mthis) native "CanvasRenderingContext2D_getContextAttributes_Callback";
+Native_CanvasRenderingContext2D_getContextAttributes_Callback(mthis) native "CanvasRenderingContext2D_getContextAttributes_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_getImageData_Callback(mthis, sx, sy, sw, sh) native "CanvasRenderingContext2D_getImageData_Callback";
+Native_CanvasRenderingContext2D_getImageData_Callback(mthis, sx, sy, sw, sh) native "CanvasRenderingContext2D_getImageData_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_CanvasRenderingContext2D_getLineDash_Callback(mthis) native "CanvasRenderingContext2D_getLineDash_Callback";
+Native_CanvasRenderingContext2D_getLineDash_Callback(mthis) native "CanvasRenderingContext2D_getLineDash_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_CanvasRenderingContext2D_isPointInPath(mthis, x, y, winding) {
@@ -1030,17 +1008,17 @@
     return Native_CanvasRenderingContext2D__isPointInPath_2_Callback(mthis, x, y);
   }
 
-Native_CanvasRenderingContext2D__isPointInPath_1_Callback(mthis, x, y, winding) native "CanvasRenderingContext2D__isPointInPath_1_Callback";
+Native_CanvasRenderingContext2D__isPointInPath_1_Callback(mthis, x, y, winding) native "CanvasRenderingContext2D_isPointInPath_Callback_RESOLVER_STRING_3_float_float_CanvasWindingRule";
 
-Native_CanvasRenderingContext2D__isPointInPath_2_Callback(mthis, x, y) native "CanvasRenderingContext2D__isPointInPath_2_Callback";
+Native_CanvasRenderingContext2D__isPointInPath_2_Callback(mthis, x, y) native "CanvasRenderingContext2D_isPointInPath_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_isPointInStroke_Callback(mthis, x, y) native "CanvasRenderingContext2D_isPointInStroke_Callback";
+Native_CanvasRenderingContext2D_isPointInStroke_Callback(mthis, x, y) native "CanvasRenderingContext2D_isPointInStroke_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_lineTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_lineTo_Callback";
+Native_CanvasRenderingContext2D_lineTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_lineTo_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_measureText_Callback(mthis, text) native "CanvasRenderingContext2D_measureText_Callback";
+Native_CanvasRenderingContext2D_measureText_Callback(mthis, text) native "CanvasRenderingContext2D_measureText_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CanvasRenderingContext2D_moveTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_moveTo_Callback";
+Native_CanvasRenderingContext2D_moveTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_moveTo_Callback_RESOLVER_STRING_2_float_float";
 
   // Generated overload resolver
 Native_CanvasRenderingContext2D_putImageData(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
@@ -1055,31 +1033,31 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_CanvasRenderingContext2D__putImageData_1_Callback(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D__putImageData_1_Callback";
+Native_CanvasRenderingContext2D__putImageData_1_Callback(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D_putImageData_Callback_RESOLVER_STRING_3_ImageData_float_float";
 
-Native_CanvasRenderingContext2D__putImageData_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D__putImageData_2_Callback";
+Native_CanvasRenderingContext2D__putImageData_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_putImageData_Callback_RESOLVER_STRING_7_ImageData_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_quadraticCurveTo_Callback(mthis, cpx, cpy, x, y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback";
+Native_CanvasRenderingContext2D_quadraticCurveTo_Callback(mthis, cpx, cpy, x, y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_CanvasRenderingContext2D_rect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_rect_Callback";
+Native_CanvasRenderingContext2D_rect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_rect_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_CanvasRenderingContext2D_resetTransform_Callback(mthis) native "CanvasRenderingContext2D_resetTransform_Callback";
+Native_CanvasRenderingContext2D_resetTransform_Callback(mthis) native "CanvasRenderingContext2D_resetTransform_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_restore_Callback(mthis) native "CanvasRenderingContext2D_restore_Callback";
+Native_CanvasRenderingContext2D_restore_Callback(mthis) native "CanvasRenderingContext2D_restore_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_rotate_Callback(mthis, angle) native "CanvasRenderingContext2D_rotate_Callback";
+Native_CanvasRenderingContext2D_rotate_Callback(mthis, angle) native "CanvasRenderingContext2D_rotate_Callback_RESOLVER_STRING_1_float";
 
-Native_CanvasRenderingContext2D_save_Callback(mthis) native "CanvasRenderingContext2D_save_Callback";
+Native_CanvasRenderingContext2D_save_Callback(mthis) native "CanvasRenderingContext2D_save_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_scale_Callback(mthis, sx, sy) native "CanvasRenderingContext2D_scale_Callback";
+Native_CanvasRenderingContext2D_scale_Callback(mthis, sx, sy) native "CanvasRenderingContext2D_scale_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_setLineDash_Callback(mthis, dash) native "CanvasRenderingContext2D_setLineDash_Callback";
+Native_CanvasRenderingContext2D_setLineDash_Callback(mthis, dash) native "CanvasRenderingContext2D_setLineDash_Callback_RESOLVER_STRING_1_sequence<float>";
 
-Native_CanvasRenderingContext2D_setTransform_Callback(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_setTransform_Callback";
+Native_CanvasRenderingContext2D_setTransform_Callback(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_setTransform_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_stroke_Callback(mthis) native "CanvasRenderingContext2D_stroke_Callback";
+Native_CanvasRenderingContext2D_stroke_Callback(mthis) native "CanvasRenderingContext2D_stroke_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_strokeRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_strokeRect_Callback";
+Native_CanvasRenderingContext2D_strokeRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_strokeRect_Callback_RESOLVER_STRING_4_float_float_float_float";
 
   // Generated overload resolver
 Native_CanvasRenderingContext2D_strokeText(mthis, text, x, y, maxWidth) {
@@ -1091,15 +1069,15 @@
     return;
   }
 
-Native_CanvasRenderingContext2D__strokeText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D__strokeText_1_Callback";
+Native_CanvasRenderingContext2D__strokeText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D_strokeText_Callback_RESOLVER_STRING_4_DOMString_float_float_float";
 
-Native_CanvasRenderingContext2D__strokeText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D__strokeText_2_Callback";
+Native_CanvasRenderingContext2D__strokeText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D_strokeText_Callback_RESOLVER_STRING_3_DOMString_float_float";
 
-Native_CanvasRenderingContext2D_transform_Callback(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_transform_Callback";
+Native_CanvasRenderingContext2D_transform_Callback(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_transform_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_translate_Callback(mthis, tx, ty) native "CanvasRenderingContext2D_translate_Callback";
+Native_CanvasRenderingContext2D_translate_Callback(mthis, tx, ty) native "CanvasRenderingContext2D_translate_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_webkitGetImageDataHD_Callback(mthis, sx, sy, sw, sh) native "CanvasRenderingContext2D_webkitGetImageDataHD_Callback";
+Native_CanvasRenderingContext2D_webkitGetImageDataHD_Callback(mthis, sx, sy, sw, sh) native "CanvasRenderingContext2D_webkitGetImageDataHD_Callback_RESOLVER_STRING_4_float_float_float_float";
 
   // Generated overload resolver
 Native_CanvasRenderingContext2D_putImageDataHD(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
@@ -1114,9 +1092,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback";
+Native_CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D_webkitPutImageDataHD_Callback_RESOLVER_STRING_3_ImageData_float_float";
 
-Native_CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback";
+Native_CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_webkitPutImageDataHD_Callback_RESOLVER_STRING_7_ImageData_float_float_float_float_float_float";
 
 Native_ClientRect_bottom_Getter(mthis) native "ClientRect_bottom_Getter";
 
@@ -1132,23 +1110,23 @@
 
 Native_ClientRectList_length_Getter(mthis) native "ClientRectList_length_Getter";
 
-Native_ClientRectList_NativeIndexed_Getter(mthis, index) native "ClientRectList_item_Callback";
+Native_ClientRectList_NativeIndexed_Getter(mthis, index) native "ClientRectList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_ClientRectList_item_Callback(mthis, index) native "ClientRectList_item_Callback";
+Native_ClientRectList_item_Callback(mthis, index) native "ClientRectList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Clipboard_dropEffect_Getter(mthis) native "Clipboard_dropEffect_Getter";
+Native_Clipboard_dropEffect_Getter(mthis) native "DataTransfer_dropEffect_Getter";
 
-Native_Clipboard_dropEffect_Setter(mthis, value) native "Clipboard_dropEffect_Setter";
+Native_Clipboard_dropEffect_Setter(mthis, value) native "DataTransfer_dropEffect_Setter";
 
-Native_Clipboard_effectAllowed_Getter(mthis) native "Clipboard_effectAllowed_Getter";
+Native_Clipboard_effectAllowed_Getter(mthis) native "DataTransfer_effectAllowed_Getter";
 
-Native_Clipboard_effectAllowed_Setter(mthis, value) native "Clipboard_effectAllowed_Setter";
+Native_Clipboard_effectAllowed_Setter(mthis, value) native "DataTransfer_effectAllowed_Setter";
 
-Native_Clipboard_files_Getter(mthis) native "Clipboard_files_Getter";
+Native_Clipboard_files_Getter(mthis) native "DataTransfer_files_Getter";
 
-Native_Clipboard_items_Getter(mthis) native "Clipboard_items_Getter";
+Native_Clipboard_items_Getter(mthis) native "DataTransfer_items_Getter";
 
-Native_Clipboard_types_Getter(mthis) native "Clipboard_types_Getter";
+Native_Clipboard_types_Getter(mthis) native "DataTransfer_types_Getter";
 
   // Generated overload resolver
 Native_Clipboard_clearData(mthis, type) {
@@ -1160,15 +1138,15 @@
     return;
   }
 
-Native_Clipboard__clearData_1_Callback(mthis, type) native "Clipboard__clearData_1_Callback";
+Native_Clipboard__clearData_1_Callback(mthis, type) native "DataTransfer_clearData_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Clipboard__clearData_2_Callback(mthis) native "Clipboard__clearData_2_Callback";
+Native_Clipboard__clearData_2_Callback(mthis) native "DataTransfer_clearData_Callback_RESOLVER_STRING_0_";
 
-Native_Clipboard_getData_Callback(mthis, type) native "Clipboard_getData_Callback";
+Native_Clipboard_getData_Callback(mthis, type) native "DataTransfer_getData_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Clipboard_setData_Callback(mthis, type, data) native "Clipboard_setData_Callback";
+Native_Clipboard_setData_Callback(mthis, type, data) native "DataTransfer_setData_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Clipboard_setDragImage_Callback(mthis, element, x, y) native "Clipboard_setDragImage_Callback";
+Native_Clipboard_setDragImage_Callback(mthis, image, x, y) native "DataTransfer_setDragImage_Callback_RESOLVER_STRING_3_Element_long_long";
 
 Native_CloseEvent_code_Getter(mthis) native "CloseEvent_code_Getter";
 
@@ -1181,7 +1159,7 @@
     return Native_Comment__create_1constructorCallback(data);
   }
 
-Native_Comment__create_1constructorCallback(data) native "Comment__create_1constructorCallback";
+Native_Comment__create_1constructorCallback(data) native "Comment_constructorCallback_RESOLVER_STRING_1_DOMString";
 
 Native_UIEvent_charCode_Getter(mthis) native "UIEvent_charCode_Getter";
 
@@ -1201,7 +1179,7 @@
 
 Native_UIEvent_which_Getter(mthis) native "UIEvent_which_Getter";
 
-Native_UIEvent_initUIEvent_Callback(mthis, type, canBubble, cancelable, view, detail) native "UIEvent_initUIEvent_Callback";
+Native_UIEvent_initUIEvent_Callback(mthis, type, canBubble, cancelable, view, detail) native "UIEvent_initUIEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_Window_long";
 
 Native_CompositionEvent_activeSegmentEnd_Getter(mthis) native "CompositionEvent_activeSegmentEnd_Getter";
 
@@ -1209,53 +1187,53 @@
 
 Native_CompositionEvent_data_Getter(mthis) native "CompositionEvent_data_Getter";
 
-Native_CompositionEvent_initCompositionEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "CompositionEvent_initCompositionEvent_Callback";
+Native_CompositionEvent_initCompositionEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "CompositionEvent_initCompositionEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_Window_DOMString";
 
-Native_ConsoleBase_assertCondition_Callback(mthis, condition, arg) native "ConsoleBase_assertCondition_Callback";
+Native_ConsoleBase_assertCondition_Callback(mthis, condition, arg) native "ConsoleBase_assert_Callback_RESOLVER_STRING_2_boolean_object";
 
-Native_ConsoleBase_clear_Callback(mthis, arg) native "ConsoleBase_clear_Callback";
+Native_ConsoleBase_clear_Callback(mthis, arg) native "ConsoleBase_clear_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_count_Callback(mthis, arg) native "ConsoleBase_count_Callback";
+Native_ConsoleBase_count_Callback(mthis, arg) native "ConsoleBase_count_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_debug_Callback(mthis, arg) native "ConsoleBase_debug_Callback";
+Native_ConsoleBase_debug_Callback(mthis, arg) native "ConsoleBase_debug_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_dir_Callback(mthis, arg) native "ConsoleBase_dir_Callback";
+Native_ConsoleBase_dir_Callback(mthis, arg) native "ConsoleBase_dir_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_dirxml_Callback(mthis, arg) native "ConsoleBase_dirxml_Callback";
+Native_ConsoleBase_dirxml_Callback(mthis, arg) native "ConsoleBase_dirxml_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_error_Callback(mthis, arg) native "ConsoleBase_error_Callback";
+Native_ConsoleBase_error_Callback(mthis, arg) native "ConsoleBase_error_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_group_Callback(mthis, arg) native "ConsoleBase_group_Callback";
+Native_ConsoleBase_group_Callback(mthis, arg) native "ConsoleBase_group_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_groupCollapsed_Callback(mthis, arg) native "ConsoleBase_groupCollapsed_Callback";
+Native_ConsoleBase_groupCollapsed_Callback(mthis, arg) native "ConsoleBase_groupCollapsed_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_groupEnd_Callback(mthis) native "ConsoleBase_groupEnd_Callback";
+Native_ConsoleBase_groupEnd_Callback(mthis) native "ConsoleBase_groupEnd_Callback_RESOLVER_STRING_0_";
 
-Native_ConsoleBase_info_Callback(mthis, arg) native "ConsoleBase_info_Callback";
+Native_ConsoleBase_info_Callback(mthis, arg) native "ConsoleBase_info_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_log_Callback(mthis, arg) native "ConsoleBase_log_Callback";
+Native_ConsoleBase_log_Callback(mthis, arg) native "ConsoleBase_log_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_markTimeline_Callback(mthis, title) native "ConsoleBase_markTimeline_Callback";
+Native_ConsoleBase_markTimeline_Callback(mthis, title) native "ConsoleBase_markTimeline_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_profile_Callback(mthis, title) native "ConsoleBase_profile_Callback";
+Native_ConsoleBase_profile_Callback(mthis, title) native "ConsoleBase_profile_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_profileEnd_Callback(mthis, title) native "ConsoleBase_profileEnd_Callback";
+Native_ConsoleBase_profileEnd_Callback(mthis, title) native "ConsoleBase_profileEnd_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_table_Callback(mthis, arg) native "ConsoleBase_table_Callback";
+Native_ConsoleBase_table_Callback(mthis, arg) native "ConsoleBase_table_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_time_Callback(mthis, title) native "ConsoleBase_time_Callback";
+Native_ConsoleBase_time_Callback(mthis, title) native "ConsoleBase_time_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_timeEnd_Callback(mthis, title) native "ConsoleBase_timeEnd_Callback";
+Native_ConsoleBase_timeEnd_Callback(mthis, title) native "ConsoleBase_timeEnd_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_timeStamp_Callback(mthis, title) native "ConsoleBase_timeStamp_Callback";
+Native_ConsoleBase_timeStamp_Callback(mthis, title) native "ConsoleBase_timeStamp_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_timeline_Callback(mthis, title) native "ConsoleBase_timeline_Callback";
+Native_ConsoleBase_timeline_Callback(mthis, title) native "ConsoleBase_timeline_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_timelineEnd_Callback(mthis, title) native "ConsoleBase_timelineEnd_Callback";
+Native_ConsoleBase_timelineEnd_Callback(mthis, title) native "ConsoleBase_timelineEnd_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_trace_Callback(mthis, arg) native "ConsoleBase_trace_Callback";
+Native_ConsoleBase_trace_Callback(mthis, arg) native "ConsoleBase_trace_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_warn_Callback(mthis, arg) native "ConsoleBase_warn_Callback";
+Native_ConsoleBase_warn_Callback(mthis, arg) native "ConsoleBase_warn_Callback_RESOLVER_STRING_1_object";
 
 Native_Console_memory_Getter(mthis) native "Console_memory_Getter";
 
@@ -1297,38 +1275,38 @@
 
 Native_DOMException_name_Getter(mthis) native "DOMException_name_Getter";
 
-Native_DOMException_toString_Callback(mthis) native "DOMException_toString_Callback";
+Native_DOMException_toString_Callback(mthis) native "DOMException_toString_Callback_RESOLVER_STRING_0_";
 
 Native_DOMFileSystem_name_Getter(mthis) native "DOMFileSystem_name_Getter";
 
 Native_DOMFileSystem_root_Getter(mthis) native "DOMFileSystem_root_Getter";
 
-Native_DOMImplementation_createCSSStyleSheet_Callback(mthis, title, media) native "DOMImplementation_createCSSStyleSheet_Callback";
+Native_DOMImplementation_createCSSStyleSheet_Callback(mthis, title, media) native "DOMImplementation_createCSSStyleSheet_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_DOMImplementation_createDocument_Callback(mthis, namespaceURI, qualifiedName, doctype) native "DOMImplementation_createDocument_Callback";
+Native_DOMImplementation_createDocument_Callback(mthis, namespaceURI, qualifiedName, doctype) native "DOMImplementation_createDocument_Callback_RESOLVER_STRING_3_DOMString_DOMString_DocumentType";
 
-Native_DOMImplementation_createDocumentType_Callback(mthis, qualifiedName, publicId, systemId) native "DOMImplementation_createDocumentType_Callback";
+Native_DOMImplementation_createDocumentType_Callback(mthis, qualifiedName, publicId, systemId) native "DOMImplementation_createDocumentType_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_DOMImplementation_createHTMLDocument_Callback(mthis, title) native "DOMImplementation_createHTMLDocument_Callback";
+Native_DOMImplementation_createHTMLDocument_Callback(mthis, title) native "DOMImplementation_createHTMLDocument_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_DOMImplementation_hasFeature_Callback(mthis, feature, version) native "DOMImplementation_hasFeature_Callback";
+Native_DOMImplementation_hasFeature_Callback(mthis, feature, version) native "DOMImplementation_hasFeature_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
   // Generated overload resolver
 Native_DOMParser_DomParser() {
     return Native_DOMParser__create_1constructorCallback();
   }
 
-Native_DOMParser__create_1constructorCallback() native "DOMParser__create_1constructorCallback";
+Native_DOMParser__create_1constructorCallback() native "DOMParser_constructorCallback_RESOLVER_STRING_0_";
 
-Native_DOMParser_parseFromString_Callback(mthis, str, contentType) native "DOMParser_parseFromString_Callback";
+Native_DOMParser_parseFromString_Callback(mthis, str, contentType) native "DOMParser_parseFromString_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
 Native_DOMTokenList_length_Getter(mthis) native "DOMTokenList_length_Getter";
 
-Native_DOMTokenList_contains_Callback(mthis, token) native "DOMTokenList_contains_Callback";
+Native_DOMTokenList_contains_Callback(mthis, token) native "DOMTokenList_contains_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_DOMTokenList_item_Callback(mthis, index) native "DOMTokenList_item_Callback";
+Native_DOMTokenList_item_Callback(mthis, index) native "DOMTokenList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_DOMTokenList_toString_Callback(mthis) native "DOMTokenList_toString_Callback";
+Native_DOMTokenList_toString_Callback(mthis) native "DOMTokenList_toString_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_DOMTokenList_toggle(mthis, token, force) {
@@ -1338,23 +1316,23 @@
     return Native_DOMTokenList__toggle_2_Callback(mthis, token);
   }
 
-Native_DOMTokenList__toggle_1_Callback(mthis, token, force) native "DOMTokenList__toggle_1_Callback";
+Native_DOMTokenList__toggle_1_Callback(mthis, token, force) native "DOMTokenList_toggle_Callback_RESOLVER_STRING_2_DOMString_boolean";
 
-Native_DOMTokenList__toggle_2_Callback(mthis, token) native "DOMTokenList__toggle_2_Callback";
+Native_DOMTokenList__toggle_2_Callback(mthis, token) native "DOMTokenList_toggle_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_DOMSettableTokenList_value_Getter(mthis) native "DOMSettableTokenList_value_Getter";
 
 Native_DOMSettableTokenList_value_Setter(mthis, value) native "DOMSettableTokenList_value_Setter";
 
-Native_DOMSettableTokenList___getter___Callback(mthis, index) native "DOMSettableTokenList___getter___Callback";
+Native_DOMSettableTokenList___getter___Callback(mthis, index) native "DOMSettableTokenList___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_DOMStringList_length_Getter(mthis) native "DOMStringList_length_Getter";
 
-Native_DOMStringList_NativeIndexed_Getter(mthis, index) native "DOMStringList_item_Callback";
+Native_DOMStringList_NativeIndexed_Getter(mthis, index) native "DOMStringList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_DOMStringList_contains_Callback(mthis, string) native "DOMStringList_contains_Callback";
+Native_DOMStringList_contains_Callback(mthis, string) native "DOMStringList_contains_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_DOMStringList_item_Callback(mthis, index) native "DOMStringList_item_Callback";
+Native_DOMStringList_item_Callback(mthis, index) native "DOMStringList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
   // Generated overload resolver
 Native_DOMStringMap___delete__(mthis, index_OR_name) {
@@ -1367,9 +1345,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_DOMStringMap____delete___1_Callback(mthis, index_OR_name) native "DOMStringMap____delete___1_Callback";
+Native_DOMStringMap____delete___1_Callback(mthis, index_OR_name) native "DOMStringMap___delete___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_DOMStringMap____delete___2_Callback(mthis, index_OR_name) native "DOMStringMap____delete___2_Callback";
+Native_DOMStringMap____delete___2_Callback(mthis, index_OR_name) native "DOMStringMap___delete___Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
 Native_DOMStringMap___getter__(mthis, index_OR_name) {
@@ -1382,9 +1360,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_DOMStringMap____getter___1_Callback(mthis, index_OR_name) native "DOMStringMap____getter___1_Callback";
+Native_DOMStringMap____getter___1_Callback(mthis, index_OR_name) native "DOMStringMap___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_DOMStringMap____getter___2_Callback(mthis, index_OR_name) native "DOMStringMap____getter___2_Callback";
+Native_DOMStringMap____getter___2_Callback(mthis, index_OR_name) native "DOMStringMap___getter___Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
 Native_DOMStringMap___setter__(mthis, index_OR_name, value) {
@@ -1399,23 +1377,23 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_DOMStringMap____setter___1_Callback(mthis, index_OR_name, value) native "DOMStringMap____setter___1_Callback";
+Native_DOMStringMap____setter___1_Callback(mthis, index_OR_name, value) native "DOMStringMap___setter___Callback_RESOLVER_STRING_2_unsigned long_DOMString";
 
-Native_DOMStringMap____setter___2_Callback(mthis, index_OR_name, value) native "DOMStringMap____setter___2_Callback";
+Native_DOMStringMap____setter___2_Callback(mthis, index_OR_name, value) native "DOMStringMap___setter___Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
 Native_DataTransferItem_kind_Getter(mthis) native "DataTransferItem_kind_Getter";
 
 Native_DataTransferItem_type_Getter(mthis) native "DataTransferItem_type_Getter";
 
-Native_DataTransferItem_getAsFile_Callback(mthis) native "DataTransferItem_getAsFile_Callback";
+Native_DataTransferItem_getAsFile_Callback(mthis) native "DataTransferItem_getAsFile_Callback_RESOLVER_STRING_0_";
 
-Native_DataTransferItem_getAsString_Callback(mthis, callback) native "DataTransferItem_getAsString_Callback";
+Native_DataTransferItem_getAsString_Callback(mthis, callback) native "DataTransferItem_getAsString_Callback_RESOLVER_STRING_1_StringCallback";
 
-Native_DataTransferItem_webkitGetAsEntry_Callback(mthis) native "DataTransferItem_webkitGetAsEntry_Callback";
+Native_DataTransferItem_webkitGetAsEntry_Callback(mthis) native "DataTransferItem_webkitGetAsEntry_Callback_RESOLVER_STRING_0_";
 
 Native_DataTransferItemList_length_Getter(mthis) native "DataTransferItemList_length_Getter";
 
-Native_DataTransferItemList___getter___Callback(mthis, index) native "DataTransferItemList___getter___Callback";
+Native_DataTransferItemList___getter___Callback(mthis, index) native "DataTransferItemList___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
   // Generated overload resolver
 Native_DataTransferItemList_add(mthis, data_OR_file, type) {
@@ -1428,33 +1406,33 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_DataTransferItemList__add_1_Callback(mthis, data_OR_file) native "DataTransferItemList__add_1_Callback";
+Native_DataTransferItemList__add_1_Callback(mthis, data_OR_file) native "DataTransferItemList_add_Callback_RESOLVER_STRING_1_File";
 
-Native_DataTransferItemList__add_2_Callback(mthis, data_OR_file, type) native "DataTransferItemList__add_2_Callback";
+Native_DataTransferItemList__add_2_Callback(mthis, data_OR_file, type) native "DataTransferItemList_add_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_DataTransferItemList_addData_Callback(mthis, data, type) native "DataTransferItemList_addData_Callback";
+Native_DataTransferItemList_addData_Callback(mthis, data, type) native "DataTransferItemList_add_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_DataTransferItemList_addFile_Callback(mthis, file) native "DataTransferItemList_addFile_Callback";
+Native_DataTransferItemList_addFile_Callback(mthis, file) native "DataTransferItemList_add_Callback_RESOLVER_STRING_1_File";
 
-Native_DataTransferItemList_clear_Callback(mthis) native "DataTransferItemList_clear_Callback";
+Native_DataTransferItemList_clear_Callback(mthis) native "DataTransferItemList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_DataTransferItemList_remove_Callback(mthis, index) native "DataTransferItemList_remove_Callback";
+Native_DataTransferItemList_remove_Callback(mthis, index) native "DataTransferItemList_remove_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_Database_version_Getter(mthis) native "Database_version_Getter";
 
-Native_Database_changeVersion_Callback(mthis, oldVersion, newVersion, callback, errorCallback, successCallback) native "Database_changeVersion_Callback";
+Native_Database_changeVersion_Callback(mthis, oldVersion, newVersion, callback, errorCallback, successCallback) native "Database_changeVersion_Callback_RESOLVER_STRING_5_DOMString_DOMString_SQLTransactionCallback_SQLTransactionErrorCallback_VoidCallback";
 
-Native_Database_readTransaction_Callback(mthis, callback, errorCallback, successCallback) native "Database_readTransaction_Callback";
+Native_Database_readTransaction_Callback(mthis, callback, errorCallback, successCallback) native "Database_readTransaction_Callback_RESOLVER_STRING_3_SQLTransactionCallback_SQLTransactionErrorCallback_VoidCallback";
 
-Native_Database_transaction_Callback(mthis, callback, errorCallback, successCallback) native "Database_transaction_Callback";
+Native_Database_transaction_Callback(mthis, callback, errorCallback, successCallback) native "Database_transaction_Callback_RESOLVER_STRING_3_SQLTransactionCallback_SQLTransactionErrorCallback_VoidCallback";
 
-Native_WindowBase64_atob_Callback(mthis, string) native "WindowBase64_atob_Callback";
+Native_WindowBase64_atob_Callback(mthis, string) native "WindowBase64_atob_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WindowBase64_btoa_Callback(mthis, string) native "WindowBase64_btoa_Callback";
+Native_WindowBase64_btoa_Callback(mthis, string) native "WindowBase64_btoa_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WindowTimers_clearInterval_Callback(mthis, handle) native "WindowTimers_clearInterval_Callback";
+Native_WindowTimers_clearInterval_Callback(mthis, handle) native "WindowTimers_clearInterval_Callback_RESOLVER_STRING_1_long";
 
-Native_WindowTimers_clearTimeout_Callback(mthis, handle) native "WindowTimers_clearTimeout_Callback";
+Native_WindowTimers_clearTimeout_Callback(mthis, handle) native "WindowTimers_clearTimeout_Callback_RESOLVER_STRING_1_long";
 
 Native_WindowTimers_setInterval_Callback(mthis, handler, timeout) native "WindowTimers_setInterval_Callback";
 
@@ -1476,33 +1454,27 @@
 
 Native_WorkerGlobalScope_webkitNotifications_Getter(mthis) native "WorkerGlobalScope_webkitNotifications_Getter";
 
-Native_WorkerGlobalScope_close_Callback(mthis) native "WorkerGlobalScope_close_Callback";
+Native_WorkerGlobalScope_close_Callback(mthis) native "WorkerGlobalScope_close_Callback_RESOLVER_STRING_0_";
 
-Native_WorkerGlobalScope_openDatabase_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabase_Callback";
+Native_WorkerGlobalScope_openDatabase_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabase_Callback_RESOLVER_STRING_5_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
 
-Native_WorkerGlobalScope_openDatabaseSync_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabaseSync_Callback";
+Native_WorkerGlobalScope_openDatabaseSync_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabaseSync_Callback_RESOLVER_STRING_5_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
 
-Native_WorkerGlobalScope_webkitRequestFileSystem_Callback(mthis, type, size, successCallback, errorCallback) native "WorkerGlobalScope_webkitRequestFileSystem_Callback";
+Native_WorkerGlobalScope_webkitRequestFileSystem_Callback(mthis, type, size, successCallback, errorCallback) native "WorkerGlobalScope_webkitRequestFileSystem_Callback_RESOLVER_STRING_4_unsigned short_long long_FileSystemCallback_ErrorCallback";
 
-Native_WorkerGlobalScope_webkitRequestFileSystemSync_Callback(mthis, type, size) native "WorkerGlobalScope_webkitRequestFileSystemSync_Callback";
+Native_WorkerGlobalScope_webkitRequestFileSystemSync_Callback(mthis, type, size) native "WorkerGlobalScope_webkitRequestFileSystemSync_Callback_RESOLVER_STRING_2_unsigned short_long long";
 
-Native_WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback(mthis, url) native "WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback";
+Native_WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback(mthis, url) native "WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback(mthis, url, successCallback, errorCallback) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback";
+Native_WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback(mthis, url, successCallback, errorCallback) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback_RESOLVER_STRING_3_DOMString_EntryCallback_ErrorCallback";
 
-Native_WorkerGlobalScope_addEventListener_Callback(mthis, type, listener, useCapture) native "WorkerGlobalScope_addEventListener_Callback";
+Native_WorkerGlobalScope_atob_Callback(mthis, string) native "WorkerGlobalScope_atob_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WorkerGlobalScope_dispatchEvent_Callback(mthis, event) native "WorkerGlobalScope_dispatchEvent_Callback";
+Native_WorkerGlobalScope_btoa_Callback(mthis, string) native "WorkerGlobalScope_btoa_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WorkerGlobalScope_removeEventListener_Callback(mthis, type, listener, useCapture) native "WorkerGlobalScope_removeEventListener_Callback";
+Native_WorkerGlobalScope_clearInterval_Callback(mthis, handle) native "WorkerGlobalScope_clearInterval_Callback_RESOLVER_STRING_1_long";
 
-Native_WorkerGlobalScope_atob_Callback(mthis, string) native "WorkerGlobalScope_atob_Callback";
-
-Native_WorkerGlobalScope_btoa_Callback(mthis, string) native "WorkerGlobalScope_btoa_Callback";
-
-Native_WorkerGlobalScope_clearInterval_Callback(mthis, handle) native "WorkerGlobalScope_clearInterval_Callback";
-
-Native_WorkerGlobalScope_clearTimeout_Callback(mthis, handle) native "WorkerGlobalScope_clearTimeout_Callback";
+Native_WorkerGlobalScope_clearTimeout_Callback(mthis, handle) native "WorkerGlobalScope_clearTimeout_Callback_RESOLVER_STRING_1_long";
 
 Native_WorkerGlobalScope_setInterval_Callback(mthis, handler, timeout) native "WorkerGlobalScope_setInterval_Callback";
 
@@ -1512,13 +1484,13 @@
 
 Native_DelayNode_delayTime_Getter(mthis) native "DelayNode_delayTime_Getter";
 
-Native_DeprecatedStorageInfo_queryUsageAndQuota_Callback(mthis, storageType, usageCallback, errorCallback) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback";
+Native_DeprecatedStorageInfo_queryUsageAndQuota_Callback(mthis, storageType, usageCallback, errorCallback) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback_RESOLVER_STRING_3_unsigned short_StorageUsageCallback_StorageErrorCallback";
 
-Native_DeprecatedStorageInfo_requestQuota_Callback(mthis, storageType, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageInfo_requestQuota_Callback";
+Native_DeprecatedStorageInfo_requestQuota_Callback(mthis, storageType, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageInfo_requestQuota_Callback_RESOLVER_STRING_4_unsigned short_unsigned long long_StorageQuotaCallback_StorageErrorCallback";
 
-Native_DeprecatedStorageQuota_queryUsageAndQuota_Callback(mthis, usageCallback, errorCallback) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback";
+Native_DeprecatedStorageQuota_queryUsageAndQuota_Callback(mthis, usageCallback, errorCallback) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback_RESOLVER_STRING_2_StorageUsageCallback_StorageErrorCallback";
 
-Native_DeprecatedStorageQuota_requestQuota_Callback(mthis, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageQuota_requestQuota_Callback";
+Native_DeprecatedStorageQuota_requestQuota_Callback(mthis, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageQuota_requestQuota_Callback_RESOLVER_STRING_3_unsigned long long_StorageQuotaCallback_StorageErrorCallback";
 
 Native_DeviceAcceleration_x_Getter(mthis) native "DeviceAcceleration_x_Getter";
 
@@ -1572,13 +1544,13 @@
     return;
   }
 
-Native_Entry__copyTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry__copyTo_1_Callback";
+Native_Entry__copyTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry_copyTo_Callback_RESOLVER_STRING_4_DirectoryEntry_DOMString_EntryCallback_ErrorCallback";
 
-Native_Entry__copyTo_2_Callback(mthis, parent) native "Entry__copyTo_2_Callback";
+Native_Entry__copyTo_2_Callback(mthis, parent) native "Entry_copyTo_Callback_RESOLVER_STRING_1_DirectoryEntry";
 
-Native_Entry_getMetadata_Callback(mthis, successCallback, errorCallback) native "Entry_getMetadata_Callback";
+Native_Entry_getMetadata_Callback(mthis, successCallback, errorCallback) native "Entry_getMetadata_Callback_RESOLVER_STRING_2_MetadataCallback_ErrorCallback";
 
-Native_Entry_getParent_Callback(mthis, successCallback, errorCallback) native "Entry_getParent_Callback";
+Native_Entry_getParent_Callback(mthis, successCallback, errorCallback) native "Entry_getParent_Callback_RESOLVER_STRING_2_EntryCallback_ErrorCallback";
 
   // Generated overload resolver
 Native_Entry__moveTo(mthis, parent, name, successCallback, errorCallback) {
@@ -1590,23 +1562,23 @@
     return;
   }
 
-Native_Entry__moveTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry__moveTo_1_Callback";
+Native_Entry__moveTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry_moveTo_Callback_RESOLVER_STRING_4_DirectoryEntry_DOMString_EntryCallback_ErrorCallback";
 
-Native_Entry__moveTo_2_Callback(mthis, parent) native "Entry__moveTo_2_Callback";
+Native_Entry__moveTo_2_Callback(mthis, parent) native "Entry_moveTo_Callback_RESOLVER_STRING_1_DirectoryEntry";
 
-Native_Entry_remove_Callback(mthis, successCallback, errorCallback) native "Entry_remove_Callback";
+Native_Entry_remove_Callback(mthis, successCallback, errorCallback) native "Entry_remove_Callback_RESOLVER_STRING_2_VoidCallback_ErrorCallback";
 
-Native_Entry_toURL_Callback(mthis) native "Entry_toURL_Callback";
+Native_Entry_toURL_Callback(mthis) native "Entry_toURL_Callback_RESOLVER_STRING_0_";
 
-Native_DirectoryEntry_createReader_Callback(mthis) native "DirectoryEntry_createReader_Callback";
+Native_DirectoryEntry_createReader_Callback(mthis) native "DirectoryEntry_createReader_Callback_RESOLVER_STRING_0_";
 
-Native_DirectoryEntry_getDirectory_Callback(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getDirectory_Callback";
+Native_DirectoryEntry_getDirectory_Callback(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getDirectory_Callback_RESOLVER_STRING_4_DOMString_Dictionary_EntryCallback_ErrorCallback";
 
-Native_DirectoryEntry_getFile_Callback(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getFile_Callback";
+Native_DirectoryEntry_getFile_Callback(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getFile_Callback_RESOLVER_STRING_4_DOMString_Dictionary_EntryCallback_ErrorCallback";
 
-Native_DirectoryEntry_removeRecursively_Callback(mthis, successCallback, errorCallback) native "DirectoryEntry_removeRecursively_Callback";
+Native_DirectoryEntry_removeRecursively_Callback(mthis, successCallback, errorCallback) native "DirectoryEntry_removeRecursively_Callback_RESOLVER_STRING_2_VoidCallback_ErrorCallback";
 
-Native_DirectoryReader_readEntries_Callback(mthis, successCallback, errorCallback) native "DirectoryReader_readEntries_Callback";
+Native_DirectoryReader_readEntries_Callback(mthis, successCallback, errorCallback) native "DirectoryReader_readEntries_Callback_RESOLVER_STRING_2_EntriesCallback_ErrorCallback";
 
 Native_ParentNode_childElementCount_Getter(mthis) native "ParentNode_childElementCount_Getter";
 
@@ -1676,11 +1648,11 @@
 
 Native_Document_webkitVisibilityState_Getter(mthis) native "Document_webkitVisibilityState_Getter";
 
-Native_Document_adoptNode_Callback(mthis, node) native "Document_adoptNode_Callback";
+Native_Document_adoptNode_Callback(mthis, node) native "Document_adoptNode_Callback_RESOLVER_STRING_1_Node";
 
-Native_Document_caretRangeFromPoint_Callback(mthis, x, y) native "Document_caretRangeFromPoint_Callback";
+Native_Document_caretRangeFromPoint_Callback(mthis, x, y) native "Document_caretRangeFromPoint_Callback_RESOLVER_STRING_2_long_long";
 
-Native_Document_createDocumentFragment_Callback(mthis) native "Document_createDocumentFragment_Callback";
+Native_Document_createDocumentFragment_Callback(mthis) native "Document_createDocumentFragment_Callback_RESOLVER_STRING_0_";
 
 Native_Document_createElement_Callback(mthis, localName_OR_tagName, typeExtension) native "Document_createElement_Callback";
 
@@ -1694,9 +1666,9 @@
     return Native_Document__createEvent_2_Callback(mthis);
   }
 
-Native_Document__createEvent_1_Callback(mthis, eventType) native "Document__createEvent_1_Callback";
+Native_Document__createEvent_1_Callback(mthis, eventType) native "Document_createEvent_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document__createEvent_2_Callback(mthis) native "Document__createEvent_2_Callback";
+Native_Document__createEvent_2_Callback(mthis) native "Document_createEvent_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_Document__createNodeIterator(mthis, root, whatToShow, filter) {
@@ -1709,17 +1681,17 @@
     return Native_Document__createNodeIterator_3_Callback(mthis, root);
   }
 
-Native_Document__createNodeIterator_1_Callback(mthis, root, whatToShow, filter) native "Document__createNodeIterator_1_Callback";
+Native_Document__createNodeIterator_1_Callback(mthis, root, whatToShow, filter) native "Document_createNodeIterator_Callback_RESOLVER_STRING_3_Node_unsigned long_NodeFilter";
 
-Native_Document__createNodeIterator_2_Callback(mthis, root, whatToShow) native "Document__createNodeIterator_2_Callback";
+Native_Document__createNodeIterator_2_Callback(mthis, root, whatToShow) native "Document_createNodeIterator_Callback_RESOLVER_STRING_2_Node_unsigned long";
 
-Native_Document__createNodeIterator_3_Callback(mthis, root) native "Document__createNodeIterator_3_Callback";
+Native_Document__createNodeIterator_3_Callback(mthis, root) native "Document_createNodeIterator_Callback_RESOLVER_STRING_1_Node";
 
-Native_Document_createRange_Callback(mthis) native "Document_createRange_Callback";
+Native_Document_createRange_Callback(mthis) native "Document_createRange_Callback_RESOLVER_STRING_0_";
 
-Native_Document_createTextNode_Callback(mthis, data) native "Document_createTextNode_Callback";
+Native_Document_createTextNode_Callback(mthis, data) native "Document_createTextNode_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_createTouch_Callback(mthis, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native "Document_createTouch_Callback";
+Native_Document_createTouch_Callback(mthis, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native "Document_createTouch_Callback_RESOLVER_STRING_11_Window_EventTarget_long_long_long_long_long_long_long_float_float";
 
   // Generated overload resolver
 Native_Document__createTreeWalker(mthis, root, whatToShow, filter) {
@@ -1732,25 +1704,25 @@
     return Native_Document__createTreeWalker_3_Callback(mthis, root);
   }
 
-Native_Document__createTreeWalker_1_Callback(mthis, root, whatToShow, filter) native "Document__createTreeWalker_1_Callback";
+Native_Document__createTreeWalker_1_Callback(mthis, root, whatToShow, filter) native "Document_createTreeWalker_Callback_RESOLVER_STRING_3_Node_unsigned long_NodeFilter";
 
-Native_Document__createTreeWalker_2_Callback(mthis, root, whatToShow) native "Document__createTreeWalker_2_Callback";
+Native_Document__createTreeWalker_2_Callback(mthis, root, whatToShow) native "Document_createTreeWalker_Callback_RESOLVER_STRING_2_Node_unsigned long";
 
-Native_Document__createTreeWalker_3_Callback(mthis, root) native "Document__createTreeWalker_3_Callback";
+Native_Document__createTreeWalker_3_Callback(mthis, root) native "Document_createTreeWalker_Callback_RESOLVER_STRING_1_Node";
 
-Native_Document_elementFromPoint_Callback(mthis, x, y) native "Document_elementFromPoint_Callback";
+Native_Document_elementFromPoint_Callback(mthis, x, y) native "Document_elementFromPoint_Callback_RESOLVER_STRING_2_long_long";
 
-Native_Document_execCommand_Callback(mthis, command, userInterface, value) native "Document_execCommand_Callback";
+Native_Document_execCommand_Callback(mthis, command, userInterface, value) native "Document_execCommand_Callback_RESOLVER_STRING_3_DOMString_boolean_DOMString";
 
-Native_Document_getCSSCanvasContext_Callback(mthis, contextId, name, width, height) native "Document_getCSSCanvasContext_Callback";
+Native_Document_getCSSCanvasContext_Callback(mthis, contextId, name, width, height) native "Document_getCSSCanvasContext_Callback_RESOLVER_STRING_4_DOMString_DOMString_long_long";
 
-Native_Document_getElementById_Callback(mthis, elementId) native "Document_getElementById_Callback";
+Native_Document_getElementById_Callback(mthis, elementId) native "Document_getElementById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_getElementsByClassName_Callback(mthis, classNames) native "Document_getElementsByClassName_Callback";
+Native_Document_getElementsByClassName_Callback(mthis, classNames) native "Document_getElementsByClassName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_getElementsByName_Callback(mthis, elementName) native "Document_getElementsByName_Callback";
+Native_Document_getElementsByName_Callback(mthis, elementName) native "Document_getElementsByName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_getElementsByTagName_Callback(mthis, localName) native "Document_getElementsByTagName_Callback";
+Native_Document_getElementsByTagName_Callback(mthis, localName) native "Document_getElementsByTagName_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
 Native_Document_importNode(mthis, node, deep) {
@@ -1760,27 +1732,27 @@
     return Native_Document__importNode_2_Callback(mthis, node);
   }
 
-Native_Document__importNode_1_Callback(mthis, node, deep) native "Document__importNode_1_Callback";
+Native_Document__importNode_1_Callback(mthis, node, deep) native "Document_importNode_Callback_RESOLVER_STRING_2_Node_boolean";
 
-Native_Document__importNode_2_Callback(mthis, node) native "Document__importNode_2_Callback";
+Native_Document__importNode_2_Callback(mthis, node) native "Document_importNode_Callback_RESOLVER_STRING_1_Node";
 
-Native_Document_queryCommandEnabled_Callback(mthis, command) native "Document_queryCommandEnabled_Callback";
+Native_Document_queryCommandEnabled_Callback(mthis, command) native "Document_queryCommandEnabled_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_queryCommandIndeterm_Callback(mthis, command) native "Document_queryCommandIndeterm_Callback";
+Native_Document_queryCommandIndeterm_Callback(mthis, command) native "Document_queryCommandIndeterm_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_queryCommandState_Callback(mthis, command) native "Document_queryCommandState_Callback";
+Native_Document_queryCommandState_Callback(mthis, command) native "Document_queryCommandState_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_queryCommandSupported_Callback(mthis, command) native "Document_queryCommandSupported_Callback";
+Native_Document_queryCommandSupported_Callback(mthis, command) native "Document_queryCommandSupported_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_queryCommandValue_Callback(mthis, command) native "Document_queryCommandValue_Callback";
+Native_Document_queryCommandValue_Callback(mthis, command) native "Document_queryCommandValue_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_querySelector_Callback(mthis, selectors) native "Document_querySelector_Callback";
+Native_Document_querySelector_Callback(mthis, selectors) native "Document_querySelector_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_querySelectorAll_Callback(mthis, selectors) native "Document_querySelectorAll_Callback";
+Native_Document_querySelectorAll_Callback(mthis, selectors) native "Document_querySelectorAll_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_webkitExitFullscreen_Callback(mthis) native "Document_webkitExitFullscreen_Callback";
+Native_Document_webkitExitFullscreen_Callback(mthis) native "Document_webkitExitFullscreen_Callback_RESOLVER_STRING_0_";
 
-Native_Document_webkitExitPointerLock_Callback(mthis) native "Document_webkitExitPointerLock_Callback";
+Native_Document_webkitExitPointerLock_Callback(mthis) native "Document_webkitExitPointerLock_Callback_RESOLVER_STRING_0_";
 
 Native_Document_childElementCount_Getter(mthis) native "Document_childElementCount_Getter";
 
@@ -1790,9 +1762,9 @@
 
 Native_Document_lastElementChild_Getter(mthis) native "Document_lastElementChild_Getter";
 
-Native_DocumentFragment_querySelector_Callback(mthis, selectors) native "DocumentFragment_querySelector_Callback";
+Native_DocumentFragment_querySelector_Callback(mthis, selectors) native "DocumentFragment_querySelector_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_DocumentFragment_querySelectorAll_Callback(mthis, selectors) native "DocumentFragment_querySelectorAll_Callback";
+Native_DocumentFragment_querySelectorAll_Callback(mthis, selectors) native "DocumentFragment_querySelectorAll_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_DocumentFragment_childElementCount_Getter(mthis) native "DocumentFragment_childElementCount_Getter";
 
@@ -1882,55 +1854,55 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Element__animate_1_Callback(mthis, keyframes, timingInput) native "Element__animate_1_Callback";
+Native_Element__animate_1_Callback(mthis, keyframes, timingInput) native "Element_animate_Callback_RESOLVER_STRING_2_sequence<Dictionary>_Dictionary";
 
-Native_Element__animate_2_Callback(mthis, keyframes, timingInput) native "Element__animate_2_Callback";
+Native_Element__animate_2_Callback(mthis, keyframes, timingInput) native "Element_animate_Callback_RESOLVER_STRING_2_sequence<Dictionary>_double";
 
-Native_Element__animate_3_Callback(mthis, keyframes) native "Element__animate_3_Callback";
+Native_Element__animate_3_Callback(mthis, keyframes) native "Element_animate_Callback_RESOLVER_STRING_1_sequence<Dictionary>";
 
-Native_Element_blur_Callback(mthis) native "Element_blur_Callback";
+Native_Element_blur_Callback(mthis) native "Element_blur_Callback_RESOLVER_STRING_0_";
 
-Native_Element_createShadowRoot_Callback(mthis) native "Element_createShadowRoot_Callback";
+Native_Element_createShadowRoot_Callback(mthis) native "Element_createShadowRoot_Callback_RESOLVER_STRING_0_";
 
-Native_Element_focus_Callback(mthis) native "Element_focus_Callback";
+Native_Element_focus_Callback(mthis) native "Element_focus_Callback_RESOLVER_STRING_0_";
 
-Native_Element_getAttribute_Callback(mthis, name) native "Element_getAttribute_Callback";
+Native_Element_getAttribute_Callback(mthis, name) native "Element_getAttribute_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_getAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_getAttributeNS_Callback";
+Native_Element_getAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_getAttributeNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_getBoundingClientRect_Callback(mthis) native "Element_getBoundingClientRect_Callback";
+Native_Element_getBoundingClientRect_Callback(mthis) native "Element_getBoundingClientRect_Callback_RESOLVER_STRING_0_";
 
-Native_Element_getClientRects_Callback(mthis) native "Element_getClientRects_Callback";
+Native_Element_getClientRects_Callback(mthis) native "Element_getClientRects_Callback_RESOLVER_STRING_0_";
 
-Native_Element_getDestinationInsertionPoints_Callback(mthis) native "Element_getDestinationInsertionPoints_Callback";
+Native_Element_getDestinationInsertionPoints_Callback(mthis) native "Element_getDestinationInsertionPoints_Callback_RESOLVER_STRING_0_";
 
-Native_Element_getElementsByClassName_Callback(mthis, classNames) native "Element_getElementsByClassName_Callback";
+Native_Element_getElementsByClassName_Callback(mthis, classNames) native "Element_getElementsByClassName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_getElementsByTagName_Callback(mthis, name) native "Element_getElementsByTagName_Callback";
+Native_Element_getElementsByTagName_Callback(mthis, name) native "Element_getElementsByTagName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_hasAttribute_Callback(mthis, name) native "Element_hasAttribute_Callback";
+Native_Element_hasAttribute_Callback(mthis, name) native "Element_hasAttribute_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_hasAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_hasAttributeNS_Callback";
+Native_Element_hasAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_hasAttributeNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_insertAdjacentElement_Callback(mthis, where, element) native "Element_insertAdjacentElement_Callback";
+Native_Element_insertAdjacentElement_Callback(mthis, where, element) native "Element_insertAdjacentElement_Callback_RESOLVER_STRING_2_DOMString_Element";
 
-Native_Element_insertAdjacentHTML_Callback(mthis, where, html) native "Element_insertAdjacentHTML_Callback";
+Native_Element_insertAdjacentHTML_Callback(mthis, where, html) native "Element_insertAdjacentHTML_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_insertAdjacentText_Callback(mthis, where, text) native "Element_insertAdjacentText_Callback";
+Native_Element_insertAdjacentText_Callback(mthis, where, text) native "Element_insertAdjacentText_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_matches_Callback(mthis, selectors) native "Element_matches_Callback";
+Native_Element_matches_Callback(mthis, selectors) native "Element_matches_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_querySelector_Callback(mthis, selectors) native "Element_querySelector_Callback";
+Native_Element_querySelector_Callback(mthis, selectors) native "Element_querySelector_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_querySelectorAll_Callback(mthis, selectors) native "Element_querySelectorAll_Callback";
+Native_Element_querySelectorAll_Callback(mthis, selectors) native "Element_querySelectorAll_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_removeAttribute_Callback(mthis, name) native "Element_removeAttribute_Callback";
+Native_Element_removeAttribute_Callback(mthis, name) native "Element_removeAttribute_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_removeAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_removeAttributeNS_Callback";
+Native_Element_removeAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_removeAttributeNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_scrollByLines_Callback(mthis, lines) native "Element_scrollByLines_Callback";
+Native_Element_scrollByLines_Callback(mthis, lines) native "Element_scrollByLines_Callback_RESOLVER_STRING_1_long";
 
-Native_Element_scrollByPages_Callback(mthis, pages) native "Element_scrollByPages_Callback";
+Native_Element_scrollByPages_Callback(mthis, pages) native "Element_scrollByPages_Callback_RESOLVER_STRING_1_long";
 
   // Generated overload resolver
 Native_Element__scrollIntoView(mthis, alignWithTop) {
@@ -1942,9 +1914,9 @@
     return;
   }
 
-Native_Element__scrollIntoView_1_Callback(mthis, alignWithTop) native "Element__scrollIntoView_1_Callback";
+Native_Element__scrollIntoView_1_Callback(mthis, alignWithTop) native "Element_scrollIntoView_Callback_RESOLVER_STRING_1_boolean";
 
-Native_Element__scrollIntoView_2_Callback(mthis) native "Element__scrollIntoView_2_Callback";
+Native_Element__scrollIntoView_2_Callback(mthis) native "Element_scrollIntoView_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_Element__scrollIntoViewIfNeeded(mthis, centerIfNeeded) {
@@ -1956,23 +1928,23 @@
     return;
   }
 
-Native_Element__scrollIntoViewIfNeeded_1_Callback(mthis, centerIfNeeded) native "Element__scrollIntoViewIfNeeded_1_Callback";
+Native_Element__scrollIntoViewIfNeeded_1_Callback(mthis, centerIfNeeded) native "Element_scrollIntoViewIfNeeded_Callback_RESOLVER_STRING_1_boolean";
 
-Native_Element__scrollIntoViewIfNeeded_2_Callback(mthis) native "Element__scrollIntoViewIfNeeded_2_Callback";
+Native_Element__scrollIntoViewIfNeeded_2_Callback(mthis) native "Element_scrollIntoViewIfNeeded_Callback_RESOLVER_STRING_0_";
 
-Native_Element_setAttribute_Callback(mthis, name, value) native "Element_setAttribute_Callback";
+Native_Element_setAttribute_Callback(mthis, name, value) native "Element_setAttribute_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_setAttributeNS_Callback(mthis, namespaceURI, qualifiedName, value) native "Element_setAttributeNS_Callback";
+Native_Element_setAttributeNS_Callback(mthis, namespaceURI, qualifiedName, value) native "Element_setAttributeNS_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_Element_webkitRequestFullscreen_Callback(mthis) native "Element_webkitRequestFullscreen_Callback";
+Native_Element_webkitRequestFullscreen_Callback(mthis) native "Element_webkitRequestFullscreen_Callback_RESOLVER_STRING_0_";
 
-Native_Element_webkitRequestPointerLock_Callback(mthis) native "Element_webkitRequestPointerLock_Callback";
+Native_Element_webkitRequestPointerLock_Callback(mthis) native "Element_webkitRequestPointerLock_Callback_RESOLVER_STRING_0_";
 
 Native_Element_nextElementSibling_Getter(mthis) native "Element_nextElementSibling_Getter";
 
 Native_Element_previousElementSibling_Getter(mthis) native "Element_previousElementSibling_Getter";
 
-Native_Element_remove_Callback(mthis) native "Element_remove_Callback";
+Native_Element_remove_Callback(mthis) native "Element_remove_Callback_RESOLVER_STRING_0_";
 
 Native_Element_childElementCount_Getter(mthis) native "Element_childElementCount_Getter";
 
@@ -1997,7 +1969,7 @@
     return Native_EventSource__create_1constructorCallback(url, eventSourceInit);
   }
 
-Native_EventSource__create_1constructorCallback(url, eventSourceInit) native "EventSource__create_1constructorCallback";
+Native_EventSource__create_1constructorCallback(url, eventSourceInit) native "EventSource_constructorCallback_RESOLVER_STRING_2_DOMString_Dictionary";
 
 Native_EventSource_readyState_Getter(mthis) native "EventSource_readyState_Getter";
 
@@ -2005,13 +1977,7 @@
 
 Native_EventSource_withCredentials_Getter(mthis) native "EventSource_withCredentials_Getter";
 
-Native_EventSource_close_Callback(mthis) native "EventSource_close_Callback";
-
-Native_EventSource_addEventListener_Callback(mthis, type, listener, useCapture) native "EventSource_addEventListener_Callback";
-
-Native_EventSource_dispatchEvent_Callback(mthis, event) native "EventSource_dispatchEvent_Callback";
-
-Native_EventSource_removeEventListener_Callback(mthis, type, listener, useCapture) native "EventSource_removeEventListener_Callback";
+Native_EventSource_close_Callback(mthis) native "EventSource_close_Callback_RESOLVER_STRING_0_";
 
 Native_File_lastModified_Getter(mthis) native "File_lastModified_Getter";
 
@@ -2021,24 +1987,24 @@
 
 Native_File_webkitRelativePath_Getter(mthis) native "File_webkitRelativePath_Getter";
 
-Native_FileEntry_createWriter_Callback(mthis, successCallback, errorCallback) native "FileEntry_createWriter_Callback";
+Native_FileEntry_createWriter_Callback(mthis, successCallback, errorCallback) native "FileEntry_createWriter_Callback_RESOLVER_STRING_2_FileWriterCallback_ErrorCallback";
 
-Native_FileEntry_file_Callback(mthis, successCallback, errorCallback) native "FileEntry_file_Callback";
+Native_FileEntry_file_Callback(mthis, successCallback, errorCallback) native "FileEntry_file_Callback_RESOLVER_STRING_2_FileCallback_ErrorCallback";
 
 Native_FileError_code_Getter(mthis) native "FileError_code_Getter";
 
 Native_FileList_length_Getter(mthis) native "FileList_length_Getter";
 
-Native_FileList_NativeIndexed_Getter(mthis, index) native "FileList_item_Callback";
+Native_FileList_NativeIndexed_Getter(mthis, index) native "FileList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_FileList_item_Callback(mthis, index) native "FileList_item_Callback";
+Native_FileList_item_Callback(mthis, index) native "FileList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
   // Generated overload resolver
 Native_FileReader_FileReader() {
     return Native_FileReader__create_1constructorCallback();
   }
 
-Native_FileReader__create_1constructorCallback() native "FileReader__create_1constructorCallback";
+Native_FileReader__create_1constructorCallback() native "FileReader_constructorCallback_RESOLVER_STRING_0_";
 
 Native_FileReader_error_Getter(mthis) native "FileReader_error_Getter";
 
@@ -2046,11 +2012,11 @@
 
 Native_FileReader_result_Getter(mthis) native "FileReader_result_Getter";
 
-Native_FileReader_abort_Callback(mthis) native "FileReader_abort_Callback";
+Native_FileReader_abort_Callback(mthis) native "FileReader_abort_Callback_RESOLVER_STRING_0_";
 
-Native_FileReader_readAsArrayBuffer_Callback(mthis, blob) native "FileReader_readAsArrayBuffer_Callback";
+Native_FileReader_readAsArrayBuffer_Callback(mthis, blob) native "FileReader_readAsArrayBuffer_Callback_RESOLVER_STRING_1_Blob";
 
-Native_FileReader_readAsDataURL_Callback(mthis, blob) native "FileReader_readAsDataURL_Callback";
+Native_FileReader_readAsDataURL_Callback(mthis, blob) native "FileReader_readAsDataURL_Callback_RESOLVER_STRING_1_Blob";
 
   // Generated overload resolver
 Native_FileReader_readAsText(mthis, blob, encoding) {
@@ -2062,22 +2028,16 @@
     return;
   }
 
-Native_FileReader__readAsText_1_Callback(mthis, blob, encoding) native "FileReader__readAsText_1_Callback";
+Native_FileReader__readAsText_1_Callback(mthis, blob, encoding) native "FileReader_readAsText_Callback_RESOLVER_STRING_2_Blob_DOMString";
 
-Native_FileReader__readAsText_2_Callback(mthis, blob) native "FileReader__readAsText_2_Callback";
-
-Native_FileReader_addEventListener_Callback(mthis, type, listener, useCapture) native "FileReader_addEventListener_Callback";
-
-Native_FileReader_dispatchEvent_Callback(mthis, event) native "FileReader_dispatchEvent_Callback";
-
-Native_FileReader_removeEventListener_Callback(mthis, type, listener, useCapture) native "FileReader_removeEventListener_Callback";
+Native_FileReader__readAsText_2_Callback(mthis, blob) native "FileReader_readAsText_Callback_RESOLVER_STRING_1_Blob";
 
   // Generated overload resolver
 Native_FileReaderSync__FileReaderSync() {
     return Native_FileReaderSync__create_1constructorCallback();
   }
 
-Native_FileReaderSync__create_1constructorCallback() native "FileReaderSync__create_1constructorCallback";
+Native_FileReaderSync__create_1constructorCallback() native "FileReaderSync_constructorCallback_RESOLVER_STRING_0_";
 
 Native_FileWriter_error_Getter(mthis) native "FileWriter_error_Getter";
 
@@ -2087,19 +2047,13 @@
 
 Native_FileWriter_readyState_Getter(mthis) native "FileWriter_readyState_Getter";
 
-Native_FileWriter_abort_Callback(mthis) native "FileWriter_abort_Callback";
+Native_FileWriter_abort_Callback(mthis) native "FileWriter_abort_Callback_RESOLVER_STRING_0_";
 
-Native_FileWriter_seek_Callback(mthis, position) native "FileWriter_seek_Callback";
+Native_FileWriter_seek_Callback(mthis, position) native "FileWriter_seek_Callback_RESOLVER_STRING_1_long long";
 
-Native_FileWriter_truncate_Callback(mthis, size) native "FileWriter_truncate_Callback";
+Native_FileWriter_truncate_Callback(mthis, size) native "FileWriter_truncate_Callback_RESOLVER_STRING_1_long long";
 
-Native_FileWriter_write_Callback(mthis, data) native "FileWriter_write_Callback";
-
-Native_FileWriter_addEventListener_Callback(mthis, type, listener, useCapture) native "FileWriter_addEventListener_Callback";
-
-Native_FileWriter_dispatchEvent_Callback(mthis, event) native "FileWriter_dispatchEvent_Callback";
-
-Native_FileWriter_removeEventListener_Callback(mthis, type, listener, useCapture) native "FileWriter_removeEventListener_Callback";
+Native_FileWriter_write_Callback(mthis, data) native "FileWriter_write_Callback_RESOLVER_STRING_1_Blob";
 
 Native_FocusEvent_relatedTarget_Getter(mthis) native "FocusEvent_relatedTarget_Getter";
 
@@ -2108,7 +2062,7 @@
     return Native_FontFace__create_1constructorCallback(family, source, descriptors);
   }
 
-Native_FontFace__create_1constructorCallback(family, source, descriptors) native "FontFace__create_1constructorCallback";
+Native_FontFace__create_1constructorCallback(family, source, descriptors) native "FontFace_constructorCallback_RESOLVER_STRING_3_DOMString_DOMString_Dictionary";
 
 Native_FontFace_family_Getter(mthis) native "FontFace_family_Getter";
 
@@ -2140,19 +2094,19 @@
 
 Native_FontFace_weight_Setter(mthis, value) native "FontFace_weight_Setter";
 
-Native_FontFace_load_Callback(mthis) native "FontFace_load_Callback";
+Native_FontFace_load_Callback(mthis) native "FontFace_load_Callback_RESOLVER_STRING_0_";
 
 Native_FontFaceSet_size_Getter(mthis) native "FontFaceSet_size_Getter";
 
 Native_FontFaceSet_status_Getter(mthis) native "FontFaceSet_status_Getter";
 
-Native_FontFaceSet_add_Callback(mthis, fontFace) native "FontFaceSet_add_Callback";
+Native_FontFaceSet_add_Callback(mthis, fontFace) native "FontFaceSet_add_Callback_RESOLVER_STRING_1_FontFace";
 
-Native_FontFaceSet_check_Callback(mthis, font, text) native "FontFaceSet_check_Callback";
+Native_FontFaceSet_check_Callback(mthis, font, text) native "FontFaceSet_check_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_FontFaceSet_clear_Callback(mthis) native "FontFaceSet_clear_Callback";
+Native_FontFaceSet_clear_Callback(mthis) native "FontFaceSet_clear_Callback_RESOLVER_STRING_0_";
 
-Native_FontFaceSet_delete_Callback(mthis, fontFace) native "FontFaceSet_delete_Callback";
+Native_FontFaceSet_delete_Callback(mthis, fontFace) native "FontFaceSet_delete_Callback_RESOLVER_STRING_1_FontFace";
 
   // Generated overload resolver
 Native_FontFaceSet_forEach(mthis, callback, thisArg) {
@@ -2164,23 +2118,17 @@
     return;
   }
 
-Native_FontFaceSet__forEach_1_Callback(mthis, callback, thisArg) native "FontFaceSet__forEach_1_Callback";
+Native_FontFaceSet__forEach_1_Callback(mthis, callback, thisArg) native "FontFaceSet_forEach_Callback_RESOLVER_STRING_2_FontFaceSetForEachCallback_any";
 
-Native_FontFaceSet__forEach_2_Callback(mthis, callback) native "FontFaceSet__forEach_2_Callback";
+Native_FontFaceSet__forEach_2_Callback(mthis, callback) native "FontFaceSet_forEach_Callback_RESOLVER_STRING_1_FontFaceSetForEachCallback";
 
-Native_FontFaceSet_has_Callback(mthis, fontFace) native "FontFaceSet_has_Callback";
+Native_FontFaceSet_has_Callback(mthis, fontFace) native "FontFaceSet_has_Callback_RESOLVER_STRING_1_FontFace";
 
-Native_FontFaceSet_addEventListener_Callback(mthis, type, listener, useCapture) native "FontFaceSet_addEventListener_Callback";
-
-Native_FontFaceSet_dispatchEvent_Callback(mthis, event) native "FontFaceSet_dispatchEvent_Callback";
-
-Native_FontFaceSet_removeEventListener_Callback(mthis, type, listener, useCapture) native "FontFaceSet_removeEventListener_Callback";
-
-Native_FormData_constructorCallback(form) native "FormData_constructorCallback";
+Native_FormData_constructorCallback(form) native "FormData_constructorCallback_RESOLVER_STRING_1_HTMLFormElement";
 
 Native_FormData_append_Callback(mthis, name, value) native "FormData_append_Callback";
 
-Native_FormData_appendBlob_Callback(mthis, name, value, filename) native "FormData_appendBlob_Callback";
+Native_FormData_appendBlob_Callback(mthis, name, value, filename) native "FormData_append_Callback";
 
 Native_GainNode_gain_Getter(mthis) native "GainNode_gain_Getter";
 
@@ -2196,11 +2144,11 @@
 
 Native_GamepadList_length_Getter(mthis) native "GamepadList_length_Getter";
 
-Native_GamepadList_NativeIndexed_Getter(mthis, index) native "GamepadList_item_Callback";
+Native_GamepadList_NativeIndexed_Getter(mthis, index) native "GamepadList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_GamepadList_item_Callback(mthis, index) native "GamepadList_item_Callback";
+Native_GamepadList_item_Callback(mthis, index) native "GamepadList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Geolocation_clearWatch_Callback(mthis, watchID) native "Geolocation_clearWatch_Callback";
+Native_Geolocation_clearWatch_Callback(mthis, watchID) native "Geolocation_clearWatch_Callback_RESOLVER_STRING_1_long";
 
 Native_Geolocation_getCurrentPosition_Callback(mthis, successCallback, errorCallback, options) native "Geolocation_getCurrentPosition_Callback";
 
@@ -2256,7 +2204,7 @@
 
 Native_HTMLElement_webkitdropzone_Setter(mthis, value) native "HTMLElement_webkitdropzone_Setter";
 
-Native_HTMLElement_click_Callback(mthis) native "HTMLElement_click_Callback";
+Native_HTMLElement_click_Callback(mthis) native "HTMLElement_click_Callback_RESOLVER_STRING_0_";
 
 Native_URLUtils_hash_Getter(mthis) native "URLUtils_hash_Getter";
 
@@ -2300,7 +2248,7 @@
 
 Native_URLUtils_username_Setter(mthis, value) native "URLUtils_username_Setter";
 
-Native_URLUtils_toString_Callback(mthis) native "URLUtils_toString_Callback";
+Native_URLUtils_toString_Callback(mthis) native "URLUtils_toString_Callback_RESOLVER_STRING_0_";
 
 Native_HTMLAnchorElement_download_Getter(mthis) native "HTMLAnchorElement_download_Getter";
 
@@ -2364,7 +2312,7 @@
 
 Native_HTMLAnchorElement_username_Setter(mthis, value) native "HTMLAnchorElement_username_Setter";
 
-Native_HTMLAnchorElement_toString_Callback(mthis) native "HTMLAnchorElement_toString_Callback";
+Native_HTMLAnchorElement_toString_Callback(mthis) native "HTMLAnchorElement_toString_Callback_RESOLVER_STRING_0_";
 
 Native_HTMLAreaElement_alt_Getter(mthis) native "HTMLAreaElement_alt_Getter";
 
@@ -2424,7 +2372,7 @@
 
 Native_HTMLAreaElement_username_Setter(mthis, value) native "HTMLAreaElement_username_Setter";
 
-Native_HTMLAreaElement_toString_Callback(mthis) native "HTMLAreaElement_toString_Callback";
+Native_HTMLAreaElement_toString_Callback(mthis) native "HTMLAreaElement_toString_Callback_RESOLVER_STRING_0_";
 
 Native_HTMLMediaElement_autoplay_Getter(mthis) native "HTMLMediaElement_autoplay_Getter";
 
@@ -2523,21 +2471,21 @@
     return Native_HTMLMediaElement__addTextTrack_3_Callback(mthis, kind);
   }
 
-Native_HTMLMediaElement__addTextTrack_1_Callback(mthis, kind, label, language) native "HTMLMediaElement__addTextTrack_1_Callback";
+Native_HTMLMediaElement__addTextTrack_1_Callback(mthis, kind, label, language) native "HTMLMediaElement_addTextTrack_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_HTMLMediaElement__addTextTrack_2_Callback(mthis, kind, label) native "HTMLMediaElement__addTextTrack_2_Callback";
+Native_HTMLMediaElement__addTextTrack_2_Callback(mthis, kind, label) native "HTMLMediaElement_addTextTrack_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_HTMLMediaElement__addTextTrack_3_Callback(mthis, kind) native "HTMLMediaElement__addTextTrack_3_Callback";
+Native_HTMLMediaElement__addTextTrack_3_Callback(mthis, kind) native "HTMLMediaElement_addTextTrack_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_HTMLMediaElement_canPlayType_Callback(mthis, type, keySystem) native "HTMLMediaElement_canPlayType_Callback";
+Native_HTMLMediaElement_canPlayType_Callback(mthis, type, keySystem) native "HTMLMediaElement_canPlayType_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_HTMLMediaElement_load_Callback(mthis) native "HTMLMediaElement_load_Callback";
+Native_HTMLMediaElement_load_Callback(mthis) native "HTMLMediaElement_load_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLMediaElement_pause_Callback(mthis) native "HTMLMediaElement_pause_Callback";
+Native_HTMLMediaElement_pause_Callback(mthis) native "HTMLMediaElement_pause_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLMediaElement_play_Callback(mthis) native "HTMLMediaElement_play_Callback";
+Native_HTMLMediaElement_play_Callback(mthis) native "HTMLMediaElement_play_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLMediaElement_setMediaKeys_Callback(mthis, mediaKeys) native "HTMLMediaElement_setMediaKeys_Callback";
+Native_HTMLMediaElement_setMediaKeys_Callback(mthis, mediaKeys) native "HTMLMediaElement_setMediaKeys_Callback_RESOLVER_STRING_1_MediaKeys";
 
   // Generated overload resolver
 Native_HTMLMediaElement_addKey(mthis, keySystem, key, initData, sessionId) {
@@ -2549,11 +2497,11 @@
     return;
   }
 
-Native_HTMLMediaElement__webkitAddKey_1_Callback(mthis, keySystem, key, initData, sessionId) native "HTMLMediaElement__webkitAddKey_1_Callback";
+Native_HTMLMediaElement__webkitAddKey_1_Callback(mthis, keySystem, key, initData, sessionId) native "HTMLMediaElement_webkitAddKey_Callback_RESOLVER_STRING_4_DOMString_Uint8Array_Uint8Array_DOMString";
 
-Native_HTMLMediaElement__webkitAddKey_2_Callback(mthis, keySystem, key) native "HTMLMediaElement__webkitAddKey_2_Callback";
+Native_HTMLMediaElement__webkitAddKey_2_Callback(mthis, keySystem, key) native "HTMLMediaElement_webkitAddKey_Callback_RESOLVER_STRING_2_DOMString_Uint8Array";
 
-Native_HTMLMediaElement_webkitCancelKeyRequest_Callback(mthis, keySystem, sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
+Native_HTMLMediaElement_webkitCancelKeyRequest_Callback(mthis, keySystem, sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
   // Generated overload resolver
 Native_HTMLMediaElement_generateKeyRequest(mthis, keySystem, initData) {
@@ -2565,16 +2513,16 @@
     return;
   }
 
-Native_HTMLMediaElement__webkitGenerateKeyRequest_1_Callback(mthis, keySystem, initData) native "HTMLMediaElement__webkitGenerateKeyRequest_1_Callback";
+Native_HTMLMediaElement__webkitGenerateKeyRequest_1_Callback(mthis, keySystem, initData) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback_RESOLVER_STRING_2_DOMString_Uint8Array";
 
-Native_HTMLMediaElement__webkitGenerateKeyRequest_2_Callback(mthis, keySystem) native "HTMLMediaElement__webkitGenerateKeyRequest_2_Callback";
+Native_HTMLMediaElement__webkitGenerateKeyRequest_2_Callback(mthis, keySystem) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
 Native_HTMLAudioElement_AudioElement(src) {
     return Native_HTMLAudioElement__create_1constructorCallback(src);
   }
 
-Native_HTMLAudioElement__create_1constructorCallback(src) native "HTMLAudioElement__create_1constructorCallback";
+Native_HTMLAudioElement__create_1constructorCallback(src) native "HTMLAudioElement_constructorCallback_RESOLVER_STRING_1_DOMString";
 
 Native_HTMLBaseElement_href_Getter(mthis) native "HTMLBaseElement_href_Getter";
 
@@ -2634,9 +2582,9 @@
 
 Native_HTMLButtonElement_willValidate_Getter(mthis) native "HTMLButtonElement_willValidate_Getter";
 
-Native_HTMLButtonElement_checkValidity_Callback(mthis) native "HTMLButtonElement_checkValidity_Callback";
+Native_HTMLButtonElement_checkValidity_Callback(mthis) native "HTMLButtonElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLButtonElement_setCustomValidity_Callback(mthis, error) native "HTMLButtonElement_setCustomValidity_Callback";
+Native_HTMLButtonElement_setCustomValidity_Callback(mthis, error) native "HTMLButtonElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_HTMLCanvasElement_height_Getter(mthis) native "HTMLCanvasElement_height_Getter";
 
@@ -2652,11 +2600,11 @@
 
 Native_HTMLCollection_length_Getter(mthis) native "HTMLCollection_length_Getter";
 
-Native_HTMLCollection_NativeIndexed_Getter(mthis, index) native "HTMLCollection_item_Callback";
+Native_HTMLCollection_NativeIndexed_Getter(mthis, index) native "HTMLCollection_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_HTMLCollection_item_Callback(mthis, index) native "HTMLCollection_item_Callback";
+Native_HTMLCollection_item_Callback(mthis, index) native "HTMLCollection_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_HTMLCollection_namedItem_Callback(mthis, name) native "HTMLCollection_namedItem_Callback";
+Native_HTMLCollection_namedItem_Callback(mthis, name) native "HTMLCollection_namedItem_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_HTMLContentElement_resetStyleInheritance_Getter(mthis) native "HTMLContentElement_resetStyleInheritance_Getter";
 
@@ -2666,7 +2614,7 @@
 
 Native_HTMLContentElement_select_Setter(mthis, value) native "HTMLContentElement_select_Setter";
 
-Native_HTMLContentElement_getDistributedNodes_Callback(mthis) native "HTMLContentElement_getDistributedNodes_Callback";
+Native_HTMLContentElement_getDistributedNodes_Callback(mthis) native "HTMLContentElement_getDistributedNodes_Callback_RESOLVER_STRING_0_";
 
 Native_HTMLDataListElement_options_Getter(mthis) native "HTMLDataListElement_options_Getter";
 
@@ -2682,11 +2630,11 @@
 
 Native_HTMLDialogElement_returnValue_Setter(mthis, value) native "HTMLDialogElement_returnValue_Setter";
 
-Native_HTMLDialogElement_close_Callback(mthis, returnValue) native "HTMLDialogElement_close_Callback";
+Native_HTMLDialogElement_close_Callback(mthis, returnValue) native "HTMLDialogElement_close_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_HTMLDialogElement_show_Callback(mthis) native "HTMLDialogElement_show_Callback";
+Native_HTMLDialogElement_show_Callback(mthis) native "HTMLDialogElement_show_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLDialogElement_showModal_Callback(mthis) native "HTMLDialogElement_showModal_Callback";
+Native_HTMLDialogElement_showModal_Callback(mthis) native "HTMLDialogElement_showModal_Callback_RESOLVER_STRING_0_";
 
 Native_HTMLEmbedElement_height_Getter(mthis) native "HTMLEmbedElement_height_Getter";
 
@@ -2732,9 +2680,9 @@
 
 Native_HTMLFieldSetElement_willValidate_Getter(mthis) native "HTMLFieldSetElement_willValidate_Getter";
 
-Native_HTMLFieldSetElement_checkValidity_Callback(mthis) native "HTMLFieldSetElement_checkValidity_Callback";
+Native_HTMLFieldSetElement_checkValidity_Callback(mthis) native "HTMLFieldSetElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLFieldSetElement_setCustomValidity_Callback(mthis, error) native "HTMLFieldSetElement_setCustomValidity_Callback";
+Native_HTMLFieldSetElement_setCustomValidity_Callback(mthis, error) native "HTMLFieldSetElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_HTMLFormElement_acceptCharset_Getter(mthis) native "HTMLFormElement_acceptCharset_Getter";
 
@@ -2774,15 +2722,15 @@
 
 Native_HTMLFormElement_target_Setter(mthis, value) native "HTMLFormElement_target_Setter";
 
-Native_HTMLFormElement___getter___Callback(mthis, index) native "HTMLFormElement___getter___Callback";
+Native_HTMLFormElement___getter___Callback(mthis, index) native "HTMLFormElement___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_HTMLFormElement_checkValidity_Callback(mthis) native "HTMLFormElement_checkValidity_Callback";
+Native_HTMLFormElement_checkValidity_Callback(mthis) native "HTMLFormElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLFormElement_requestAutocomplete_Callback(mthis) native "HTMLFormElement_requestAutocomplete_Callback";
+Native_HTMLFormElement_requestAutocomplete_Callback(mthis) native "HTMLFormElement_requestAutocomplete_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLFormElement_reset_Callback(mthis) native "HTMLFormElement_reset_Callback";
+Native_HTMLFormElement_reset_Callback(mthis) native "HTMLFormElement_reset_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLFormElement_submit_Callback(mthis) native "HTMLFormElement_submit_Callback";
+Native_HTMLFormElement_submit_Callback(mthis) native "HTMLFormElement_submit_Callback_RESOLVER_STRING_0_";
 
 Native_HTMLHRElement_color_Getter(mthis) native "HTMLHRElement_color_Getter";
 
@@ -3034,11 +2982,11 @@
 
 Native_HTMLInputElement_willValidate_Getter(mthis) native "HTMLInputElement_willValidate_Getter";
 
-Native_HTMLInputElement_checkValidity_Callback(mthis) native "HTMLInputElement_checkValidity_Callback";
+Native_HTMLInputElement_checkValidity_Callback(mthis) native "HTMLInputElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLInputElement_select_Callback(mthis) native "HTMLInputElement_select_Callback";
+Native_HTMLInputElement_select_Callback(mthis) native "HTMLInputElement_select_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLInputElement_setCustomValidity_Callback(mthis, error) native "HTMLInputElement_setCustomValidity_Callback";
+Native_HTMLInputElement_setCustomValidity_Callback(mthis, error) native "HTMLInputElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
 Native_HTMLInputElement_setRangeText(mthis, replacement, start, end, selectionMode) {
@@ -3053,9 +3001,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_HTMLInputElement__setRangeText_1_Callback(mthis, replacement) native "HTMLInputElement__setRangeText_1_Callback";
+Native_HTMLInputElement__setRangeText_1_Callback(mthis, replacement) native "HTMLInputElement_setRangeText_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_HTMLInputElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLInputElement__setRangeText_2_Callback";
+Native_HTMLInputElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLInputElement_setRangeText_Callback_RESOLVER_STRING_4_DOMString_unsigned long_unsigned long_DOMString";
 
   // Generated overload resolver
 Native_HTMLInputElement_setSelectionRange(mthis, start, end, direction) {
@@ -3067,9 +3015,9 @@
     return;
   }
 
-Native_HTMLInputElement__setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLInputElement__setSelectionRange_1_Callback";
+Native_HTMLInputElement__setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLInputElement_setSelectionRange_Callback_RESOLVER_STRING_3_long_long_DOMString";
 
-Native_HTMLInputElement__setSelectionRange_2_Callback(mthis, start, end) native "HTMLInputElement__setSelectionRange_2_Callback";
+Native_HTMLInputElement__setSelectionRange_2_Callback(mthis, start, end) native "HTMLInputElement_setSelectionRange_Callback_RESOLVER_STRING_2_long_long";
 
   // Generated overload resolver
 Native_HTMLInputElement_stepDown(mthis, n) {
@@ -3081,9 +3029,9 @@
     return;
   }
 
-Native_HTMLInputElement__stepDown_1_Callback(mthis, n) native "HTMLInputElement__stepDown_1_Callback";
+Native_HTMLInputElement__stepDown_1_Callback(mthis, n) native "HTMLInputElement_stepDown_Callback_RESOLVER_STRING_1_long";
 
-Native_HTMLInputElement__stepDown_2_Callback(mthis) native "HTMLInputElement__stepDown_2_Callback";
+Native_HTMLInputElement__stepDown_2_Callback(mthis) native "HTMLInputElement_stepDown_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_HTMLInputElement_stepUp(mthis, n) {
@@ -3095,9 +3043,9 @@
     return;
   }
 
-Native_HTMLInputElement__stepUp_1_Callback(mthis, n) native "HTMLInputElement__stepUp_1_Callback";
+Native_HTMLInputElement__stepUp_1_Callback(mthis, n) native "HTMLInputElement_stepUp_Callback_RESOLVER_STRING_1_long";
 
-Native_HTMLInputElement__stepUp_2_Callback(mthis) native "HTMLInputElement__stepUp_2_Callback";
+Native_HTMLInputElement__stepUp_2_Callback(mthis) native "HTMLInputElement_stepUp_Callback_RESOLVER_STRING_0_";
 
 Native_HTMLKeygenElement_autofocus_Getter(mthis) native "HTMLKeygenElement_autofocus_Getter";
 
@@ -3131,9 +3079,9 @@
 
 Native_HTMLKeygenElement_willValidate_Getter(mthis) native "HTMLKeygenElement_willValidate_Getter";
 
-Native_HTMLKeygenElement_checkValidity_Callback(mthis) native "HTMLKeygenElement_checkValidity_Callback";
+Native_HTMLKeygenElement_checkValidity_Callback(mthis) native "HTMLKeygenElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLKeygenElement_setCustomValidity_Callback(mthis, error) native "HTMLKeygenElement_setCustomValidity_Callback";
+Native_HTMLKeygenElement_setCustomValidity_Callback(mthis, error) native "HTMLKeygenElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_HTMLLIElement_value_Getter(mthis) native "HTMLLIElement_value_Getter";
 
@@ -3283,9 +3231,9 @@
 
 Native_HTMLObjectElement___setter___Callback(mthis, index_OR_name, value) native "HTMLObjectElement___setter___Callback";
 
-Native_HTMLObjectElement_checkValidity_Callback(mthis) native "HTMLObjectElement_checkValidity_Callback";
+Native_HTMLObjectElement_checkValidity_Callback(mthis) native "HTMLObjectElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLObjectElement_setCustomValidity_Callback(mthis, error) native "HTMLObjectElement_setCustomValidity_Callback";
+Native_HTMLObjectElement_setCustomValidity_Callback(mthis, error) native "HTMLObjectElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_HTMLOptGroupElement_disabled_Getter(mthis) native "HTMLOptGroupElement_disabled_Getter";
 
@@ -3300,7 +3248,7 @@
     return Native_HTMLOptionElement__create_1constructorCallback(data, value, defaultSelected, selected);
   }
 
-Native_HTMLOptionElement__create_1constructorCallback(data, value, defaultSelected, selected) native "HTMLOptionElement__create_1constructorCallback";
+Native_HTMLOptionElement__create_1constructorCallback(data, value, defaultSelected, selected) native "HTMLOptionElement_constructorCallback_RESOLVER_STRING_4_DOMString_DOMString_boolean_boolean";
 
 Native_HTMLOptionElement_defaultSelected_Getter(mthis) native "HTMLOptionElement_defaultSelected_Getter";
 
@@ -3352,9 +3300,9 @@
 
 Native_HTMLOutputElement_willValidate_Getter(mthis) native "HTMLOutputElement_willValidate_Getter";
 
-Native_HTMLOutputElement_checkValidity_Callback(mthis) native "HTMLOutputElement_checkValidity_Callback";
+Native_HTMLOutputElement_checkValidity_Callback(mthis) native "HTMLOutputElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLOutputElement_setCustomValidity_Callback(mthis, error) native "HTMLOutputElement_setCustomValidity_Callback";
+Native_HTMLOutputElement_setCustomValidity_Callback(mthis, error) native "HTMLOutputElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_HTMLParamElement_name_Getter(mthis) native "HTMLParamElement_name_Getter";
 
@@ -3456,21 +3404,21 @@
 
 Native_HTMLSelectElement_willValidate_Getter(mthis) native "HTMLSelectElement_willValidate_Getter";
 
-Native_HTMLSelectElement___setter___Callback(mthis, index, value) native "HTMLSelectElement___setter___Callback";
+Native_HTMLSelectElement___setter___Callback(mthis, index, value) native "HTMLSelectElement___setter___Callback_RESOLVER_STRING_2_unsigned long_HTMLOptionElement";
 
-Native_HTMLSelectElement_checkValidity_Callback(mthis) native "HTMLSelectElement_checkValidity_Callback";
+Native_HTMLSelectElement_checkValidity_Callback(mthis) native "HTMLSelectElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLSelectElement_item_Callback(mthis, index) native "HTMLSelectElement_item_Callback";
+Native_HTMLSelectElement_item_Callback(mthis, index) native "HTMLSelectElement_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_HTMLSelectElement_namedItem_Callback(mthis, name) native "HTMLSelectElement_namedItem_Callback";
+Native_HTMLSelectElement_namedItem_Callback(mthis, name) native "HTMLSelectElement_namedItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_HTMLSelectElement_setCustomValidity_Callback(mthis, error) native "HTMLSelectElement_setCustomValidity_Callback";
+Native_HTMLSelectElement_setCustomValidity_Callback(mthis, error) native "HTMLSelectElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_HTMLShadowElement_resetStyleInheritance_Getter(mthis) native "HTMLShadowElement_resetStyleInheritance_Getter";
 
 Native_HTMLShadowElement_resetStyleInheritance_Setter(mthis, value) native "HTMLShadowElement_resetStyleInheritance_Setter";
 
-Native_HTMLShadowElement_getDistributedNodes_Callback(mthis) native "HTMLShadowElement_getDistributedNodes_Callback";
+Native_HTMLShadowElement_getDistributedNodes_Callback(mthis) native "HTMLShadowElement_getDistributedNodes_Callback_RESOLVER_STRING_0_";
 
 Native_HTMLSourceElement_media_Getter(mthis) native "HTMLSourceElement_media_Getter";
 
@@ -3536,23 +3484,23 @@
 
 Native_HTMLTableElement_tHead_Setter(mthis, value) native "HTMLTableElement_tHead_Setter";
 
-Native_HTMLTableElement_createCaption_Callback(mthis) native "HTMLTableElement_createCaption_Callback";
+Native_HTMLTableElement_createCaption_Callback(mthis) native "HTMLTableElement_createCaption_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_createTBody_Callback(mthis) native "HTMLTableElement_createTBody_Callback";
+Native_HTMLTableElement_createTBody_Callback(mthis) native "HTMLTableElement_createTBody_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_createTFoot_Callback(mthis) native "HTMLTableElement_createTFoot_Callback";
+Native_HTMLTableElement_createTFoot_Callback(mthis) native "HTMLTableElement_createTFoot_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_createTHead_Callback(mthis) native "HTMLTableElement_createTHead_Callback";
+Native_HTMLTableElement_createTHead_Callback(mthis) native "HTMLTableElement_createTHead_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_deleteCaption_Callback(mthis) native "HTMLTableElement_deleteCaption_Callback";
+Native_HTMLTableElement_deleteCaption_Callback(mthis) native "HTMLTableElement_deleteCaption_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_deleteRow_Callback(mthis, index) native "HTMLTableElement_deleteRow_Callback";
+Native_HTMLTableElement_deleteRow_Callback(mthis, index) native "HTMLTableElement_deleteRow_Callback_RESOLVER_STRING_1_long";
 
-Native_HTMLTableElement_deleteTFoot_Callback(mthis) native "HTMLTableElement_deleteTFoot_Callback";
+Native_HTMLTableElement_deleteTFoot_Callback(mthis) native "HTMLTableElement_deleteTFoot_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_deleteTHead_Callback(mthis) native "HTMLTableElement_deleteTHead_Callback";
+Native_HTMLTableElement_deleteTHead_Callback(mthis) native "HTMLTableElement_deleteTHead_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_insertRow_Callback(mthis, index) native "HTMLTableElement_insertRow_Callback";
+Native_HTMLTableElement_insertRow_Callback(mthis, index) native "HTMLTableElement_insertRow_Callback_RESOLVER_STRING_1_long";
 
 Native_HTMLTableRowElement_cells_Getter(mthis) native "HTMLTableRowElement_cells_Getter";
 
@@ -3560,15 +3508,15 @@
 
 Native_HTMLTableRowElement_sectionRowIndex_Getter(mthis) native "HTMLTableRowElement_sectionRowIndex_Getter";
 
-Native_HTMLTableRowElement_deleteCell_Callback(mthis, index) native "HTMLTableRowElement_deleteCell_Callback";
+Native_HTMLTableRowElement_deleteCell_Callback(mthis, index) native "HTMLTableRowElement_deleteCell_Callback_RESOLVER_STRING_1_long";
 
-Native_HTMLTableRowElement_insertCell_Callback(mthis, index) native "HTMLTableRowElement_insertCell_Callback";
+Native_HTMLTableRowElement_insertCell_Callback(mthis, index) native "HTMLTableRowElement_insertCell_Callback_RESOLVER_STRING_1_long";
 
 Native_HTMLTableSectionElement_rows_Getter(mthis) native "HTMLTableSectionElement_rows_Getter";
 
-Native_HTMLTableSectionElement_deleteRow_Callback(mthis, index) native "HTMLTableSectionElement_deleteRow_Callback";
+Native_HTMLTableSectionElement_deleteRow_Callback(mthis, index) native "HTMLTableSectionElement_deleteRow_Callback_RESOLVER_STRING_1_long";
 
-Native_HTMLTableSectionElement_insertRow_Callback(mthis, index) native "HTMLTableSectionElement_insertRow_Callback";
+Native_HTMLTableSectionElement_insertRow_Callback(mthis, index) native "HTMLTableSectionElement_insertRow_Callback_RESOLVER_STRING_1_long";
 
 Native_HTMLTemplateElement_content_Getter(mthis) native "HTMLTemplateElement_content_Getter";
 
@@ -3654,11 +3602,11 @@
 
 Native_HTMLTextAreaElement_wrap_Setter(mthis, value) native "HTMLTextAreaElement_wrap_Setter";
 
-Native_HTMLTextAreaElement_checkValidity_Callback(mthis) native "HTMLTextAreaElement_checkValidity_Callback";
+Native_HTMLTextAreaElement_checkValidity_Callback(mthis) native "HTMLTextAreaElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTextAreaElement_select_Callback(mthis) native "HTMLTextAreaElement_select_Callback";
+Native_HTMLTextAreaElement_select_Callback(mthis) native "HTMLTextAreaElement_select_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTextAreaElement_setCustomValidity_Callback(mthis, error) native "HTMLTextAreaElement_setCustomValidity_Callback";
+Native_HTMLTextAreaElement_setCustomValidity_Callback(mthis, error) native "HTMLTextAreaElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
 Native_HTMLTextAreaElement_setRangeText(mthis, replacement, start, end, selectionMode) {
@@ -3673,9 +3621,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_HTMLTextAreaElement__setRangeText_1_Callback(mthis, replacement) native "HTMLTextAreaElement__setRangeText_1_Callback";
+Native_HTMLTextAreaElement__setRangeText_1_Callback(mthis, replacement) native "HTMLTextAreaElement_setRangeText_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_HTMLTextAreaElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLTextAreaElement__setRangeText_2_Callback";
+Native_HTMLTextAreaElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLTextAreaElement_setRangeText_Callback_RESOLVER_STRING_4_DOMString_unsigned long_unsigned long_DOMString";
 
   // Generated overload resolver
 Native_HTMLTextAreaElement_setSelectionRange(mthis, start, end, direction) {
@@ -3687,9 +3635,9 @@
     return;
   }
 
-Native_HTMLTextAreaElement__setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLTextAreaElement__setSelectionRange_1_Callback";
+Native_HTMLTextAreaElement__setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLTextAreaElement_setSelectionRange_Callback_RESOLVER_STRING_3_long_long_DOMString";
 
-Native_HTMLTextAreaElement__setSelectionRange_2_Callback(mthis, start, end) native "HTMLTextAreaElement__setSelectionRange_2_Callback";
+Native_HTMLTextAreaElement__setSelectionRange_2_Callback(mthis, start, end) native "HTMLTextAreaElement_setSelectionRange_Callback_RESOLVER_STRING_2_long_long";
 
 Native_HTMLTrackElement_default_Getter(mthis) native "HTMLTrackElement_default_Getter";
 
@@ -3735,27 +3683,27 @@
 
 Native_HTMLVideoElement_width_Setter(mthis, value) native "HTMLVideoElement_width_Setter";
 
-Native_HTMLVideoElement_getVideoPlaybackQuality_Callback(mthis) native "HTMLVideoElement_getVideoPlaybackQuality_Callback";
+Native_HTMLVideoElement_getVideoPlaybackQuality_Callback(mthis) native "HTMLVideoElement_getVideoPlaybackQuality_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLVideoElement_webkitEnterFullscreen_Callback(mthis) native "HTMLVideoElement_webkitEnterFullscreen_Callback";
+Native_HTMLVideoElement_webkitEnterFullscreen_Callback(mthis) native "HTMLVideoElement_webkitEnterFullscreen_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLVideoElement_webkitExitFullscreen_Callback(mthis) native "HTMLVideoElement_webkitExitFullscreen_Callback";
+Native_HTMLVideoElement_webkitExitFullscreen_Callback(mthis) native "HTMLVideoElement_webkitExitFullscreen_Callback_RESOLVER_STRING_0_";
 
 Native_HashChangeEvent_newURL_Getter(mthis) native "HashChangeEvent_newURL_Getter";
 
 Native_HashChangeEvent_oldURL_Getter(mthis) native "HashChangeEvent_oldURL_Getter";
 
-Native_HashChangeEvent_initHashChangeEvent_Callback(mthis, type, canBubble, cancelable, oldURL, newURL) native "HashChangeEvent_initHashChangeEvent_Callback";
+Native_HashChangeEvent_initHashChangeEvent_Callback(mthis, type, canBubble, cancelable, oldURL, newURL) native "HashChangeEvent_initHashChangeEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_DOMString_DOMString";
 
 Native_History_length_Getter(mthis) native "History_length_Getter";
 
 Native_History_state_Getter(mthis) native "History_state_Getter";
 
-Native_History_back_Callback(mthis) native "History_back_Callback";
+Native_History_back_Callback(mthis) native "History_back_Callback_RESOLVER_STRING_0_";
 
-Native_History_forward_Callback(mthis) native "History_forward_Callback";
+Native_History_forward_Callback(mthis) native "History_forward_Callback_RESOLVER_STRING_0_";
 
-Native_History_go_Callback(mthis, distance) native "History_go_Callback";
+Native_History_go_Callback(mthis, distance) native "History_go_Callback_RESOLVER_STRING_1_long";
 
 Native_History_pushState_Callback(mthis, data, title, url) native "History_pushState_Callback";
 
@@ -3769,15 +3717,15 @@
 
 Native_IDBCursor_source_Getter(mthis) native "IDBCursor_source_Getter";
 
-Native_IDBCursor_advance_Callback(mthis, count) native "IDBCursor_advance_Callback";
+Native_IDBCursor_advance_Callback(mthis, count) native "IDBCursor_advance_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_IDBCursor_continuePrimaryKey_Callback(mthis, key, primaryKey) native "IDBCursor_continuePrimaryKey_Callback";
+Native_IDBCursor_continuePrimaryKey_Callback(mthis, key, primaryKey) native "IDBCursor_continuePrimaryKey_Callback_RESOLVER_STRING_2_any_any";
 
-Native_IDBCursor_delete_Callback(mthis) native "IDBCursor_delete_Callback";
+Native_IDBCursor_delete_Callback(mthis) native "IDBCursor_delete_Callback_RESOLVER_STRING_0_";
 
-Native_IDBCursor_next_Callback(mthis, key) native "IDBCursor_next_Callback";
+Native_IDBCursor_next_Callback(mthis, key) native "IDBCursor_continue_Callback_RESOLVER_STRING_1_any";
 
-Native_IDBCursor_update_Callback(mthis, value) native "IDBCursor_update_Callback";
+Native_IDBCursor_update_Callback(mthis, value) native "IDBCursor_update_Callback_RESOLVER_STRING_1_any";
 
 Native_IDBCursorWithValue_value_Getter(mthis) native "IDBCursorWithValue_value_Getter";
 
@@ -3787,11 +3735,11 @@
 
 Native_IDBDatabase_version_Getter(mthis) native "IDBDatabase_version_Getter";
 
-Native_IDBDatabase_close_Callback(mthis) native "IDBDatabase_close_Callback";
+Native_IDBDatabase_close_Callback(mthis) native "IDBDatabase_close_Callback_RESOLVER_STRING_0_";
 
-Native_IDBDatabase_createObjectStore_Callback(mthis, name, options) native "IDBDatabase_createObjectStore_Callback";
+Native_IDBDatabase_createObjectStore_Callback(mthis, name, options) native "IDBDatabase_createObjectStore_Callback_RESOLVER_STRING_2_DOMString_Dictionary";
 
-Native_IDBDatabase_deleteObjectStore_Callback(mthis, name) native "IDBDatabase_deleteObjectStore_Callback";
+Native_IDBDatabase_deleteObjectStore_Callback(mthis, name) native "IDBDatabase_deleteObjectStore_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
 Native_IDBDatabase_transaction(mthis, storeName_OR_storeNames, mode) {
@@ -3807,27 +3755,21 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_IDBDatabase__transaction_1_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase__transaction_1_Callback";
+Native_IDBDatabase__transaction_1_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMStringList_DOMString";
 
-Native_IDBDatabase__transaction_2_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase__transaction_2_Callback";
+Native_IDBDatabase__transaction_2_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_sequence<DOMString>_DOMString";
 
-Native_IDBDatabase__transaction_3_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase__transaction_3_Callback";
+Native_IDBDatabase__transaction_3_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_IDBDatabase_transactionList_Callback(mthis, storeNames, mode) native "IDBDatabase_transactionList_Callback";
+Native_IDBDatabase_transactionList_Callback(mthis, storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_sequence<DOMString>_DOMString";
 
-Native_IDBDatabase_transactionStore_Callback(mthis, storeName, mode) native "IDBDatabase_transactionStore_Callback";
+Native_IDBDatabase_transactionStore_Callback(mthis, storeName, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_IDBDatabase_transactionStores_Callback(mthis, storeNames, mode) native "IDBDatabase_transactionStores_Callback";
+Native_IDBDatabase_transactionStores_Callback(mthis, storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMStringList_DOMString";
 
-Native_IDBDatabase_addEventListener_Callback(mthis, type, listener, useCapture) native "IDBDatabase_addEventListener_Callback";
+Native_IDBFactory_cmp_Callback(mthis, first, second) native "IDBFactory_cmp_Callback_RESOLVER_STRING_2_any_any";
 
-Native_IDBDatabase_dispatchEvent_Callback(mthis, event) native "IDBDatabase_dispatchEvent_Callback";
-
-Native_IDBDatabase_removeEventListener_Callback(mthis, type, listener, useCapture) native "IDBDatabase_removeEventListener_Callback";
-
-Native_IDBFactory_cmp_Callback(mthis, first, second) native "IDBFactory_cmp_Callback";
-
-Native_IDBFactory_deleteDatabase_Callback(mthis, name) native "IDBFactory_deleteDatabase_Callback";
+Native_IDBFactory_deleteDatabase_Callback(mthis, name) native "IDBFactory_deleteDatabase_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
 Native_IDBFactory__open(mthis, name, version) {
@@ -3837,11 +3779,11 @@
     return Native_IDBFactory__open_2_Callback(mthis, name);
   }
 
-Native_IDBFactory__open_1_Callback(mthis, name, version) native "IDBFactory__open_1_Callback";
+Native_IDBFactory__open_1_Callback(mthis, name, version) native "IDBFactory_open_Callback_RESOLVER_STRING_2_DOMString_unsigned long long";
 
-Native_IDBFactory__open_2_Callback(mthis, name) native "IDBFactory__open_2_Callback";
+Native_IDBFactory__open_2_Callback(mthis, name) native "IDBFactory_open_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_IDBFactory_webkitGetDatabaseNames_Callback(mthis) native "IDBFactory_webkitGetDatabaseNames_Callback";
+Native_IDBFactory_webkitGetDatabaseNames_Callback(mthis) native "IDBFactory_webkitGetDatabaseNames_Callback_RESOLVER_STRING_0_";
 
 Native_IDBIndex_keyPath_Getter(mthis) native "IDBIndex_keyPath_Getter";
 
@@ -3853,15 +3795,15 @@
 
 Native_IDBIndex_unique_Getter(mthis) native "IDBIndex_unique_Getter";
 
-Native_IDBIndex_count_Callback(mthis, key) native "IDBIndex_count_Callback";
+Native_IDBIndex_count_Callback(mthis, key) native "IDBIndex_count_Callback_RESOLVER_STRING_1_any";
 
-Native_IDBIndex_get_Callback(mthis, key) native "IDBIndex_get_Callback";
+Native_IDBIndex_get_Callback(mthis, key) native "IDBIndex_get_Callback_RESOLVER_STRING_1_any";
 
-Native_IDBIndex_getKey_Callback(mthis, key) native "IDBIndex_getKey_Callback";
+Native_IDBIndex_getKey_Callback(mthis, key) native "IDBIndex_getKey_Callback_RESOLVER_STRING_1_any";
 
-Native_IDBIndex_openCursor_Callback(mthis, key, direction) native "IDBIndex_openCursor_Callback";
+Native_IDBIndex_openCursor_Callback(mthis, key, direction) native "IDBIndex_openCursor_Callback_RESOLVER_STRING_2_any_DOMString";
 
-Native_IDBIndex_openKeyCursor_Callback(mthis, key, direction) native "IDBIndex_openKeyCursor_Callback";
+Native_IDBIndex_openKeyCursor_Callback(mthis, key, direction) native "IDBIndex_openKeyCursor_Callback_RESOLVER_STRING_2_any_DOMString";
 
 Native_IDBKeyRange_lower_Getter(mthis) native "IDBKeyRange_lower_Getter";
 
@@ -3871,13 +3813,13 @@
 
 Native_IDBKeyRange_upperOpen_Getter(mthis) native "IDBKeyRange_upperOpen_Getter";
 
-Native_IDBKeyRange_bound__Callback(lower, upper, lowerOpen, upperOpen) native "IDBKeyRange_bound__Callback";
+Native_IDBKeyRange_bound__Callback(lower, upper, lowerOpen, upperOpen) native "IDBKeyRange_bound_Callback_RESOLVER_STRING_4_any_any_boolean_boolean";
 
-Native_IDBKeyRange_lowerBound__Callback(bound, open) native "IDBKeyRange_lowerBound__Callback";
+Native_IDBKeyRange_lowerBound__Callback(bound, open) native "IDBKeyRange_lowerBound_Callback_RESOLVER_STRING_2_any_boolean";
 
-Native_IDBKeyRange_only__Callback(value) native "IDBKeyRange_only__Callback";
+Native_IDBKeyRange_only__Callback(value) native "IDBKeyRange_only_Callback_RESOLVER_STRING_1_any";
 
-Native_IDBKeyRange_upperBound__Callback(bound, open) native "IDBKeyRange_upperBound__Callback";
+Native_IDBKeyRange_upperBound__Callback(bound, open) native "IDBKeyRange_upperBound_Callback_RESOLVER_STRING_2_any_boolean";
 
 Native_IDBObjectStore_autoIncrement_Getter(mthis) native "IDBObjectStore_autoIncrement_Getter";
 
@@ -3889,11 +3831,11 @@
 
 Native_IDBObjectStore_transaction_Getter(mthis) native "IDBObjectStore_transaction_Getter";
 
-Native_IDBObjectStore_add_Callback(mthis, value, key) native "IDBObjectStore_add_Callback";
+Native_IDBObjectStore_add_Callback(mthis, value, key) native "IDBObjectStore_add_Callback_RESOLVER_STRING_2_any_any";
 
-Native_IDBObjectStore_clear_Callback(mthis) native "IDBObjectStore_clear_Callback";
+Native_IDBObjectStore_clear_Callback(mthis) native "IDBObjectStore_clear_Callback_RESOLVER_STRING_0_";
 
-Native_IDBObjectStore_count_Callback(mthis, key) native "IDBObjectStore_count_Callback";
+Native_IDBObjectStore_count_Callback(mthis, key) native "IDBObjectStore_count_Callback_RESOLVER_STRING_1_any";
 
   // Generated overload resolver
 Native_IDBObjectStore__createIndex(mthis, name, keyPath, options) {
@@ -3906,23 +3848,23 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_IDBObjectStore__createIndex_1_Callback(mthis, name, keyPath, options) native "IDBObjectStore__createIndex_1_Callback";
+Native_IDBObjectStore__createIndex_1_Callback(mthis, name, keyPath, options) native "IDBObjectStore_createIndex_Callback_RESOLVER_STRING_3_DOMString_sequence<DOMString>_Dictionary";
 
-Native_IDBObjectStore__createIndex_2_Callback(mthis, name, keyPath, options) native "IDBObjectStore__createIndex_2_Callback";
+Native_IDBObjectStore__createIndex_2_Callback(mthis, name, keyPath, options) native "IDBObjectStore_createIndex_Callback_RESOLVER_STRING_3_DOMString_DOMString_Dictionary";
 
-Native_IDBObjectStore_delete_Callback(mthis, key) native "IDBObjectStore_delete_Callback";
+Native_IDBObjectStore_delete_Callback(mthis, key) native "IDBObjectStore_delete_Callback_RESOLVER_STRING_1_any";
 
-Native_IDBObjectStore_deleteIndex_Callback(mthis, name) native "IDBObjectStore_deleteIndex_Callback";
+Native_IDBObjectStore_deleteIndex_Callback(mthis, name) native "IDBObjectStore_deleteIndex_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_IDBObjectStore_get_Callback(mthis, key) native "IDBObjectStore_get_Callback";
+Native_IDBObjectStore_get_Callback(mthis, key) native "IDBObjectStore_get_Callback_RESOLVER_STRING_1_any";
 
-Native_IDBObjectStore_index_Callback(mthis, name) native "IDBObjectStore_index_Callback";
+Native_IDBObjectStore_index_Callback(mthis, name) native "IDBObjectStore_index_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_IDBObjectStore_openCursor_Callback(mthis, key, direction) native "IDBObjectStore_openCursor_Callback";
+Native_IDBObjectStore_openCursor_Callback(mthis, key, direction) native "IDBObjectStore_openCursor_Callback_RESOLVER_STRING_2_any_DOMString";
 
-Native_IDBObjectStore_openKeyCursor_Callback(mthis, range, direction) native "IDBObjectStore_openKeyCursor_Callback";
+Native_IDBObjectStore_openKeyCursor_Callback(mthis, range, direction) native "IDBObjectStore_openKeyCursor_Callback_RESOLVER_STRING_2_any_DOMString";
 
-Native_IDBObjectStore_put_Callback(mthis, value, key) native "IDBObjectStore_put_Callback";
+Native_IDBObjectStore_put_Callback(mthis, value, key) native "IDBObjectStore_put_Callback_RESOLVER_STRING_2_any_any";
 
 Native_IDBRequest_error_Getter(mthis) native "IDBRequest_error_Getter";
 
@@ -3934,27 +3876,15 @@
 
 Native_IDBRequest_transaction_Getter(mthis) native "IDBRequest_transaction_Getter";
 
-Native_IDBRequest_addEventListener_Callback(mthis, type, listener, useCapture) native "IDBRequest_addEventListener_Callback";
-
-Native_IDBRequest_dispatchEvent_Callback(mthis, event) native "IDBRequest_dispatchEvent_Callback";
-
-Native_IDBRequest_removeEventListener_Callback(mthis, type, listener, useCapture) native "IDBRequest_removeEventListener_Callback";
-
 Native_IDBTransaction_db_Getter(mthis) native "IDBTransaction_db_Getter";
 
 Native_IDBTransaction_error_Getter(mthis) native "IDBTransaction_error_Getter";
 
 Native_IDBTransaction_mode_Getter(mthis) native "IDBTransaction_mode_Getter";
 
-Native_IDBTransaction_abort_Callback(mthis) native "IDBTransaction_abort_Callback";
+Native_IDBTransaction_abort_Callback(mthis) native "IDBTransaction_abort_Callback_RESOLVER_STRING_0_";
 
-Native_IDBTransaction_objectStore_Callback(mthis, name) native "IDBTransaction_objectStore_Callback";
-
-Native_IDBTransaction_addEventListener_Callback(mthis, type, listener, useCapture) native "IDBTransaction_addEventListener_Callback";
-
-Native_IDBTransaction_dispatchEvent_Callback(mthis, event) native "IDBTransaction_dispatchEvent_Callback";
-
-Native_IDBTransaction_removeEventListener_Callback(mthis, type, listener, useCapture) native "IDBTransaction_removeEventListener_Callback";
+Native_IDBTransaction_objectStore_Callback(mthis, name) native "IDBTransaction_objectStore_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_IDBVersionChangeEvent_dataLoss_Getter(mthis) native "IDBVersionChangeEvent_dataLoss_Getter";
 
@@ -3982,17 +3912,11 @@
 
 Native_InputMethodContext_target_Getter(mthis) native "InputMethodContext_target_Getter";
 
-Native_InputMethodContext_confirmComposition_Callback(mthis) native "InputMethodContext_confirmComposition_Callback";
+Native_InputMethodContext_confirmComposition_Callback(mthis) native "InputMethodContext_confirmComposition_Callback_RESOLVER_STRING_0_";
 
-Native_InputMethodContext_addEventListener_Callback(mthis, type, listener, useCapture) native "InputMethodContext_addEventListener_Callback";
+Native_InstallPhaseEvent_waitUntil_Callback(mthis, value) native "InstallPhaseEvent_waitUntil_Callback_RESOLVER_STRING_1_any";
 
-Native_InputMethodContext_dispatchEvent_Callback(mthis, event) native "InputMethodContext_dispatchEvent_Callback";
-
-Native_InputMethodContext_removeEventListener_Callback(mthis, type, listener, useCapture) native "InputMethodContext_removeEventListener_Callback";
-
-Native_InstallPhaseEvent_waitUntil_Callback(mthis, value) native "InstallPhaseEvent_waitUntil_Callback";
-
-Native_InstallEvent_replace_Callback(mthis) native "InstallEvent_replace_Callback";
+Native_InstallEvent_replace_Callback(mthis) native "InstallEvent_replace_Callback_RESOLVER_STRING_0_";
 
 Native_Key_algorithm_Getter(mthis) native "Key_algorithm_Getter";
 
@@ -4024,9 +3948,9 @@
 
 Native_KeyboardEvent_shiftKey_Getter(mthis) native "KeyboardEvent_shiftKey_Getter";
 
-Native_KeyboardEvent_getModifierState_Callback(mthis, keyArgument) native "KeyboardEvent_getModifierState_Callback";
+Native_KeyboardEvent_getModifierState_Callback(mthis, keyArgument) native "KeyboardEvent_getModifierState_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_KeyboardEvent_initKeyboardEvent_Callback(mthis, type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey, altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback";
+Native_KeyboardEvent_initKeyboardEvent_Callback(mthis, type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey, altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback_RESOLVER_STRING_11_DOMString_boolean_boolean_Window_DOMString_unsigned long_boolean_boolean_boolean_boolean_boolean";
 
 Native_Location_ancestorOrigins_Getter(mthis) native "Location_ancestorOrigins_Getter";
 
@@ -4070,19 +3994,13 @@
 
 Native_Location_replace_Callback(mthis, url) native "Location_replace_Callback";
 
-Native_Location_toString_Callback(mthis) native "Location_toString_Callback";
+Native_Location_toString_Callback(mthis) native "Location_toString_Callback_RESOLVER_STRING_0_";
 
-Native_MIDIAccess_inputs_Callback(mthis) native "MIDIAccess_inputs_Callback";
+Native_MIDIAccess_inputs_Callback(mthis) native "MIDIAccess_inputs_Callback_RESOLVER_STRING_0_";
 
-Native_MIDIAccess_outputs_Callback(mthis) native "MIDIAccess_outputs_Callback";
+Native_MIDIAccess_outputs_Callback(mthis) native "MIDIAccess_outputs_Callback_RESOLVER_STRING_0_";
 
-Native_MIDIAccess_addEventListener_Callback(mthis, type, listener, useCapture) native "MIDIAccess_addEventListener_Callback";
-
-Native_MIDIAccess_dispatchEvent_Callback(mthis, event) native "MIDIAccess_dispatchEvent_Callback";
-
-Native_MIDIAccess_removeEventListener_Callback(mthis, type, listener, useCapture) native "MIDIAccess_removeEventListener_Callback";
-
-Native_MIDIAccessPromise_then_Callback(mthis, successCallback, errorCallback) native "MIDIAccessPromise_then_Callback";
+Native_MIDIAccessPromise_then_Callback(mthis, successCallback, errorCallback) native "MIDIAccessPromise_then_Callback_RESOLVER_STRING_2_MIDISuccessCallback_MIDIErrorCallback";
 
 Native_MIDIConnectionEvent_port_Getter(mthis) native "MIDIConnectionEvent_port_Getter";
 
@@ -4096,12 +4014,6 @@
 
 Native_MIDIPort_version_Getter(mthis) native "MIDIPort_version_Getter";
 
-Native_MIDIPort_addEventListener_Callback(mthis, type, listener, useCapture) native "MIDIPort_addEventListener_Callback";
-
-Native_MIDIPort_dispatchEvent_Callback(mthis, event) native "MIDIPort_dispatchEvent_Callback";
-
-Native_MIDIPort_removeEventListener_Callback(mthis, type, listener, useCapture) native "MIDIPort_removeEventListener_Callback";
-
 Native_MIDIMessageEvent_data_Getter(mthis) native "MIDIMessageEvent_data_Getter";
 
 Native_MIDIMessageEvent_receivedTime_Getter(mthis) native "MIDIMessageEvent_receivedTime_Getter";
@@ -4116,16 +4028,16 @@
     return;
   }
 
-Native_MIDIOutput__send_1_Callback(mthis, data, timestamp) native "MIDIOutput__send_1_Callback";
+Native_MIDIOutput__send_1_Callback(mthis, data, timestamp) native "MIDIOutput_send_Callback_RESOLVER_STRING_2_Uint8Array_double";
 
-Native_MIDIOutput__send_2_Callback(mthis, data) native "MIDIOutput__send_2_Callback";
+Native_MIDIOutput__send_2_Callback(mthis, data) native "MIDIOutput_send_Callback_RESOLVER_STRING_1_Uint8Array";
 
   // Generated overload resolver
 Native_MediaController_MediaController() {
     return Native_MediaController__create_1constructorCallback();
   }
 
-Native_MediaController__create_1constructorCallback() native "MediaController__create_1constructorCallback";
+Native_MediaController__create_1constructorCallback() native "MediaController_constructorCallback_RESOLVER_STRING_0_";
 
 Native_MediaController_buffered_Getter(mthis) native "MediaController_buffered_Getter";
 
@@ -4159,17 +4071,11 @@
 
 Native_MediaController_volume_Setter(mthis, value) native "MediaController_volume_Setter";
 
-Native_MediaController_pause_Callback(mthis) native "MediaController_pause_Callback";
+Native_MediaController_pause_Callback(mthis) native "MediaController_pause_Callback_RESOLVER_STRING_0_";
 
-Native_MediaController_play_Callback(mthis) native "MediaController_play_Callback";
+Native_MediaController_play_Callback(mthis) native "MediaController_play_Callback_RESOLVER_STRING_0_";
 
-Native_MediaController_unpause_Callback(mthis) native "MediaController_unpause_Callback";
-
-Native_MediaController_addEventListener_Callback(mthis, type, listener, useCapture) native "MediaController_addEventListener_Callback";
-
-Native_MediaController_dispatchEvent_Callback(mthis, event) native "MediaController_dispatchEvent_Callback";
-
-Native_MediaController_removeEventListener_Callback(mthis, type, listener, useCapture) native "MediaController_removeEventListener_Callback";
+Native_MediaController_unpause_Callback(mthis) native "MediaController_unpause_Callback_RESOLVER_STRING_0_";
 
 Native_MediaElementAudioSourceNode_mediaElement_Getter(mthis) native "MediaElementAudioSourceNode_mediaElement_Getter";
 
@@ -4207,26 +4113,20 @@
 
 Native_MediaKeySession_sessionId_Getter(mthis) native "MediaKeySession_sessionId_Getter";
 
-Native_MediaKeySession_release_Callback(mthis) native "MediaKeySession_release_Callback";
+Native_MediaKeySession_release_Callback(mthis) native "MediaKeySession_release_Callback_RESOLVER_STRING_0_";
 
-Native_MediaKeySession_update_Callback(mthis, response) native "MediaKeySession_update_Callback";
-
-Native_MediaKeySession_addEventListener_Callback(mthis, type, listener, useCapture) native "MediaKeySession_addEventListener_Callback";
-
-Native_MediaKeySession_dispatchEvent_Callback(mthis, event) native "MediaKeySession_dispatchEvent_Callback";
-
-Native_MediaKeySession_removeEventListener_Callback(mthis, type, listener, useCapture) native "MediaKeySession_removeEventListener_Callback";
+Native_MediaKeySession_update_Callback(mthis, response) native "MediaKeySession_update_Callback_RESOLVER_STRING_1_Uint8Array";
 
   // Generated overload resolver
 Native_MediaKeys_MediaKeys(keySystem) {
     return Native_MediaKeys__create_1constructorCallback(keySystem);
   }
 
-Native_MediaKeys__create_1constructorCallback(keySystem) native "MediaKeys__create_1constructorCallback";
+Native_MediaKeys__create_1constructorCallback(keySystem) native "MediaKeys_constructorCallback_RESOLVER_STRING_1_DOMString";
 
 Native_MediaKeys_keySystem_Getter(mthis) native "MediaKeys_keySystem_Getter";
 
-Native_MediaKeys_createSession_Callback(mthis, type, initData) native "MediaKeys_createSession_Callback";
+Native_MediaKeys_createSession_Callback(mthis, type, initData) native "MediaKeys_createSession_Callback_RESOLVER_STRING_2_DOMString_Uint8Array";
 
 Native_MediaList_length_Getter(mthis) native "MediaList_length_Getter";
 
@@ -4234,11 +4134,11 @@
 
 Native_MediaList_mediaText_Setter(mthis, value) native "MediaList_mediaText_Setter";
 
-Native_MediaList_appendMedium_Callback(mthis, newMedium) native "MediaList_appendMedium_Callback";
+Native_MediaList_appendMedium_Callback(mthis, newMedium) native "MediaList_appendMedium_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaList_deleteMedium_Callback(mthis, oldMedium) native "MediaList_deleteMedium_Callback";
+Native_MediaList_deleteMedium_Callback(mthis, oldMedium) native "MediaList_deleteMedium_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaList_item_Callback(mthis, index) native "MediaList_item_Callback";
+Native_MediaList_item_Callback(mthis, index) native "MediaList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_MediaQueryList_matches_Getter(mthis) native "MediaQueryList_matches_Getter";
 
@@ -4249,7 +4149,7 @@
     return Native_MediaSource__create_1constructorCallback();
   }
 
-Native_MediaSource__create_1constructorCallback() native "MediaSource__create_1constructorCallback";
+Native_MediaSource__create_1constructorCallback() native "MediaSource_constructorCallback_RESOLVER_STRING_0_";
 
 Native_MediaSource_activeSourceBuffers_Getter(mthis) native "MediaSource_activeSourceBuffers_Getter";
 
@@ -4261,7 +4161,7 @@
 
 Native_MediaSource_sourceBuffers_Getter(mthis) native "MediaSource_sourceBuffers_Getter";
 
-Native_MediaSource_addSourceBuffer_Callback(mthis, type) native "MediaSource_addSourceBuffer_Callback";
+Native_MediaSource_addSourceBuffer_Callback(mthis, type) native "MediaSource_addSourceBuffer_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
 Native_MediaSource_endOfStream(mthis, error) {
@@ -4273,19 +4173,13 @@
     return;
   }
 
-Native_MediaSource__endOfStream_1_Callback(mthis, error) native "MediaSource__endOfStream_1_Callback";
+Native_MediaSource__endOfStream_1_Callback(mthis, error) native "MediaSource_endOfStream_Callback_RESOLVER_STRING_1_EndOfStreamError";
 
-Native_MediaSource__endOfStream_2_Callback(mthis) native "MediaSource__endOfStream_2_Callback";
+Native_MediaSource__endOfStream_2_Callback(mthis) native "MediaSource_endOfStream_Callback_RESOLVER_STRING_0_";
 
-Native_MediaSource_isTypeSupported_Callback(type) native "MediaSource_isTypeSupported_Callback";
+Native_MediaSource_isTypeSupported_Callback(type) native "MediaSource_isTypeSupported_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaSource_removeSourceBuffer_Callback(mthis, buffer) native "MediaSource_removeSourceBuffer_Callback";
-
-Native_MediaSource_addEventListener_Callback(mthis, type, listener, useCapture) native "MediaSource_addEventListener_Callback";
-
-Native_MediaSource_dispatchEvent_Callback(mthis, event) native "MediaSource_dispatchEvent_Callback";
-
-Native_MediaSource_removeEventListener_Callback(mthis, type, listener, useCapture) native "MediaSource_removeEventListener_Callback";
+Native_MediaSource_removeSourceBuffer_Callback(mthis, buffer) native "MediaSource_removeSourceBuffer_Callback_RESOLVER_STRING_1_SourceBuffer";
 
   // Generated overload resolver
 Native_MediaStream_MediaStream(stream_OR_tracks) {
@@ -4301,11 +4195,11 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_MediaStream__create_1constructorCallback() native "MediaStream__create_1constructorCallback";
+Native_MediaStream__create_1constructorCallback() native "MediaStream_constructorCallback_RESOLVER_STRING_0_";
 
-Native_MediaStream__create_2constructorCallback(stream_OR_tracks) native "MediaStream__create_2constructorCallback";
+Native_MediaStream__create_2constructorCallback(stream_OR_tracks) native "MediaStream_constructorCallback_RESOLVER_STRING_1_MediaStream";
 
-Native_MediaStream__create_3constructorCallback(stream_OR_tracks) native "MediaStream__create_3constructorCallback";
+Native_MediaStream__create_3constructorCallback(stream_OR_tracks) native "MediaStream_constructorCallback_RESOLVER_STRING_1_MediaStreamTrack[]";
 
 Native_MediaStream_ended_Getter(mthis) native "MediaStream_ended_Getter";
 
@@ -4313,23 +4207,17 @@
 
 Native_MediaStream_label_Getter(mthis) native "MediaStream_label_Getter";
 
-Native_MediaStream_addTrack_Callback(mthis, track) native "MediaStream_addTrack_Callback";
+Native_MediaStream_addTrack_Callback(mthis, track) native "MediaStream_addTrack_Callback_RESOLVER_STRING_1_MediaStreamTrack";
 
-Native_MediaStream_getAudioTracks_Callback(mthis) native "MediaStream_getAudioTracks_Callback";
+Native_MediaStream_getAudioTracks_Callback(mthis) native "MediaStream_getAudioTracks_Callback_RESOLVER_STRING_0_";
 
-Native_MediaStream_getTrackById_Callback(mthis, trackId) native "MediaStream_getTrackById_Callback";
+Native_MediaStream_getTrackById_Callback(mthis, trackId) native "MediaStream_getTrackById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaStream_getVideoTracks_Callback(mthis) native "MediaStream_getVideoTracks_Callback";
+Native_MediaStream_getVideoTracks_Callback(mthis) native "MediaStream_getVideoTracks_Callback_RESOLVER_STRING_0_";
 
-Native_MediaStream_removeTrack_Callback(mthis, track) native "MediaStream_removeTrack_Callback";
+Native_MediaStream_removeTrack_Callback(mthis, track) native "MediaStream_removeTrack_Callback_RESOLVER_STRING_1_MediaStreamTrack";
 
-Native_MediaStream_stop_Callback(mthis) native "MediaStream_stop_Callback";
-
-Native_MediaStream_addEventListener_Callback(mthis, type, listener, useCapture) native "MediaStream_addEventListener_Callback";
-
-Native_MediaStream_dispatchEvent_Callback(mthis, event) native "MediaStream_dispatchEvent_Callback";
-
-Native_MediaStream_removeEventListener_Callback(mthis, type, listener, useCapture) native "MediaStream_removeEventListener_Callback";
+Native_MediaStream_stop_Callback(mthis) native "MediaStream_stop_Callback_RESOLVER_STRING_0_";
 
 Native_MediaStreamAudioDestinationNode_stream_Getter(mthis) native "MediaStreamAudioDestinationNode_stream_Getter";
 
@@ -4349,15 +4237,9 @@
 
 Native_MediaStreamTrack_readyState_Getter(mthis) native "MediaStreamTrack_readyState_Getter";
 
-Native_MediaStreamTrack_getSources_Callback(callback) native "MediaStreamTrack_getSources_Callback";
+Native_MediaStreamTrack_getSources_Callback(callback) native "MediaStreamTrack_getSources_Callback_RESOLVER_STRING_1_MediaStreamTrackSourcesCallback";
 
-Native_MediaStreamTrack_stop_Callback(mthis) native "MediaStreamTrack_stop_Callback";
-
-Native_MediaStreamTrack_addEventListener_Callback(mthis, type, listener, useCapture) native "MediaStreamTrack_addEventListener_Callback";
-
-Native_MediaStreamTrack_dispatchEvent_Callback(mthis, event) native "MediaStreamTrack_dispatchEvent_Callback";
-
-Native_MediaStreamTrack_removeEventListener_Callback(mthis, type, listener, useCapture) native "MediaStreamTrack_removeEventListener_Callback";
+Native_MediaStreamTrack_stop_Callback(mthis) native "MediaStreamTrack_stop_Callback_RESOLVER_STRING_0_";
 
 Native_MediaStreamTrackEvent_track_Getter(mthis) native "MediaStreamTrackEvent_track_Getter";
 
@@ -4381,17 +4263,11 @@
 
 Native_MessageEvent_initMessageEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, messagePorts) native "MessageEvent_initMessageEvent_Callback";
 
-Native_MessagePort_close_Callback(mthis) native "MessagePort_close_Callback";
+Native_MessagePort_close_Callback(mthis) native "MessagePort_close_Callback_RESOLVER_STRING_0_";
 
 Native_MessagePort_postMessage_Callback(mthis, message, messagePorts) native "MessagePort_postMessage_Callback";
 
-Native_MessagePort_start_Callback(mthis) native "MessagePort_start_Callback";
-
-Native_MessagePort_addEventListener_Callback(mthis, type, listener, useCapture) native "MessagePort_addEventListener_Callback";
-
-Native_MessagePort_dispatchEvent_Callback(mthis, event) native "MessagePort_dispatchEvent_Callback";
-
-Native_MessagePort_removeEventListener_Callback(mthis, type, listener, useCapture) native "MessagePort_removeEventListener_Callback";
+Native_MessagePort_start_Callback(mthis) native "MessagePort_start_Callback_RESOLVER_STRING_0_";
 
 Native_Metadata_modificationTime_Getter(mthis) native "Metadata_modificationTime_Getter";
 
@@ -4407,13 +4283,13 @@
 
 Native_MimeTypeArray_length_Getter(mthis) native "MimeTypeArray_length_Getter";
 
-Native_MimeTypeArray_NativeIndexed_Getter(mthis, index) native "MimeTypeArray_item_Callback";
+Native_MimeTypeArray_NativeIndexed_Getter(mthis, index) native "MimeTypeArray_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_MimeTypeArray___getter___Callback(mthis, name) native "MimeTypeArray___getter___Callback";
+Native_MimeTypeArray___getter___Callback(mthis, name) native "MimeTypeArray___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MimeTypeArray_item_Callback(mthis, index) native "MimeTypeArray_item_Callback";
+Native_MimeTypeArray_item_Callback(mthis, index) native "MimeTypeArray_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_MimeTypeArray_namedItem_Callback(mthis, name) native "MimeTypeArray_namedItem_Callback";
+Native_MimeTypeArray_namedItem_Callback(mthis, name) native "MimeTypeArray_namedItem_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_MouseEvent_altKey_Getter(mthis) native "MouseEvent_altKey_Getter";
 
@@ -4449,15 +4325,15 @@
 
 Native_MouseEvent_webkitMovementY_Getter(mthis) native "MouseEvent_webkitMovementY_Getter";
 
-Native_MouseEvent_initMouseEvent_Callback(mthis, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) native "MouseEvent_initMouseEvent_Callback";
+Native_MouseEvent_initMouseEvent_Callback(mthis, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) native "MouseEvent_initMouseEvent_Callback_RESOLVER_STRING_15_DOMString_boolean_boolean_Window_long_long_long_long_long_boolean_boolean_boolean_boolean_unsigned short_EventTarget";
 
 Native_MutationObserver_constructorCallback(callback) native "MutationObserver_constructorCallback";
 
-Native_MutationObserver_disconnect_Callback(mthis) native "MutationObserver_disconnect_Callback";
+Native_MutationObserver_disconnect_Callback(mthis) native "MutationObserver_disconnect_Callback_RESOLVER_STRING_0_";
 
-Native_MutationObserver_observe_Callback(mthis, target, options) native "MutationObserver_observe_Callback";
+Native_MutationObserver_observe_Callback(mthis, target, options) native "MutationObserver_observe_Callback_RESOLVER_STRING_2_Node_Dictionary";
 
-Native_MutationObserver_takeRecords_Callback(mthis) native "MutationObserver_takeRecords_Callback";
+Native_MutationObserver_takeRecords_Callback(mthis) native "MutationObserver_takeRecords_Callback_RESOLVER_STRING_0_";
 
 Native_MutationRecord_addedNodes_Getter(mthis) native "MutationRecord_addedNodes_Getter";
 
@@ -4479,35 +4355,35 @@
 
 Native_NamedNodeMap_length_Getter(mthis) native "NamedNodeMap_length_Getter";
 
-Native_NamedNodeMap_NativeIndexed_Getter(mthis, index) native "NamedNodeMap_item_Callback";
+Native_NamedNodeMap_NativeIndexed_Getter(mthis, index) native "NamedNodeMap_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_NamedNodeMap___getter___Callback(mthis, name) native "NamedNodeMap___getter___Callback";
+Native_NamedNodeMap___getter___Callback(mthis, name) native "NamedNodeMap___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_NamedNodeMap_getNamedItem_Callback(mthis, name) native "NamedNodeMap_getNamedItem_Callback";
+Native_NamedNodeMap_getNamedItem_Callback(mthis, name) native "NamedNodeMap_getNamedItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_NamedNodeMap_getNamedItemNS_Callback(mthis, namespaceURI, localName) native "NamedNodeMap_getNamedItemNS_Callback";
+Native_NamedNodeMap_getNamedItemNS_Callback(mthis, namespaceURI, localName) native "NamedNodeMap_getNamedItemNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_NamedNodeMap_item_Callback(mthis, index) native "NamedNodeMap_item_Callback";
+Native_NamedNodeMap_item_Callback(mthis, index) native "NamedNodeMap_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_NamedNodeMap_removeNamedItem_Callback(mthis, name) native "NamedNodeMap_removeNamedItem_Callback";
+Native_NamedNodeMap_removeNamedItem_Callback(mthis, name) native "NamedNodeMap_removeNamedItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_NamedNodeMap_removeNamedItemNS_Callback(mthis, namespaceURI, localName) native "NamedNodeMap_removeNamedItemNS_Callback";
+Native_NamedNodeMap_removeNamedItemNS_Callback(mthis, namespaceURI, localName) native "NamedNodeMap_removeNamedItemNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_NamedNodeMap_setNamedItem_Callback(mthis, node) native "NamedNodeMap_setNamedItem_Callback";
+Native_NamedNodeMap_setNamedItem_Callback(mthis, node) native "NamedNodeMap_setNamedItem_Callback_RESOLVER_STRING_1_Node";
 
-Native_NamedNodeMap_setNamedItemNS_Callback(mthis, node) native "NamedNodeMap_setNamedItemNS_Callback";
+Native_NamedNodeMap_setNamedItemNS_Callback(mthis, node) native "NamedNodeMap_setNamedItemNS_Callback_RESOLVER_STRING_1_Node";
 
-Native_NavigatorID_appCodeName_Getter(mthis) native "NavigatorID_appCodeName_Getter";
+Native_NavigatorID_appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
 
-Native_NavigatorID_appName_Getter(mthis) native "NavigatorID_appName_Getter";
+Native_NavigatorID_appName_Getter(mthis) native "Navigator_appName_Getter";
 
-Native_NavigatorID_appVersion_Getter(mthis) native "NavigatorID_appVersion_Getter";
+Native_NavigatorID_appVersion_Getter(mthis) native "Navigator_appVersion_Getter";
 
-Native_NavigatorID_platform_Getter(mthis) native "NavigatorID_platform_Getter";
+Native_NavigatorID_platform_Getter(mthis) native "Navigator_platform_Getter";
 
-Native_NavigatorID_product_Getter(mthis) native "NavigatorID_product_Getter";
+Native_NavigatorID_product_Getter(mthis) native "Navigator_product_Getter";
 
-Native_NavigatorID_userAgent_Getter(mthis) native "NavigatorID_userAgent_Getter";
+Native_NavigatorID_userAgent_Getter(mthis) native "Navigator_userAgent_Getter";
 
 Native_NavigatorOnLine_onLine_Getter(mthis) native "NavigatorOnLine_onLine_Getter";
 
@@ -4537,19 +4413,19 @@
 
 Native_Navigator_webkitTemporaryStorage_Getter(mthis) native "Navigator_webkitTemporaryStorage_Getter";
 
-Native_Navigator_getStorageUpdates_Callback(mthis) native "Navigator_getStorageUpdates_Callback";
+Native_Navigator_getStorageUpdates_Callback(mthis) native "Navigator_getStorageUpdates_Callback_RESOLVER_STRING_0_";
 
-Native_Navigator_isProtocolHandlerRegistered_Callback(mthis, scheme, url) native "Navigator_isProtocolHandlerRegistered_Callback";
+Native_Navigator_isProtocolHandlerRegistered_Callback(mthis, scheme, url) native "Navigator_isProtocolHandlerRegistered_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Navigator_registerProtocolHandler_Callback(mthis, scheme, url, title) native "Navigator_registerProtocolHandler_Callback";
+Native_Navigator_registerProtocolHandler_Callback(mthis, scheme, url, title) native "Navigator_registerProtocolHandler_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_Navigator_requestMIDIAccess_Callback(mthis, options) native "Navigator_requestMIDIAccess_Callback";
+Native_Navigator_requestMIDIAccess_Callback(mthis, options) native "Navigator_requestMIDIAccess_Callback_RESOLVER_STRING_1_Dictionary";
 
-Native_Navigator_unregisterProtocolHandler_Callback(mthis, scheme, url) native "Navigator_unregisterProtocolHandler_Callback";
+Native_Navigator_unregisterProtocolHandler_Callback(mthis, scheme, url) native "Navigator_unregisterProtocolHandler_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Navigator_webkitGetGamepads_Callback(mthis) native "Navigator_webkitGetGamepads_Callback";
+Native_Navigator_webkitGetGamepads_Callback(mthis) native "Navigator_webkitGetGamepads_Callback_RESOLVER_STRING_0_";
 
-Native_Navigator_webkitGetUserMedia_Callback(mthis, options, successCallback, errorCallback) native "Navigator_webkitGetUserMedia_Callback";
+Native_Navigator_webkitGetUserMedia_Callback(mthis, options, successCallback, errorCallback) native "Navigator_webkitGetUserMedia_Callback_RESOLVER_STRING_3_Dictionary_NavigatorUserMediaSuccessCallback_NavigatorUserMediaErrorCallback";
 
 Native_Navigator_appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
 
@@ -4579,24 +4455,24 @@
 
 Native_NodeIterator_whatToShow_Getter(mthis) native "NodeIterator_whatToShow_Getter";
 
-Native_NodeIterator_detach_Callback(mthis) native "NodeIterator_detach_Callback";
+Native_NodeIterator_detach_Callback(mthis) native "NodeIterator_detach_Callback_RESOLVER_STRING_0_";
 
-Native_NodeIterator_nextNode_Callback(mthis) native "NodeIterator_nextNode_Callback";
+Native_NodeIterator_nextNode_Callback(mthis) native "NodeIterator_nextNode_Callback_RESOLVER_STRING_0_";
 
-Native_NodeIterator_previousNode_Callback(mthis) native "NodeIterator_previousNode_Callback";
+Native_NodeIterator_previousNode_Callback(mthis) native "NodeIterator_previousNode_Callback_RESOLVER_STRING_0_";
 
 Native_NodeList_length_Getter(mthis) native "NodeList_length_Getter";
 
-Native_NodeList_NativeIndexed_Getter(mthis, index) native "NodeList_item_Callback";
+Native_NodeList_NativeIndexed_Getter(mthis, index) native "NodeList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_NodeList_item_Callback(mthis, index) native "NodeList_item_Callback";
+Native_NodeList_item_Callback(mthis, index) native "NodeList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
   // Generated overload resolver
 Native_Notification_Notification(title, options) {
     return Native_Notification__create_1constructorCallback(title, options);
   }
 
-Native_Notification__create_1constructorCallback(title, options) native "Notification__create_1constructorCallback";
+Native_Notification__create_1constructorCallback(title, options) native "Notification_constructorCallback_RESOLVER_STRING_2_DOMString_Dictionary";
 
 Native_Notification_body_Getter(mthis) native "Notification_body_Getter";
 
@@ -4612,23 +4488,17 @@
 
 Native_Notification_title_Getter(mthis) native "Notification_title_Getter";
 
-Native_Notification_close_Callback(mthis) native "Notification_close_Callback";
+Native_Notification_close_Callback(mthis) native "Notification_close_Callback_RESOLVER_STRING_0_";
 
-Native_Notification_requestPermission_Callback(callback) native "Notification_requestPermission_Callback";
+Native_Notification_requestPermission_Callback(callback) native "Notification_requestPermission_Callback_RESOLVER_STRING_1_NotificationPermissionCallback";
 
-Native_Notification_addEventListener_Callback(mthis, type, listener, useCapture) native "Notification_addEventListener_Callback";
+Native_OESVertexArrayObject_bindVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback_RESOLVER_STRING_1_WebGLVertexArrayObjectOES";
 
-Native_Notification_dispatchEvent_Callback(mthis, event) native "Notification_dispatchEvent_Callback";
+Native_OESVertexArrayObject_createVertexArrayOES_Callback(mthis) native "OESVertexArrayObject_createVertexArrayOES_Callback_RESOLVER_STRING_0_";
 
-Native_Notification_removeEventListener_Callback(mthis, type, listener, useCapture) native "Notification_removeEventListener_Callback";
+Native_OESVertexArrayObject_deleteVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback_RESOLVER_STRING_1_WebGLVertexArrayObjectOES";
 
-Native_OESVertexArrayObject_bindVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback";
-
-Native_OESVertexArrayObject_createVertexArrayOES_Callback(mthis) native "OESVertexArrayObject_createVertexArrayOES_Callback";
-
-Native_OESVertexArrayObject_deleteVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback";
-
-Native_OESVertexArrayObject_isVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback";
+Native_OESVertexArrayObject_isVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback_RESOLVER_STRING_1_WebGLVertexArrayObjectOES";
 
 Native_OfflineAudioCompletionEvent_renderedBuffer_Getter(mthis) native "OfflineAudioCompletionEvent_renderedBuffer_Getter";
 
@@ -4637,7 +4507,7 @@
     return Native_OfflineAudioContext__create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate);
   }
 
-Native_OfflineAudioContext__create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate) native "OfflineAudioContext__create_1constructorCallback";
+Native_OfflineAudioContext__create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate) native "OfflineAudioContext_constructorCallback_RESOLVER_STRING_3_unsigned long_unsigned long_float";
 
 Native_OscillatorNode_detune_Getter(mthis) native "OscillatorNode_detune_Getter";
 
@@ -4649,11 +4519,11 @@
 
 Native_OscillatorNode_type_Setter(mthis, value) native "OscillatorNode_type_Setter";
 
-Native_OscillatorNode_noteOff_Callback(mthis, when) native "OscillatorNode_noteOff_Callback";
+Native_OscillatorNode_noteOff_Callback(mthis, when) native "OscillatorNode_noteOff_Callback_RESOLVER_STRING_1_double";
 
-Native_OscillatorNode_noteOn_Callback(mthis, when) native "OscillatorNode_noteOn_Callback";
+Native_OscillatorNode_noteOn_Callback(mthis, when) native "OscillatorNode_noteOn_Callback_RESOLVER_STRING_1_double";
 
-Native_OscillatorNode_setPeriodicWave_Callback(mthis, periodicWave) native "OscillatorNode_setPeriodicWave_Callback";
+Native_OscillatorNode_setPeriodicWave_Callback(mthis, periodicWave) native "OscillatorNode_setPeriodicWave_Callback_RESOLVER_STRING_1_PeriodicWave";
 
   // Generated overload resolver
 Native_OscillatorNode_start(mthis, when) {
@@ -4665,9 +4535,9 @@
     return;
   }
 
-Native_OscillatorNode__start_1_Callback(mthis, when) native "OscillatorNode__start_1_Callback";
+Native_OscillatorNode__start_1_Callback(mthis, when) native "OscillatorNode_start_Callback_RESOLVER_STRING_1_double";
 
-Native_OscillatorNode__start_2_Callback(mthis) native "OscillatorNode__start_2_Callback";
+Native_OscillatorNode__start_2_Callback(mthis) native "OscillatorNode_start_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_OscillatorNode_stop(mthis, when) {
@@ -4679,9 +4549,9 @@
     return;
   }
 
-Native_OscillatorNode__stop_1_Callback(mthis, when) native "OscillatorNode__stop_1_Callback";
+Native_OscillatorNode__stop_1_Callback(mthis, when) native "OscillatorNode_stop_Callback_RESOLVER_STRING_1_double";
 
-Native_OscillatorNode__stop_2_Callback(mthis) native "OscillatorNode__stop_2_Callback";
+Native_OscillatorNode__stop_2_Callback(mthis) native "OscillatorNode_stop_Callback_RESOLVER_STRING_0_";
 
 Native_OverflowEvent_horizontalOverflow_Getter(mthis) native "OverflowEvent_horizontalOverflow_Getter";
 
@@ -4723,11 +4593,11 @@
 
 Native_PannerNode_rolloffFactor_Setter(mthis, value) native "PannerNode_rolloffFactor_Setter";
 
-Native_PannerNode_setOrientation_Callback(mthis, x, y, z) native "PannerNode_setOrientation_Callback";
+Native_PannerNode_setOrientation_Callback(mthis, x, y, z) native "PannerNode_setOrientation_Callback_RESOLVER_STRING_3_float_float_float";
 
-Native_PannerNode_setPosition_Callback(mthis, x, y, z) native "PannerNode_setPosition_Callback";
+Native_PannerNode_setPosition_Callback(mthis, x, y, z) native "PannerNode_setPosition_Callback_RESOLVER_STRING_3_float_float_float";
 
-Native_PannerNode_setVelocity_Callback(mthis, x, y, z) native "PannerNode_setVelocity_Callback";
+Native_PannerNode_setVelocity_Callback(mthis, x, y, z) native "PannerNode_setVelocity_Callback_RESOLVER_STRING_3_float_float_float";
 
   // Generated overload resolver
 Native_Path_Path(path_OR_text) {
@@ -4743,27 +4613,27 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Path__create_1constructorCallback() native "Path__create_1constructorCallback";
+Native_Path__create_1constructorCallback() native "Path_constructorCallback_RESOLVER_STRING_0_";
 
-Native_Path__create_2constructorCallback(path_OR_text) native "Path__create_2constructorCallback";
+Native_Path__create_2constructorCallback(path_OR_text) native "Path_constructorCallback_RESOLVER_STRING_1_Path";
 
-Native_Path__create_3constructorCallback(path_OR_text) native "Path__create_3constructorCallback";
+Native_Path__create_3constructorCallback(path_OR_text) native "Path_constructorCallback_RESOLVER_STRING_1_DOMString";
 
-Native_Path_arc_Callback(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "Path_arc_Callback";
+Native_Path_arc_Callback(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "Path_arc_Callback_RESOLVER_STRING_6_float_float_float_float_float_boolean";
 
-Native_Path_arcTo_Callback(mthis, x1, y1, x2, y2, radius) native "Path_arcTo_Callback";
+Native_Path_arcTo_Callback(mthis, x1, y1, x2, y2, radius) native "Path_arcTo_Callback_RESOLVER_STRING_5_float_float_float_float_float";
 
-Native_Path_bezierCurveTo_Callback(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "Path_bezierCurveTo_Callback";
+Native_Path_bezierCurveTo_Callback(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "Path_bezierCurveTo_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_Path_closePath_Callback(mthis) native "Path_closePath_Callback";
+Native_Path_closePath_Callback(mthis) native "Path_closePath_Callback_RESOLVER_STRING_0_";
 
-Native_Path_lineTo_Callback(mthis, x, y) native "Path_lineTo_Callback";
+Native_Path_lineTo_Callback(mthis, x, y) native "Path_lineTo_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Path_moveTo_Callback(mthis, x, y) native "Path_moveTo_Callback";
+Native_Path_moveTo_Callback(mthis, x, y) native "Path_moveTo_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Path_quadraticCurveTo_Callback(mthis, cpx, cpy, x, y) native "Path_quadraticCurveTo_Callback";
+Native_Path_quadraticCurveTo_Callback(mthis, cpx, cpy, x, y) native "Path_quadraticCurveTo_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_Path_rect_Callback(mthis, x, y, width, height) native "Path_rect_Callback";
+Native_Path_rect_Callback(mthis, x, y, width, height) native "Path_rect_Callback_RESOLVER_STRING_4_float_float_float_float";
 
 Native_Performance_memory_Getter(mthis) native "Performance_memory_Getter";
 
@@ -4771,31 +4641,25 @@
 
 Native_Performance_timing_Getter(mthis) native "Performance_timing_Getter";
 
-Native_Performance_clearMarks_Callback(mthis, markName) native "Performance_clearMarks_Callback";
+Native_Performance_clearMarks_Callback(mthis, markName) native "Performance_clearMarks_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Performance_clearMeasures_Callback(mthis, measureName) native "Performance_clearMeasures_Callback";
+Native_Performance_clearMeasures_Callback(mthis, measureName) native "Performance_clearMeasures_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Performance_getEntries_Callback(mthis) native "Performance_getEntries_Callback";
+Native_Performance_getEntries_Callback(mthis) native "Performance_getEntries_Callback_RESOLVER_STRING_0_";
 
-Native_Performance_getEntriesByName_Callback(mthis, name, entryType) native "Performance_getEntriesByName_Callback";
+Native_Performance_getEntriesByName_Callback(mthis, name, entryType) native "Performance_getEntriesByName_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Performance_getEntriesByType_Callback(mthis, entryType) native "Performance_getEntriesByType_Callback";
+Native_Performance_getEntriesByType_Callback(mthis, entryType) native "Performance_getEntriesByType_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Performance_mark_Callback(mthis, markName) native "Performance_mark_Callback";
+Native_Performance_mark_Callback(mthis, markName) native "Performance_mark_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Performance_measure_Callback(mthis, measureName, startMark, endMark) native "Performance_measure_Callback";
+Native_Performance_measure_Callback(mthis, measureName, startMark, endMark) native "Performance_measure_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_Performance_now_Callback(mthis) native "Performance_now_Callback";
+Native_Performance_now_Callback(mthis) native "Performance_now_Callback_RESOLVER_STRING_0_";
 
-Native_Performance_webkitClearResourceTimings_Callback(mthis) native "Performance_webkitClearResourceTimings_Callback";
+Native_Performance_webkitClearResourceTimings_Callback(mthis) native "Performance_webkitClearResourceTimings_Callback_RESOLVER_STRING_0_";
 
-Native_Performance_webkitSetResourceTimingBufferSize_Callback(mthis, maxSize) native "Performance_webkitSetResourceTimingBufferSize_Callback";
-
-Native_Performance_addEventListener_Callback(mthis, type, listener, useCapture) native "Performance_addEventListener_Callback";
-
-Native_Performance_dispatchEvent_Callback(mthis, event) native "Performance_dispatchEvent_Callback";
-
-Native_Performance_removeEventListener_Callback(mthis, type, listener, useCapture) native "Performance_removeEventListener_Callback";
+Native_Performance_webkitSetResourceTimingBufferSize_Callback(mthis, maxSize) native "Performance_webkitSetResourceTimingBufferSize_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_PerformanceEntry_duration_Getter(mthis) native "PerformanceEntry_duration_Getter";
 
@@ -4875,37 +4739,37 @@
 
 Native_PerformanceTiming_unloadEventStart_Getter(mthis) native "PerformanceTiming_unloadEventStart_Getter";
 
-Native_Player_currentTime_Getter(mthis) native "Player_currentTime_Getter";
+Native_Player_currentTime_Getter(mthis) native "AnimationPlayer_currentTime_Getter";
 
-Native_Player_currentTime_Setter(mthis, value) native "Player_currentTime_Setter";
+Native_Player_currentTime_Setter(mthis, value) native "AnimationPlayer_currentTime_Setter";
 
-Native_Player_finished_Getter(mthis) native "Player_finished_Getter";
+Native_Player_finished_Getter(mthis) native "AnimationPlayer_finished_Getter";
 
-Native_Player_paused_Getter(mthis) native "Player_paused_Getter";
+Native_Player_paused_Getter(mthis) native "AnimationPlayer_paused_Getter";
 
-Native_Player_playbackRate_Getter(mthis) native "Player_playbackRate_Getter";
+Native_Player_playbackRate_Getter(mthis) native "AnimationPlayer_playbackRate_Getter";
 
-Native_Player_playbackRate_Setter(mthis, value) native "Player_playbackRate_Setter";
+Native_Player_playbackRate_Setter(mthis, value) native "AnimationPlayer_playbackRate_Setter";
 
-Native_Player_source_Getter(mthis) native "Player_source_Getter";
+Native_Player_source_Getter(mthis) native "AnimationPlayer_source_Getter";
 
-Native_Player_source_Setter(mthis, value) native "Player_source_Setter";
+Native_Player_source_Setter(mthis, value) native "AnimationPlayer_source_Setter";
 
-Native_Player_startTime_Getter(mthis) native "Player_startTime_Getter";
+Native_Player_startTime_Getter(mthis) native "AnimationPlayer_startTime_Getter";
 
-Native_Player_startTime_Setter(mthis, value) native "Player_startTime_Setter";
+Native_Player_startTime_Setter(mthis, value) native "AnimationPlayer_startTime_Setter";
 
-Native_Player_timeLag_Getter(mthis) native "Player_timeLag_Getter";
+Native_Player_timeLag_Getter(mthis) native "AnimationPlayer_timeLag_Getter";
 
-Native_Player_cancel_Callback(mthis) native "Player_cancel_Callback";
+Native_Player_cancel_Callback(mthis) native "AnimationPlayer_cancel_Callback_RESOLVER_STRING_0_";
 
-Native_Player_finish_Callback(mthis) native "Player_finish_Callback";
+Native_Player_finish_Callback(mthis) native "AnimationPlayer_finish_Callback_RESOLVER_STRING_0_";
 
-Native_Player_pause_Callback(mthis) native "Player_pause_Callback";
+Native_Player_pause_Callback(mthis) native "AnimationPlayer_pause_Callback_RESOLVER_STRING_0_";
 
-Native_Player_play_Callback(mthis) native "Player_play_Callback";
+Native_Player_play_Callback(mthis) native "AnimationPlayer_play_Callback_RESOLVER_STRING_0_";
 
-Native_Player_reverse_Callback(mthis) native "Player_reverse_Callback";
+Native_Player_reverse_Callback(mthis) native "AnimationPlayer_reverse_Callback_RESOLVER_STRING_0_";
 
 Native_Plugin_description_Getter(mthis) native "Plugin_description_Getter";
 
@@ -4915,23 +4779,23 @@
 
 Native_Plugin_name_Getter(mthis) native "Plugin_name_Getter";
 
-Native_Plugin___getter___Callback(mthis, name) native "Plugin___getter___Callback";
+Native_Plugin___getter___Callback(mthis, name) native "Plugin___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Plugin_item_Callback(mthis, index) native "Plugin_item_Callback";
+Native_Plugin_item_Callback(mthis, index) native "Plugin_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Plugin_namedItem_Callback(mthis, name) native "Plugin_namedItem_Callback";
+Native_Plugin_namedItem_Callback(mthis, name) native "Plugin_namedItem_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_PluginArray_length_Getter(mthis) native "PluginArray_length_Getter";
 
-Native_PluginArray_NativeIndexed_Getter(mthis, index) native "PluginArray_item_Callback";
+Native_PluginArray_NativeIndexed_Getter(mthis, index) native "PluginArray_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_PluginArray___getter___Callback(mthis, name) native "PluginArray___getter___Callback";
+Native_PluginArray___getter___Callback(mthis, name) native "PluginArray___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_PluginArray_item_Callback(mthis, index) native "PluginArray_item_Callback";
+Native_PluginArray_item_Callback(mthis, index) native "PluginArray_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_PluginArray_namedItem_Callback(mthis, name) native "PluginArray_namedItem_Callback";
+Native_PluginArray_namedItem_Callback(mthis, name) native "PluginArray_namedItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_PluginArray_refresh_Callback(mthis, reload) native "PluginArray_refresh_Callback";
+Native_PluginArray_refresh_Callback(mthis, reload) native "PluginArray_refresh_Callback_RESOLVER_STRING_1_boolean";
 
 Native_PopStateEvent_state_Getter(mthis) native "PopStateEvent_state_Getter";
 
@@ -4973,17 +4837,11 @@
     return;
   }
 
-Native_RTCDTMFSender__insertDTMF_1_Callback(mthis, tones, duration, interToneGap) native "RTCDTMFSender__insertDTMF_1_Callback";
+Native_RTCDTMFSender__insertDTMF_1_Callback(mthis, tones, duration, interToneGap) native "RTCDTMFSender_insertDTMF_Callback_RESOLVER_STRING_3_DOMString_long_long";
 
-Native_RTCDTMFSender__insertDTMF_2_Callback(mthis, tones, duration) native "RTCDTMFSender__insertDTMF_2_Callback";
+Native_RTCDTMFSender__insertDTMF_2_Callback(mthis, tones, duration) native "RTCDTMFSender_insertDTMF_Callback_RESOLVER_STRING_2_DOMString_long";
 
-Native_RTCDTMFSender__insertDTMF_3_Callback(mthis, tones) native "RTCDTMFSender__insertDTMF_3_Callback";
-
-Native_RTCDTMFSender_addEventListener_Callback(mthis, type, listener, useCapture) native "RTCDTMFSender_addEventListener_Callback";
-
-Native_RTCDTMFSender_dispatchEvent_Callback(mthis, event) native "RTCDTMFSender_dispatchEvent_Callback";
-
-Native_RTCDTMFSender_removeEventListener_Callback(mthis, type, listener, useCapture) native "RTCDTMFSender_removeEventListener_Callback";
+Native_RTCDTMFSender__insertDTMF_3_Callback(mthis, tones) native "RTCDTMFSender_insertDTMF_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_RTCDTMFToneChangeEvent_tone_Getter(mthis) native "RTCDTMFToneChangeEvent_tone_Getter";
 
@@ -5011,7 +4869,7 @@
 
 Native_RTCDataChannel_reliable_Getter(mthis) native "RTCDataChannel_reliable_Getter";
 
-Native_RTCDataChannel_close_Callback(mthis) native "RTCDataChannel_close_Callback";
+Native_RTCDataChannel_close_Callback(mthis) native "RTCDataChannel_close_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_RTCDataChannel_send(mthis, data) {
@@ -5034,27 +4892,21 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_RTCDataChannel__send_1_Callback(mthis, data) native "RTCDataChannel__send_1_Callback";
+Native_RTCDataChannel__send_1_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
 
-Native_RTCDataChannel__send_2_Callback(mthis, data) native "RTCDataChannel__send_2_Callback";
+Native_RTCDataChannel__send_2_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
 
-Native_RTCDataChannel__send_3_Callback(mthis, data) native "RTCDataChannel__send_3_Callback";
+Native_RTCDataChannel__send_3_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_Blob";
 
-Native_RTCDataChannel__send_4_Callback(mthis, data) native "RTCDataChannel__send_4_Callback";
+Native_RTCDataChannel__send_4_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCDataChannel_sendBlob_Callback(mthis, data) native "RTCDataChannel_sendBlob_Callback";
+Native_RTCDataChannel_sendBlob_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_Blob";
 
-Native_RTCDataChannel_sendByteBuffer_Callback(mthis, data) native "RTCDataChannel_sendByteBuffer_Callback";
+Native_RTCDataChannel_sendByteBuffer_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
 
-Native_RTCDataChannel_sendString_Callback(mthis, data) native "RTCDataChannel_sendString_Callback";
+Native_RTCDataChannel_sendString_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCDataChannel_sendTypedData_Callback(mthis, data) native "RTCDataChannel_sendTypedData_Callback";
-
-Native_RTCDataChannel_addEventListener_Callback(mthis, type, listener, useCapture) native "RTCDataChannel_addEventListener_Callback";
-
-Native_RTCDataChannel_dispatchEvent_Callback(mthis, event) native "RTCDataChannel_dispatchEvent_Callback";
-
-Native_RTCDataChannel_removeEventListener_Callback(mthis, type, listener, useCapture) native "RTCDataChannel_removeEventListener_Callback";
+Native_RTCDataChannel_sendTypedData_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
 
 Native_RTCDataChannelEvent_channel_Getter(mthis) native "RTCDataChannelEvent_channel_Getter";
 
@@ -5063,7 +4915,7 @@
     return Native_RTCIceCandidate__create_1constructorCallback(dictionary);
   }
 
-Native_RTCIceCandidate__create_1constructorCallback(dictionary) native "RTCIceCandidate__create_1constructorCallback";
+Native_RTCIceCandidate__create_1constructorCallback(dictionary) native "RTCIceCandidate_constructorCallback_RESOLVER_STRING_1_Dictionary";
 
 Native_RTCIceCandidate_candidate_Getter(mthis) native "RTCIceCandidate_candidate_Getter";
 
@@ -5078,7 +4930,7 @@
     return Native_RTCPeerConnection__create_1constructorCallback(rtcIceServers, mediaConstraints);
   }
 
-Native_RTCPeerConnection__create_1constructorCallback(rtcIceServers, mediaConstraints) native "RTCPeerConnection__create_1constructorCallback";
+Native_RTCPeerConnection__create_1constructorCallback(rtcIceServers, mediaConstraints) native "RTCPeerConnection_constructorCallback_RESOLVER_STRING_2_Dictionary_Dictionary";
 
 Native_RTCPeerConnection_iceConnectionState_Getter(mthis) native "RTCPeerConnection_iceConnectionState_Getter";
 
@@ -5090,48 +4942,42 @@
 
 Native_RTCPeerConnection_signalingState_Getter(mthis) native "RTCPeerConnection_signalingState_Getter";
 
-Native_RTCPeerConnection_addIceCandidate_Callback(mthis, candidate, successCallback, failureCallback) native "RTCPeerConnection_addIceCandidate_Callback";
+Native_RTCPeerConnection_addIceCandidate_Callback(mthis, candidate, successCallback, failureCallback) native "RTCPeerConnection_addIceCandidate_Callback_RESOLVER_STRING_3_RTCIceCandidate_VoidCallback_RTCErrorCallback";
 
-Native_RTCPeerConnection_addStream_Callback(mthis, stream, mediaConstraints) native "RTCPeerConnection_addStream_Callback";
+Native_RTCPeerConnection_addStream_Callback(mthis, stream, mediaConstraints) native "RTCPeerConnection_addStream_Callback_RESOLVER_STRING_2_MediaStream_Dictionary";
 
-Native_RTCPeerConnection_close_Callback(mthis) native "RTCPeerConnection_close_Callback";
+Native_RTCPeerConnection_close_Callback(mthis) native "RTCPeerConnection_close_Callback_RESOLVER_STRING_0_";
 
-Native_RTCPeerConnection_createAnswer_Callback(mthis, successCallback, failureCallback, mediaConstraints) native "RTCPeerConnection_createAnswer_Callback";
+Native_RTCPeerConnection_createAnswer_Callback(mthis, successCallback, failureCallback, mediaConstraints) native "RTCPeerConnection_createAnswer_Callback_RESOLVER_STRING_3_RTCSessionDescriptionCallback_RTCErrorCallback_Dictionary";
 
-Native_RTCPeerConnection_createDTMFSender_Callback(mthis, track) native "RTCPeerConnection_createDTMFSender_Callback";
+Native_RTCPeerConnection_createDTMFSender_Callback(mthis, track) native "RTCPeerConnection_createDTMFSender_Callback_RESOLVER_STRING_1_MediaStreamTrack";
 
-Native_RTCPeerConnection_createDataChannel_Callback(mthis, label, options) native "RTCPeerConnection_createDataChannel_Callback";
+Native_RTCPeerConnection_createDataChannel_Callback(mthis, label, options) native "RTCPeerConnection_createDataChannel_Callback_RESOLVER_STRING_2_DOMString_Dictionary";
 
-Native_RTCPeerConnection_createOffer_Callback(mthis, successCallback, failureCallback, mediaConstraints) native "RTCPeerConnection_createOffer_Callback";
+Native_RTCPeerConnection_createOffer_Callback(mthis, successCallback, failureCallback, mediaConstraints) native "RTCPeerConnection_createOffer_Callback_RESOLVER_STRING_3_RTCSessionDescriptionCallback_RTCErrorCallback_Dictionary";
 
-Native_RTCPeerConnection_getLocalStreams_Callback(mthis) native "RTCPeerConnection_getLocalStreams_Callback";
+Native_RTCPeerConnection_getLocalStreams_Callback(mthis) native "RTCPeerConnection_getLocalStreams_Callback_RESOLVER_STRING_0_";
 
-Native_RTCPeerConnection_getRemoteStreams_Callback(mthis) native "RTCPeerConnection_getRemoteStreams_Callback";
+Native_RTCPeerConnection_getRemoteStreams_Callback(mthis) native "RTCPeerConnection_getRemoteStreams_Callback_RESOLVER_STRING_0_";
 
-Native_RTCPeerConnection_getStats_Callback(mthis, successCallback, selector) native "RTCPeerConnection_getStats_Callback";
+Native_RTCPeerConnection_getStats_Callback(mthis, successCallback, selector) native "RTCPeerConnection_getStats_Callback_RESOLVER_STRING_2_RTCStatsCallback_MediaStreamTrack";
 
-Native_RTCPeerConnection_getStreamById_Callback(mthis, streamId) native "RTCPeerConnection_getStreamById_Callback";
+Native_RTCPeerConnection_getStreamById_Callback(mthis, streamId) native "RTCPeerConnection_getStreamById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCPeerConnection_removeStream_Callback(mthis, stream) native "RTCPeerConnection_removeStream_Callback";
+Native_RTCPeerConnection_removeStream_Callback(mthis, stream) native "RTCPeerConnection_removeStream_Callback_RESOLVER_STRING_1_MediaStream";
 
-Native_RTCPeerConnection_setLocalDescription_Callback(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setLocalDescription_Callback";
+Native_RTCPeerConnection_setLocalDescription_Callback(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setLocalDescription_Callback_RESOLVER_STRING_3_RTCSessionDescription_VoidCallback_RTCErrorCallback";
 
-Native_RTCPeerConnection_setRemoteDescription_Callback(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setRemoteDescription_Callback";
+Native_RTCPeerConnection_setRemoteDescription_Callback(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setRemoteDescription_Callback_RESOLVER_STRING_3_RTCSessionDescription_VoidCallback_RTCErrorCallback";
 
-Native_RTCPeerConnection_updateIce_Callback(mthis, configuration, mediaConstraints) native "RTCPeerConnection_updateIce_Callback";
-
-Native_RTCPeerConnection_addEventListener_Callback(mthis, type, listener, useCapture) native "RTCPeerConnection_addEventListener_Callback";
-
-Native_RTCPeerConnection_dispatchEvent_Callback(mthis, event) native "RTCPeerConnection_dispatchEvent_Callback";
-
-Native_RTCPeerConnection_removeEventListener_Callback(mthis, type, listener, useCapture) native "RTCPeerConnection_removeEventListener_Callback";
+Native_RTCPeerConnection_updateIce_Callback(mthis, configuration, mediaConstraints) native "RTCPeerConnection_updateIce_Callback_RESOLVER_STRING_2_Dictionary_Dictionary";
 
   // Generated overload resolver
 Native_RTCSessionDescription_RtcSessionDescription(descriptionInitDict) {
     return Native_RTCSessionDescription__create_1constructorCallback(descriptionInitDict);
   }
 
-Native_RTCSessionDescription__create_1constructorCallback(descriptionInitDict) native "RTCSessionDescription__create_1constructorCallback";
+Native_RTCSessionDescription__create_1constructorCallback(descriptionInitDict) native "RTCSessionDescription_constructorCallback_RESOLVER_STRING_1_Dictionary";
 
 Native_RTCSessionDescription_sdp_Getter(mthis) native "RTCSessionDescription_sdp_Getter";
 
@@ -5151,15 +4997,15 @@
 
 Native_RTCStatsReport_type_Getter(mthis) native "RTCStatsReport_type_Getter";
 
-Native_RTCStatsReport_names_Callback(mthis) native "RTCStatsReport_names_Callback";
+Native_RTCStatsReport_names_Callback(mthis) native "RTCStatsReport_names_Callback_RESOLVER_STRING_0_";
 
-Native_RTCStatsReport_stat_Callback(mthis, name) native "RTCStatsReport_stat_Callback";
+Native_RTCStatsReport_stat_Callback(mthis, name) native "RTCStatsReport_stat_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCStatsResponse___getter___Callback(mthis, name) native "RTCStatsResponse___getter___Callback";
+Native_RTCStatsResponse___getter___Callback(mthis, name) native "RTCStatsResponse___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCStatsResponse_namedItem_Callback(mthis, name) native "RTCStatsResponse_namedItem_Callback";
+Native_RTCStatsResponse_namedItem_Callback(mthis, name) native "RTCStatsResponse_namedItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCStatsResponse_result_Callback(mthis) native "RTCStatsResponse_result_Callback";
+Native_RTCStatsResponse_result_Callback(mthis) native "RTCStatsResponse_result_Callback_RESOLVER_STRING_0_";
 
 Native_Range_collapsed_Getter(mthis) native "Range_collapsed_Getter";
 
@@ -5173,51 +5019,51 @@
 
 Native_Range_startOffset_Getter(mthis) native "Range_startOffset_Getter";
 
-Native_Range_cloneContents_Callback(mthis) native "Range_cloneContents_Callback";
+Native_Range_cloneContents_Callback(mthis) native "Range_cloneContents_Callback_RESOLVER_STRING_0_";
 
-Native_Range_cloneRange_Callback(mthis) native "Range_cloneRange_Callback";
+Native_Range_cloneRange_Callback(mthis) native "Range_cloneRange_Callback_RESOLVER_STRING_0_";
 
-Native_Range_collapse_Callback(mthis, toStart) native "Range_collapse_Callback";
+Native_Range_collapse_Callback(mthis, toStart) native "Range_collapse_Callback_RESOLVER_STRING_1_boolean";
 
-Native_Range_comparePoint_Callback(mthis, refNode, offset) native "Range_comparePoint_Callback";
+Native_Range_comparePoint_Callback(mthis, refNode, offset) native "Range_comparePoint_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Range_createContextualFragment_Callback(mthis, html) native "Range_createContextualFragment_Callback";
+Native_Range_createContextualFragment_Callback(mthis, html) native "Range_createContextualFragment_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Range_deleteContents_Callback(mthis) native "Range_deleteContents_Callback";
+Native_Range_deleteContents_Callback(mthis) native "Range_deleteContents_Callback_RESOLVER_STRING_0_";
 
-Native_Range_detach_Callback(mthis) native "Range_detach_Callback";
+Native_Range_detach_Callback(mthis) native "Range_detach_Callback_RESOLVER_STRING_0_";
 
-Native_Range_expand_Callback(mthis, unit) native "Range_expand_Callback";
+Native_Range_expand_Callback(mthis, unit) native "Range_expand_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Range_extractContents_Callback(mthis) native "Range_extractContents_Callback";
+Native_Range_extractContents_Callback(mthis) native "Range_extractContents_Callback_RESOLVER_STRING_0_";
 
-Native_Range_getBoundingClientRect_Callback(mthis) native "Range_getBoundingClientRect_Callback";
+Native_Range_getBoundingClientRect_Callback(mthis) native "Range_getBoundingClientRect_Callback_RESOLVER_STRING_0_";
 
-Native_Range_getClientRects_Callback(mthis) native "Range_getClientRects_Callback";
+Native_Range_getClientRects_Callback(mthis) native "Range_getClientRects_Callback_RESOLVER_STRING_0_";
 
-Native_Range_insertNode_Callback(mthis, newNode) native "Range_insertNode_Callback";
+Native_Range_insertNode_Callback(mthis, newNode) native "Range_insertNode_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_isPointInRange_Callback(mthis, refNode, offset) native "Range_isPointInRange_Callback";
+Native_Range_isPointInRange_Callback(mthis, refNode, offset) native "Range_isPointInRange_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Range_selectNode_Callback(mthis, refNode) native "Range_selectNode_Callback";
+Native_Range_selectNode_Callback(mthis, refNode) native "Range_selectNode_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_selectNodeContents_Callback(mthis, refNode) native "Range_selectNodeContents_Callback";
+Native_Range_selectNodeContents_Callback(mthis, refNode) native "Range_selectNodeContents_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_setEnd_Callback(mthis, refNode, offset) native "Range_setEnd_Callback";
+Native_Range_setEnd_Callback(mthis, refNode, offset) native "Range_setEnd_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Range_setEndAfter_Callback(mthis, refNode) native "Range_setEndAfter_Callback";
+Native_Range_setEndAfter_Callback(mthis, refNode) native "Range_setEndAfter_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_setEndBefore_Callback(mthis, refNode) native "Range_setEndBefore_Callback";
+Native_Range_setEndBefore_Callback(mthis, refNode) native "Range_setEndBefore_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_setStart_Callback(mthis, refNode, offset) native "Range_setStart_Callback";
+Native_Range_setStart_Callback(mthis, refNode, offset) native "Range_setStart_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Range_setStartAfter_Callback(mthis, refNode) native "Range_setStartAfter_Callback";
+Native_Range_setStartAfter_Callback(mthis, refNode) native "Range_setStartAfter_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_setStartBefore_Callback(mthis, refNode) native "Range_setStartBefore_Callback";
+Native_Range_setStartBefore_Callback(mthis, refNode) native "Range_setStartBefore_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_surroundContents_Callback(mthis, newParent) native "Range_surroundContents_Callback";
+Native_Range_surroundContents_Callback(mthis, newParent) native "Range_surroundContents_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_toString_Callback(mthis) native "Range_toString_Callback";
+Native_Range_toString_Callback(mthis) native "Range_toString_Callback_RESOLVER_STRING_0_";
 
 Native_ResourceProgressEvent_url_Getter(mthis) native "ResourceProgressEvent_url_Getter";
 
@@ -5233,7 +5079,7 @@
 
 Native_SQLResultSetRowList_length_Getter(mthis) native "SQLResultSetRowList_length_Getter";
 
-Native_SQLResultSetRowList_NativeIndexed_Getter(mthis, index) native "SQLResultSetRowList_item_Callback";
+Native_SQLResultSetRowList_NativeIndexed_Getter(mthis, index) native "SQLResultSetRowList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_SQLResultSetRowList_item_Callback(mthis, index) native "SQLResultSetRowList_item_Callback";
 
@@ -5265,7 +5111,7 @@
 
 Native_SVGTests_systemLanguage_Getter(mthis) native "SVGTests_systemLanguage_Getter";
 
-Native_SVGTests_hasExtension_Callback(mthis, extension) native "SVGTests_hasExtension_Callback";
+Native_SVGTests_hasExtension_Callback(mthis, extension) native "SVGTests_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_SVGGraphicsElement_farthestViewportElement_Getter(mthis) native "SVGGraphicsElement_farthestViewportElement_Getter";
 
@@ -5273,13 +5119,13 @@
 
 Native_SVGGraphicsElement_transform_Getter(mthis) native "SVGGraphicsElement_transform_Getter";
 
-Native_SVGGraphicsElement_getBBox_Callback(mthis) native "SVGGraphicsElement_getBBox_Callback";
+Native_SVGGraphicsElement_getBBox_Callback(mthis) native "SVGGraphicsElement_getBBox_Callback_RESOLVER_STRING_0_";
 
-Native_SVGGraphicsElement_getCTM_Callback(mthis) native "SVGGraphicsElement_getCTM_Callback";
+Native_SVGGraphicsElement_getCTM_Callback(mthis) native "SVGGraphicsElement_getCTM_Callback_RESOLVER_STRING_0_";
 
-Native_SVGGraphicsElement_getScreenCTM_Callback(mthis) native "SVGGraphicsElement_getScreenCTM_Callback";
+Native_SVGGraphicsElement_getScreenCTM_Callback(mthis) native "SVGGraphicsElement_getScreenCTM_Callback_RESOLVER_STRING_0_";
 
-Native_SVGGraphicsElement_getTransformToElement_Callback(mthis, element) native "SVGGraphicsElement_getTransformToElement_Callback";
+Native_SVGGraphicsElement_getTransformToElement_Callback(mthis, element) native "SVGGraphicsElement_getTransformToElement_Callback_RESOLVER_STRING_1_SVGElement";
 
 Native_SVGGraphicsElement_requiredExtensions_Getter(mthis) native "SVGGraphicsElement_requiredExtensions_Getter";
 
@@ -5287,7 +5133,7 @@
 
 Native_SVGGraphicsElement_systemLanguage_Getter(mthis) native "SVGGraphicsElement_systemLanguage_Getter";
 
-Native_SVGGraphicsElement_hasExtension_Callback(mthis, extension) native "SVGGraphicsElement_hasExtension_Callback";
+Native_SVGGraphicsElement_hasExtension_Callback(mthis, extension) native "SVGGraphicsElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_SVGURIReference_href_Getter(mthis) native "SVGURIReference_href_Getter";
 
@@ -5299,23 +5145,23 @@
 
 Native_SVGTextContentElement_textLength_Getter(mthis) native "SVGTextContentElement_textLength_Getter";
 
-Native_SVGTextContentElement_getCharNumAtPosition_Callback(mthis, point) native "SVGTextContentElement_getCharNumAtPosition_Callback";
+Native_SVGTextContentElement_getCharNumAtPosition_Callback(mthis, point) native "SVGTextContentElement_getCharNumAtPosition_Callback_RESOLVER_STRING_1_SVGPoint";
 
-Native_SVGTextContentElement_getComputedTextLength_Callback(mthis) native "SVGTextContentElement_getComputedTextLength_Callback";
+Native_SVGTextContentElement_getComputedTextLength_Callback(mthis) native "SVGTextContentElement_getComputedTextLength_Callback_RESOLVER_STRING_0_";
 
-Native_SVGTextContentElement_getEndPositionOfChar_Callback(mthis, offset) native "SVGTextContentElement_getEndPositionOfChar_Callback";
+Native_SVGTextContentElement_getEndPositionOfChar_Callback(mthis, offset) native "SVGTextContentElement_getEndPositionOfChar_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTextContentElement_getExtentOfChar_Callback(mthis, offset) native "SVGTextContentElement_getExtentOfChar_Callback";
+Native_SVGTextContentElement_getExtentOfChar_Callback(mthis, offset) native "SVGTextContentElement_getExtentOfChar_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTextContentElement_getNumberOfChars_Callback(mthis) native "SVGTextContentElement_getNumberOfChars_Callback";
+Native_SVGTextContentElement_getNumberOfChars_Callback(mthis) native "SVGTextContentElement_getNumberOfChars_Callback_RESOLVER_STRING_0_";
 
-Native_SVGTextContentElement_getRotationOfChar_Callback(mthis, offset) native "SVGTextContentElement_getRotationOfChar_Callback";
+Native_SVGTextContentElement_getRotationOfChar_Callback(mthis, offset) native "SVGTextContentElement_getRotationOfChar_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTextContentElement_getStartPositionOfChar_Callback(mthis, offset) native "SVGTextContentElement_getStartPositionOfChar_Callback";
+Native_SVGTextContentElement_getStartPositionOfChar_Callback(mthis, offset) native "SVGTextContentElement_getStartPositionOfChar_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTextContentElement_getSubStringLength_Callback(mthis, offset, length) native "SVGTextContentElement_getSubStringLength_Callback";
+Native_SVGTextContentElement_getSubStringLength_Callback(mthis, offset, length) native "SVGTextContentElement_getSubStringLength_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_SVGTextContentElement_selectSubString_Callback(mthis, offset, length) native "SVGTextContentElement_selectSubString_Callback";
+Native_SVGTextContentElement_selectSubString_Callback(mthis, offset, length) native "SVGTextContentElement_selectSubString_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
 Native_SVGTextPositioningElement_dx_Getter(mthis) native "SVGTextPositioningElement_dx_Getter";
 
@@ -5351,25 +5197,25 @@
 
 Native_SVGAngle_valueInSpecifiedUnits_Setter(mthis, value) native "SVGAngle_valueInSpecifiedUnits_Setter";
 
-Native_SVGAngle_convertToSpecifiedUnits_Callback(mthis, unitType) native "SVGAngle_convertToSpecifiedUnits_Callback";
+Native_SVGAngle_convertToSpecifiedUnits_Callback(mthis, unitType) native "SVGAngle_convertToSpecifiedUnits_Callback_RESOLVER_STRING_1_unsigned short";
 
-Native_SVGAngle_newValueSpecifiedUnits_Callback(mthis, unitType, valueInSpecifiedUnits) native "SVGAngle_newValueSpecifiedUnits_Callback";
+Native_SVGAngle_newValueSpecifiedUnits_Callback(mthis, unitType, valueInSpecifiedUnits) native "SVGAngle_newValueSpecifiedUnits_Callback_RESOLVER_STRING_2_unsigned short_float";
 
 Native_SVGAnimationElement_targetElement_Getter(mthis) native "SVGAnimationElement_targetElement_Getter";
 
-Native_SVGAnimationElement_beginElement_Callback(mthis) native "SVGAnimationElement_beginElement_Callback";
+Native_SVGAnimationElement_beginElement_Callback(mthis) native "SVGAnimationElement_beginElement_Callback_RESOLVER_STRING_0_";
 
-Native_SVGAnimationElement_beginElementAt_Callback(mthis, offset) native "SVGAnimationElement_beginElementAt_Callback";
+Native_SVGAnimationElement_beginElementAt_Callback(mthis, offset) native "SVGAnimationElement_beginElementAt_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGAnimationElement_endElement_Callback(mthis) native "SVGAnimationElement_endElement_Callback";
+Native_SVGAnimationElement_endElement_Callback(mthis) native "SVGAnimationElement_endElement_Callback_RESOLVER_STRING_0_";
 
-Native_SVGAnimationElement_endElementAt_Callback(mthis, offset) native "SVGAnimationElement_endElementAt_Callback";
+Native_SVGAnimationElement_endElementAt_Callback(mthis, offset) native "SVGAnimationElement_endElementAt_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGAnimationElement_getCurrentTime_Callback(mthis) native "SVGAnimationElement_getCurrentTime_Callback";
+Native_SVGAnimationElement_getCurrentTime_Callback(mthis) native "SVGAnimationElement_getCurrentTime_Callback_RESOLVER_STRING_0_";
 
-Native_SVGAnimationElement_getSimpleDuration_Callback(mthis) native "SVGAnimationElement_getSimpleDuration_Callback";
+Native_SVGAnimationElement_getSimpleDuration_Callback(mthis) native "SVGAnimationElement_getSimpleDuration_Callback_RESOLVER_STRING_0_";
 
-Native_SVGAnimationElement_getStartTime_Callback(mthis) native "SVGAnimationElement_getStartTime_Callback";
+Native_SVGAnimationElement_getStartTime_Callback(mthis) native "SVGAnimationElement_getStartTime_Callback_RESOLVER_STRING_0_";
 
 Native_SVGAnimationElement_requiredExtensions_Getter(mthis) native "SVGAnimationElement_requiredExtensions_Getter";
 
@@ -5377,7 +5223,7 @@
 
 Native_SVGAnimationElement_systemLanguage_Getter(mthis) native "SVGAnimationElement_systemLanguage_Getter";
 
-Native_SVGAnimationElement_hasExtension_Callback(mthis, extension) native "SVGAnimationElement_hasExtension_Callback";
+Native_SVGAnimationElement_hasExtension_Callback(mthis, extension) native "SVGAnimationElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_SVGAnimatedAngle_animVal_Getter(mthis) native "SVGAnimatedAngle_animVal_Getter";
 
@@ -5437,9 +5283,9 @@
 
 Native_SVGAnimatedTransformList_baseVal_Getter(mthis) native "SVGAnimatedTransformList_baseVal_Getter";
 
-Native_SVGGeometryElement_isPointInFill_Callback(mthis, point) native "SVGGeometryElement_isPointInFill_Callback";
+Native_SVGGeometryElement_isPointInFill_Callback(mthis, point) native "SVGGeometryElement_isPointInFill_Callback_RESOLVER_STRING_1_SVGPoint";
 
-Native_SVGGeometryElement_isPointInStroke_Callback(mthis, point) native "SVGGeometryElement_isPointInStroke_Callback";
+Native_SVGGeometryElement_isPointInStroke_Callback(mthis, point) native "SVGGeometryElement_isPointInStroke_Callback_RESOLVER_STRING_1_SVGPoint";
 
 Native_SVGCircleElement_cx_Getter(mthis) native "SVGCircleElement_cx_Getter";
 
@@ -5465,17 +5311,11 @@
 
 Native_SVGElementInstance_previousSibling_Getter(mthis) native "SVGElementInstance_previousSibling_Getter";
 
-Native_SVGElementInstance_addEventListener_Callback(mthis, type, listener, useCapture) native "SVGElementInstance_addEventListener_Callback";
-
-Native_SVGElementInstance_dispatchEvent_Callback(mthis, event) native "SVGElementInstance_dispatchEvent_Callback";
-
-Native_SVGElementInstance_removeEventListener_Callback(mthis, type, listener, useCapture) native "SVGElementInstance_removeEventListener_Callback";
-
 Native_SVGElementInstanceList_length_Getter(mthis) native "SVGElementInstanceList_length_Getter";
 
-Native_SVGElementInstanceList_NativeIndexed_Getter(mthis, index) native "SVGElementInstanceList_item_Callback";
+Native_SVGElementInstanceList_NativeIndexed_Getter(mthis, index) native "SVGElementInstanceList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGElementInstanceList_item_Callback(mthis, index) native "SVGElementInstanceList_item_Callback";
+Native_SVGElementInstanceList_item_Callback(mthis, index) native "SVGElementInstanceList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_SVGEllipseElement_cx_Getter(mthis) native "SVGEllipseElement_cx_Getter";
 
@@ -5657,7 +5497,7 @@
 
 Native_SVGFEGaussianBlurElement_stdDeviationY_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationY_Getter";
 
-Native_SVGFEGaussianBlurElement_setStdDeviation_Callback(mthis, stdDeviationX, stdDeviationY) native "SVGFEGaussianBlurElement_setStdDeviation_Callback";
+Native_SVGFEGaussianBlurElement_setStdDeviation_Callback(mthis, stdDeviationX, stdDeviationY) native "SVGFEGaussianBlurElement_setStdDeviation_Callback_RESOLVER_STRING_2_float_float";
 
 Native_SVGFEGaussianBlurElement_height_Getter(mthis) native "SVGFEGaussianBlurElement_height_Getter";
 
@@ -5703,7 +5543,7 @@
 
 Native_SVGFEMorphologyElement_radiusY_Getter(mthis) native "SVGFEMorphologyElement_radiusY_Getter";
 
-Native_SVGFEMorphologyElement_setRadius_Callback(mthis, radiusX, radiusY) native "SVGFEMorphologyElement_setRadius_Callback";
+Native_SVGFEMorphologyElement_setRadius_Callback(mthis, radiusX, radiusY) native "SVGFEMorphologyElement_setRadius_Callback_RESOLVER_STRING_2_float_float";
 
 Native_SVGFEMorphologyElement_height_Getter(mthis) native "SVGFEMorphologyElement_height_Getter";
 
@@ -5821,7 +5661,7 @@
 
 Native_SVGFilterElement_y_Getter(mthis) native "SVGFilterElement_y_Getter";
 
-Native_SVGFilterElement_setFilterRes_Callback(mthis, filterResX, filterResY) native "SVGFilterElement_setFilterRes_Callback";
+Native_SVGFilterElement_setFilterRes_Callback(mthis, filterResX, filterResY) native "SVGFilterElement_setFilterRes_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
 Native_SVGFilterElement_href_Getter(mthis) native "SVGFilterElement_href_Getter";
 
@@ -5871,25 +5711,25 @@
 
 Native_SVGLength_valueInSpecifiedUnits_Setter(mthis, value) native "SVGLength_valueInSpecifiedUnits_Setter";
 
-Native_SVGLength_convertToSpecifiedUnits_Callback(mthis, unitType) native "SVGLength_convertToSpecifiedUnits_Callback";
+Native_SVGLength_convertToSpecifiedUnits_Callback(mthis, unitType) native "SVGLength_convertToSpecifiedUnits_Callback_RESOLVER_STRING_1_unsigned short";
 
-Native_SVGLength_newValueSpecifiedUnits_Callback(mthis, unitType, valueInSpecifiedUnits) native "SVGLength_newValueSpecifiedUnits_Callback";
+Native_SVGLength_newValueSpecifiedUnits_Callback(mthis, unitType, valueInSpecifiedUnits) native "SVGLength_newValueSpecifiedUnits_Callback_RESOLVER_STRING_2_unsigned short_float";
 
 Native_SVGLengthList_numberOfItems_Getter(mthis) native "SVGLengthList_numberOfItems_Getter";
 
-Native_SVGLengthList_appendItem_Callback(mthis, item) native "SVGLengthList_appendItem_Callback";
+Native_SVGLengthList_appendItem_Callback(mthis, item) native "SVGLengthList_appendItem_Callback_RESOLVER_STRING_1_SVGLength";
 
-Native_SVGLengthList_clear_Callback(mthis) native "SVGLengthList_clear_Callback";
+Native_SVGLengthList_clear_Callback(mthis) native "SVGLengthList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGLengthList_getItem_Callback(mthis, index) native "SVGLengthList_getItem_Callback";
+Native_SVGLengthList_getItem_Callback(mthis, index) native "SVGLengthList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGLengthList_initialize_Callback(mthis, item) native "SVGLengthList_initialize_Callback";
+Native_SVGLengthList_initialize_Callback(mthis, item) native "SVGLengthList_initialize_Callback_RESOLVER_STRING_1_SVGLength";
 
-Native_SVGLengthList_insertItemBefore_Callback(mthis, item, index) native "SVGLengthList_insertItemBefore_Callback";
+Native_SVGLengthList_insertItemBefore_Callback(mthis, item, index) native "SVGLengthList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGLength_unsigned long";
 
-Native_SVGLengthList_removeItem_Callback(mthis, index) native "SVGLengthList_removeItem_Callback";
+Native_SVGLengthList_removeItem_Callback(mthis, index) native "SVGLengthList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGLengthList_replaceItem_Callback(mthis, item, index) native "SVGLengthList_replaceItem_Callback";
+Native_SVGLengthList_replaceItem_Callback(mthis, item, index) native "SVGLengthList_replaceItem_Callback_RESOLVER_STRING_2_SVGLength_unsigned long";
 
 Native_SVGLineElement_x1_Getter(mthis) native "SVGLineElement_x1_Getter";
 
@@ -5921,9 +5761,9 @@
 
 Native_SVGMarkerElement_refY_Getter(mthis) native "SVGMarkerElement_refY_Getter";
 
-Native_SVGMarkerElement_setOrientToAngle_Callback(mthis, angle) native "SVGMarkerElement_setOrientToAngle_Callback";
+Native_SVGMarkerElement_setOrientToAngle_Callback(mthis, angle) native "SVGMarkerElement_setOrientToAngle_Callback_RESOLVER_STRING_1_SVGAngle";
 
-Native_SVGMarkerElement_setOrientToAuto_Callback(mthis) native "SVGMarkerElement_setOrientToAuto_Callback";
+Native_SVGMarkerElement_setOrientToAuto_Callback(mthis) native "SVGMarkerElement_setOrientToAuto_Callback_RESOLVER_STRING_0_";
 
 Native_SVGMarkerElement_preserveAspectRatio_Getter(mthis) native "SVGMarkerElement_preserveAspectRatio_Getter";
 
@@ -5947,7 +5787,7 @@
 
 Native_SVGMaskElement_systemLanguage_Getter(mthis) native "SVGMaskElement_systemLanguage_Getter";
 
-Native_SVGMaskElement_hasExtension_Callback(mthis, extension) native "SVGMaskElement_hasExtension_Callback";
+Native_SVGMaskElement_hasExtension_Callback(mthis, extension) native "SVGMaskElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_SVGMatrix_a_Getter(mthis) native "SVGMatrix_a_Getter";
 
@@ -5973,27 +5813,27 @@
 
 Native_SVGMatrix_f_Setter(mthis, value) native "SVGMatrix_f_Setter";
 
-Native_SVGMatrix_flipX_Callback(mthis) native "SVGMatrix_flipX_Callback";
+Native_SVGMatrix_flipX_Callback(mthis) native "SVGMatrix_flipX_Callback_RESOLVER_STRING_0_";
 
-Native_SVGMatrix_flipY_Callback(mthis) native "SVGMatrix_flipY_Callback";
+Native_SVGMatrix_flipY_Callback(mthis) native "SVGMatrix_flipY_Callback_RESOLVER_STRING_0_";
 
-Native_SVGMatrix_inverse_Callback(mthis) native "SVGMatrix_inverse_Callback";
+Native_SVGMatrix_inverse_Callback(mthis) native "SVGMatrix_inverse_Callback_RESOLVER_STRING_0_";
 
-Native_SVGMatrix_multiply_Callback(mthis, secondMatrix) native "SVGMatrix_multiply_Callback";
+Native_SVGMatrix_multiply_Callback(mthis, secondMatrix) native "SVGMatrix_multiply_Callback_RESOLVER_STRING_1_SVGMatrix";
 
-Native_SVGMatrix_rotate_Callback(mthis, angle) native "SVGMatrix_rotate_Callback";
+Native_SVGMatrix_rotate_Callback(mthis, angle) native "SVGMatrix_rotate_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGMatrix_rotateFromVector_Callback(mthis, x, y) native "SVGMatrix_rotateFromVector_Callback";
+Native_SVGMatrix_rotateFromVector_Callback(mthis, x, y) native "SVGMatrix_rotateFromVector_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGMatrix_scale_Callback(mthis, scaleFactor) native "SVGMatrix_scale_Callback";
+Native_SVGMatrix_scale_Callback(mthis, scaleFactor) native "SVGMatrix_scale_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGMatrix_scaleNonUniform_Callback(mthis, scaleFactorX, scaleFactorY) native "SVGMatrix_scaleNonUniform_Callback";
+Native_SVGMatrix_scaleNonUniform_Callback(mthis, scaleFactorX, scaleFactorY) native "SVGMatrix_scaleNonUniform_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGMatrix_skewX_Callback(mthis, angle) native "SVGMatrix_skewX_Callback";
+Native_SVGMatrix_skewX_Callback(mthis, angle) native "SVGMatrix_skewX_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGMatrix_skewY_Callback(mthis, angle) native "SVGMatrix_skewY_Callback";
+Native_SVGMatrix_skewY_Callback(mthis, angle) native "SVGMatrix_skewY_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGMatrix_translate_Callback(mthis, x, y) native "SVGMatrix_translate_Callback";
+Native_SVGMatrix_translate_Callback(mthis, x, y) native "SVGMatrix_translate_Callback_RESOLVER_STRING_2_float_float";
 
 Native_SVGNumber_value_Getter(mthis) native "SVGNumber_value_Getter";
 
@@ -6001,19 +5841,19 @@
 
 Native_SVGNumberList_numberOfItems_Getter(mthis) native "SVGNumberList_numberOfItems_Getter";
 
-Native_SVGNumberList_appendItem_Callback(mthis, item) native "SVGNumberList_appendItem_Callback";
+Native_SVGNumberList_appendItem_Callback(mthis, item) native "SVGNumberList_appendItem_Callback_RESOLVER_STRING_1_SVGNumber";
 
-Native_SVGNumberList_clear_Callback(mthis) native "SVGNumberList_clear_Callback";
+Native_SVGNumberList_clear_Callback(mthis) native "SVGNumberList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGNumberList_getItem_Callback(mthis, index) native "SVGNumberList_getItem_Callback";
+Native_SVGNumberList_getItem_Callback(mthis, index) native "SVGNumberList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGNumberList_initialize_Callback(mthis, item) native "SVGNumberList_initialize_Callback";
+Native_SVGNumberList_initialize_Callback(mthis, item) native "SVGNumberList_initialize_Callback_RESOLVER_STRING_1_SVGNumber";
 
-Native_SVGNumberList_insertItemBefore_Callback(mthis, item, index) native "SVGNumberList_insertItemBefore_Callback";
+Native_SVGNumberList_insertItemBefore_Callback(mthis, item, index) native "SVGNumberList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGNumber_unsigned long";
 
-Native_SVGNumberList_removeItem_Callback(mthis, index) native "SVGNumberList_removeItem_Callback";
+Native_SVGNumberList_removeItem_Callback(mthis, index) native "SVGNumberList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGNumberList_replaceItem_Callback(mthis, item, index) native "SVGNumberList_replaceItem_Callback";
+Native_SVGNumberList_replaceItem_Callback(mthis, item, index) native "SVGNumberList_replaceItem_Callback_RESOLVER_STRING_2_SVGNumber_unsigned long";
 
 Native_SVGPathElement_animatedNormalizedPathSegList_Getter(mthis) native "SVGPathElement_animatedNormalizedPathSegList_Getter";
 
@@ -6025,49 +5865,49 @@
 
 Native_SVGPathElement_pathSegList_Getter(mthis) native "SVGPathElement_pathSegList_Getter";
 
-Native_SVGPathElement_createSVGPathSegArcAbs_Callback(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcAbs_Callback";
+Native_SVGPathElement_createSVGPathSegArcAbs_Callback(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcAbs_Callback_RESOLVER_STRING_7_float_float_float_float_float_boolean_boolean";
 
-Native_SVGPathElement_createSVGPathSegArcRel_Callback(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcRel_Callback";
+Native_SVGPathElement_createSVGPathSegArcRel_Callback(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcRel_Callback_RESOLVER_STRING_7_float_float_float_float_float_boolean_boolean";
 
-Native_SVGPathElement_createSVGPathSegClosePath_Callback(mthis) native "SVGPathElement_createSVGPathSegClosePath_Callback";
+Native_SVGPathElement_createSVGPathSegClosePath_Callback(mthis) native "SVGPathElement_createSVGPathSegClosePath_Callback_RESOLVER_STRING_0_";
 
-Native_SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback";
+Native_SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback";
+Native_SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback";
+Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback";
+Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback";
+Native_SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback";
+Native_SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
+Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
+Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_createSVGPathSegLinetoAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";
+Native_SVGPathElement_createSVGPathSegLinetoAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback";
+Native_SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback";
+Native_SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegLinetoRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";
+Native_SVGPathElement_createSVGPathSegLinetoRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback";
+Native_SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback";
+Native_SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegMovetoAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";
+Native_SVGPathElement_createSVGPathSegMovetoAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_createSVGPathSegMovetoRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";
+Native_SVGPathElement_createSVGPathSegMovetoRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_getPathSegAtLength_Callback(mthis, distance) native "SVGPathElement_getPathSegAtLength_Callback";
+Native_SVGPathElement_getPathSegAtLength_Callback(mthis, distance) native "SVGPathElement_getPathSegAtLength_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_getPointAtLength_Callback(mthis, distance) native "SVGPathElement_getPointAtLength_Callback";
+Native_SVGPathElement_getPointAtLength_Callback(mthis, distance) native "SVGPathElement_getPointAtLength_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_getTotalLength_Callback(mthis) native "SVGPathElement_getTotalLength_Callback";
+Native_SVGPathElement_getTotalLength_Callback(mthis) native "SVGPathElement_getTotalLength_Callback_RESOLVER_STRING_0_";
 
 Native_SVGPathSeg_pathSegType_Getter(mthis) native "SVGPathSeg_pathSegType_Getter";
 
@@ -6291,19 +6131,19 @@
 
 Native_SVGPathSegList_numberOfItems_Getter(mthis) native "SVGPathSegList_numberOfItems_Getter";
 
-Native_SVGPathSegList_appendItem_Callback(mthis, newItem) native "SVGPathSegList_appendItem_Callback";
+Native_SVGPathSegList_appendItem_Callback(mthis, newItem) native "SVGPathSegList_appendItem_Callback_RESOLVER_STRING_1_SVGPathSeg";
 
-Native_SVGPathSegList_clear_Callback(mthis) native "SVGPathSegList_clear_Callback";
+Native_SVGPathSegList_clear_Callback(mthis) native "SVGPathSegList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGPathSegList_getItem_Callback(mthis, index) native "SVGPathSegList_getItem_Callback";
+Native_SVGPathSegList_getItem_Callback(mthis, index) native "SVGPathSegList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGPathSegList_initialize_Callback(mthis, newItem) native "SVGPathSegList_initialize_Callback";
+Native_SVGPathSegList_initialize_Callback(mthis, newItem) native "SVGPathSegList_initialize_Callback_RESOLVER_STRING_1_SVGPathSeg";
 
-Native_SVGPathSegList_insertItemBefore_Callback(mthis, newItem, index) native "SVGPathSegList_insertItemBefore_Callback";
+Native_SVGPathSegList_insertItemBefore_Callback(mthis, newItem, index) native "SVGPathSegList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGPathSeg_unsigned long";
 
-Native_SVGPathSegList_removeItem_Callback(mthis, index) native "SVGPathSegList_removeItem_Callback";
+Native_SVGPathSegList_removeItem_Callback(mthis, index) native "SVGPathSegList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGPathSegList_replaceItem_Callback(mthis, newItem, index) native "SVGPathSegList_replaceItem_Callback";
+Native_SVGPathSegList_replaceItem_Callback(mthis, newItem, index) native "SVGPathSegList_replaceItem_Callback_RESOLVER_STRING_2_SVGPathSeg_unsigned long";
 
 Native_SVGPathSegMovetoAbs_x_Getter(mthis) native "SVGPathSegMovetoAbs_x_Getter";
 
@@ -6345,7 +6185,7 @@
 
 Native_SVGPatternElement_systemLanguage_Getter(mthis) native "SVGPatternElement_systemLanguage_Getter";
 
-Native_SVGPatternElement_hasExtension_Callback(mthis, extension) native "SVGPatternElement_hasExtension_Callback";
+Native_SVGPatternElement_hasExtension_Callback(mthis, extension) native "SVGPatternElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_SVGPatternElement_href_Getter(mthis) native "SVGPatternElement_href_Getter";
 
@@ -6357,23 +6197,23 @@
 
 Native_SVGPoint_y_Setter(mthis, value) native "SVGPoint_y_Setter";
 
-Native_SVGPoint_matrixTransform_Callback(mthis, matrix) native "SVGPoint_matrixTransform_Callback";
+Native_SVGPoint_matrixTransform_Callback(mthis, matrix) native "SVGPoint_matrixTransform_Callback_RESOLVER_STRING_1_SVGMatrix";
 
 Native_SVGPointList_numberOfItems_Getter(mthis) native "SVGPointList_numberOfItems_Getter";
 
-Native_SVGPointList_appendItem_Callback(mthis, item) native "SVGPointList_appendItem_Callback";
+Native_SVGPointList_appendItem_Callback(mthis, item) native "SVGPointList_appendItem_Callback_RESOLVER_STRING_1_SVGPoint";
 
-Native_SVGPointList_clear_Callback(mthis) native "SVGPointList_clear_Callback";
+Native_SVGPointList_clear_Callback(mthis) native "SVGPointList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGPointList_getItem_Callback(mthis, index) native "SVGPointList_getItem_Callback";
+Native_SVGPointList_getItem_Callback(mthis, index) native "SVGPointList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGPointList_initialize_Callback(mthis, item) native "SVGPointList_initialize_Callback";
+Native_SVGPointList_initialize_Callback(mthis, item) native "SVGPointList_initialize_Callback_RESOLVER_STRING_1_SVGPoint";
 
-Native_SVGPointList_insertItemBefore_Callback(mthis, item, index) native "SVGPointList_insertItemBefore_Callback";
+Native_SVGPointList_insertItemBefore_Callback(mthis, item, index) native "SVGPointList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGPoint_unsigned long";
 
-Native_SVGPointList_removeItem_Callback(mthis, index) native "SVGPointList_removeItem_Callback";
+Native_SVGPointList_removeItem_Callback(mthis, index) native "SVGPointList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGPointList_replaceItem_Callback(mthis, item, index) native "SVGPointList_replaceItem_Callback";
+Native_SVGPointList_replaceItem_Callback(mthis, item, index) native "SVGPointList_replaceItem_Callback_RESOLVER_STRING_2_SVGPoint_unsigned long";
 
 Native_SVGPolygonElement_animatedPoints_Getter(mthis) native "SVGPolygonElement_animatedPoints_Getter";
 
@@ -6471,51 +6311,51 @@
 
 Native_SVGSVGElement_y_Getter(mthis) native "SVGSVGElement_y_Getter";
 
-Native_SVGSVGElement_animationsPaused_Callback(mthis) native "SVGSVGElement_animationsPaused_Callback";
+Native_SVGSVGElement_animationsPaused_Callback(mthis) native "SVGSVGElement_animationsPaused_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_checkEnclosure_Callback(mthis, element, rect) native "SVGSVGElement_checkEnclosure_Callback";
+Native_SVGSVGElement_checkEnclosure_Callback(mthis, element, rect) native "SVGSVGElement_checkEnclosure_Callback_RESOLVER_STRING_2_SVGElement_SVGRect";
 
-Native_SVGSVGElement_checkIntersection_Callback(mthis, element, rect) native "SVGSVGElement_checkIntersection_Callback";
+Native_SVGSVGElement_checkIntersection_Callback(mthis, element, rect) native "SVGSVGElement_checkIntersection_Callback_RESOLVER_STRING_2_SVGElement_SVGRect";
 
-Native_SVGSVGElement_createSVGAngle_Callback(mthis) native "SVGSVGElement_createSVGAngle_Callback";
+Native_SVGSVGElement_createSVGAngle_Callback(mthis) native "SVGSVGElement_createSVGAngle_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_createSVGLength_Callback(mthis) native "SVGSVGElement_createSVGLength_Callback";
+Native_SVGSVGElement_createSVGLength_Callback(mthis) native "SVGSVGElement_createSVGLength_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_createSVGMatrix_Callback(mthis) native "SVGSVGElement_createSVGMatrix_Callback";
+Native_SVGSVGElement_createSVGMatrix_Callback(mthis) native "SVGSVGElement_createSVGMatrix_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_createSVGNumber_Callback(mthis) native "SVGSVGElement_createSVGNumber_Callback";
+Native_SVGSVGElement_createSVGNumber_Callback(mthis) native "SVGSVGElement_createSVGNumber_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_createSVGPoint_Callback(mthis) native "SVGSVGElement_createSVGPoint_Callback";
+Native_SVGSVGElement_createSVGPoint_Callback(mthis) native "SVGSVGElement_createSVGPoint_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_createSVGRect_Callback(mthis) native "SVGSVGElement_createSVGRect_Callback";
+Native_SVGSVGElement_createSVGRect_Callback(mthis) native "SVGSVGElement_createSVGRect_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_createSVGTransform_Callback(mthis) native "SVGSVGElement_createSVGTransform_Callback";
+Native_SVGSVGElement_createSVGTransform_Callback(mthis) native "SVGSVGElement_createSVGTransform_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_createSVGTransformFromMatrix_Callback(mthis, matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
+Native_SVGSVGElement_createSVGTransformFromMatrix_Callback(mthis, matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback_RESOLVER_STRING_1_SVGMatrix";
 
-Native_SVGSVGElement_deselectAll_Callback(mthis) native "SVGSVGElement_deselectAll_Callback";
+Native_SVGSVGElement_deselectAll_Callback(mthis) native "SVGSVGElement_deselectAll_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_forceRedraw_Callback(mthis) native "SVGSVGElement_forceRedraw_Callback";
+Native_SVGSVGElement_forceRedraw_Callback(mthis) native "SVGSVGElement_forceRedraw_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_getCurrentTime_Callback(mthis) native "SVGSVGElement_getCurrentTime_Callback";
+Native_SVGSVGElement_getCurrentTime_Callback(mthis) native "SVGSVGElement_getCurrentTime_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_getElementById_Callback(mthis, elementId) native "SVGSVGElement_getElementById_Callback";
+Native_SVGSVGElement_getElementById_Callback(mthis, elementId) native "SVGSVGElement_getElementById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SVGSVGElement_getEnclosureList_Callback(mthis, rect, referenceElement) native "SVGSVGElement_getEnclosureList_Callback";
+Native_SVGSVGElement_getEnclosureList_Callback(mthis, rect, referenceElement) native "SVGSVGElement_getEnclosureList_Callback_RESOLVER_STRING_2_SVGRect_SVGElement";
 
-Native_SVGSVGElement_getIntersectionList_Callback(mthis, rect, referenceElement) native "SVGSVGElement_getIntersectionList_Callback";
+Native_SVGSVGElement_getIntersectionList_Callback(mthis, rect, referenceElement) native "SVGSVGElement_getIntersectionList_Callback_RESOLVER_STRING_2_SVGRect_SVGElement";
 
-Native_SVGSVGElement_pauseAnimations_Callback(mthis) native "SVGSVGElement_pauseAnimations_Callback";
+Native_SVGSVGElement_pauseAnimations_Callback(mthis) native "SVGSVGElement_pauseAnimations_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_setCurrentTime_Callback(mthis, seconds) native "SVGSVGElement_setCurrentTime_Callback";
+Native_SVGSVGElement_setCurrentTime_Callback(mthis, seconds) native "SVGSVGElement_setCurrentTime_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGSVGElement_suspendRedraw_Callback(mthis, maxWaitMilliseconds) native "SVGSVGElement_suspendRedraw_Callback";
+Native_SVGSVGElement_suspendRedraw_Callback(mthis, maxWaitMilliseconds) native "SVGSVGElement_suspendRedraw_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGSVGElement_unpauseAnimations_Callback(mthis) native "SVGSVGElement_unpauseAnimations_Callback";
+Native_SVGSVGElement_unpauseAnimations_Callback(mthis) native "SVGSVGElement_unpauseAnimations_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_unsuspendRedraw_Callback(mthis, suspendHandleId) native "SVGSVGElement_unsuspendRedraw_Callback";
+Native_SVGSVGElement_unsuspendRedraw_Callback(mthis, suspendHandleId) native "SVGSVGElement_unsuspendRedraw_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGSVGElement_unsuspendRedrawAll_Callback(mthis) native "SVGSVGElement_unsuspendRedrawAll_Callback";
+Native_SVGSVGElement_unsuspendRedrawAll_Callback(mthis) native "SVGSVGElement_unsuspendRedrawAll_Callback_RESOLVER_STRING_0_";
 
 Native_SVGSVGElement_preserveAspectRatio_Getter(mthis) native "SVGSVGElement_preserveAspectRatio_Getter";
 
@@ -6535,19 +6375,19 @@
 
 Native_SVGStringList_numberOfItems_Getter(mthis) native "SVGStringList_numberOfItems_Getter";
 
-Native_SVGStringList_appendItem_Callback(mthis, item) native "SVGStringList_appendItem_Callback";
+Native_SVGStringList_appendItem_Callback(mthis, item) native "SVGStringList_appendItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SVGStringList_clear_Callback(mthis) native "SVGStringList_clear_Callback";
+Native_SVGStringList_clear_Callback(mthis) native "SVGStringList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGStringList_getItem_Callback(mthis, index) native "SVGStringList_getItem_Callback";
+Native_SVGStringList_getItem_Callback(mthis, index) native "SVGStringList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGStringList_initialize_Callback(mthis, item) native "SVGStringList_initialize_Callback";
+Native_SVGStringList_initialize_Callback(mthis, item) native "SVGStringList_initialize_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SVGStringList_insertItemBefore_Callback(mthis, item, index) native "SVGStringList_insertItemBefore_Callback";
+Native_SVGStringList_insertItemBefore_Callback(mthis, item, index) native "SVGStringList_insertItemBefore_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
 
-Native_SVGStringList_removeItem_Callback(mthis, index) native "SVGStringList_removeItem_Callback";
+Native_SVGStringList_removeItem_Callback(mthis, index) native "SVGStringList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGStringList_replaceItem_Callback(mthis, item, index) native "SVGStringList_replaceItem_Callback";
+Native_SVGStringList_replaceItem_Callback(mthis, item, index) native "SVGStringList_replaceItem_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
 
 Native_SVGStyleElement_disabled_Getter(mthis) native "SVGStyleElement_disabled_Getter";
 
@@ -6583,37 +6423,37 @@
 
 Native_SVGTransform_type_Getter(mthis) native "SVGTransform_type_Getter";
 
-Native_SVGTransform_setMatrix_Callback(mthis, matrix) native "SVGTransform_setMatrix_Callback";
+Native_SVGTransform_setMatrix_Callback(mthis, matrix) native "SVGTransform_setMatrix_Callback_RESOLVER_STRING_1_SVGMatrix";
 
-Native_SVGTransform_setRotate_Callback(mthis, angle, cx, cy) native "SVGTransform_setRotate_Callback";
+Native_SVGTransform_setRotate_Callback(mthis, angle, cx, cy) native "SVGTransform_setRotate_Callback_RESOLVER_STRING_3_float_float_float";
 
-Native_SVGTransform_setScale_Callback(mthis, sx, sy) native "SVGTransform_setScale_Callback";
+Native_SVGTransform_setScale_Callback(mthis, sx, sy) native "SVGTransform_setScale_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGTransform_setSkewX_Callback(mthis, angle) native "SVGTransform_setSkewX_Callback";
+Native_SVGTransform_setSkewX_Callback(mthis, angle) native "SVGTransform_setSkewX_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGTransform_setSkewY_Callback(mthis, angle) native "SVGTransform_setSkewY_Callback";
+Native_SVGTransform_setSkewY_Callback(mthis, angle) native "SVGTransform_setSkewY_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGTransform_setTranslate_Callback(mthis, tx, ty) native "SVGTransform_setTranslate_Callback";
+Native_SVGTransform_setTranslate_Callback(mthis, tx, ty) native "SVGTransform_setTranslate_Callback_RESOLVER_STRING_2_float_float";
 
 Native_SVGTransformList_numberOfItems_Getter(mthis) native "SVGTransformList_numberOfItems_Getter";
 
-Native_SVGTransformList_appendItem_Callback(mthis, item) native "SVGTransformList_appendItem_Callback";
+Native_SVGTransformList_appendItem_Callback(mthis, item) native "SVGTransformList_appendItem_Callback_RESOLVER_STRING_1_SVGTransform";
 
-Native_SVGTransformList_clear_Callback(mthis) native "SVGTransformList_clear_Callback";
+Native_SVGTransformList_clear_Callback(mthis) native "SVGTransformList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGTransformList_consolidate_Callback(mthis) native "SVGTransformList_consolidate_Callback";
+Native_SVGTransformList_consolidate_Callback(mthis) native "SVGTransformList_consolidate_Callback_RESOLVER_STRING_0_";
 
-Native_SVGTransformList_createSVGTransformFromMatrix_Callback(mthis, matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
+Native_SVGTransformList_createSVGTransformFromMatrix_Callback(mthis, matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback_RESOLVER_STRING_1_SVGMatrix";
 
-Native_SVGTransformList_getItem_Callback(mthis, index) native "SVGTransformList_getItem_Callback";
+Native_SVGTransformList_getItem_Callback(mthis, index) native "SVGTransformList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTransformList_initialize_Callback(mthis, item) native "SVGTransformList_initialize_Callback";
+Native_SVGTransformList_initialize_Callback(mthis, item) native "SVGTransformList_initialize_Callback_RESOLVER_STRING_1_SVGTransform";
 
-Native_SVGTransformList_insertItemBefore_Callback(mthis, item, index) native "SVGTransformList_insertItemBefore_Callback";
+Native_SVGTransformList_insertItemBefore_Callback(mthis, item, index) native "SVGTransformList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGTransform_unsigned long";
 
-Native_SVGTransformList_removeItem_Callback(mthis, index) native "SVGTransformList_removeItem_Callback";
+Native_SVGTransformList_removeItem_Callback(mthis, index) native "SVGTransformList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTransformList_replaceItem_Callback(mthis, item, index) native "SVGTransformList_replaceItem_Callback";
+Native_SVGTransformList_replaceItem_Callback(mthis, item, index) native "SVGTransformList_replaceItem_Callback_RESOLVER_STRING_2_SVGTransform_unsigned long";
 
 Native_SVGUseElement_animatedInstanceRoot_Getter(mthis) native "SVGUseElement_animatedInstanceRoot_Getter";
 
@@ -6633,7 +6473,7 @@
 
 Native_SVGUseElement_systemLanguage_Getter(mthis) native "SVGUseElement_systemLanguage_Getter";
 
-Native_SVGUseElement_hasExtension_Callback(mthis, extension) native "SVGUseElement_hasExtension_Callback";
+Native_SVGUseElement_hasExtension_Callback(mthis, extension) native "SVGUseElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_SVGUseElement_href_Getter(mthis) native "SVGUseElement_href_Getter";
 
@@ -6706,17 +6546,11 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Screen__lockOrientation_1_Callback(mthis, orientation_OR_orientations) native "Screen__lockOrientation_1_Callback";
+Native_Screen__lockOrientation_1_Callback(mthis, orientation_OR_orientations) native "Screen_lockOrientation_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Screen__lockOrientation_2_Callback(mthis, orientation_OR_orientations) native "Screen__lockOrientation_2_Callback";
+Native_Screen__lockOrientation_2_Callback(mthis, orientation_OR_orientations) native "Screen_lockOrientation_Callback_RESOLVER_STRING_1_sequence<DOMString>";
 
-Native_Screen_unlockOrientation_Callback(mthis) native "Screen_unlockOrientation_Callback";
-
-Native_Screen_addEventListener_Callback(mthis, type, listener, useCapture) native "Screen_addEventListener_Callback";
-
-Native_Screen_dispatchEvent_Callback(mthis, event) native "Screen_dispatchEvent_Callback";
-
-Native_Screen_removeEventListener_Callback(mthis, type, listener, useCapture) native "Screen_removeEventListener_Callback";
+Native_Screen_unlockOrientation_Callback(mthis) native "Screen_unlockOrientation_Callback_RESOLVER_STRING_0_";
 
 Native_ScriptProcessorNode_bufferSize_Getter(mthis) native "ScriptProcessorNode_bufferSize_Getter";
 
@@ -6764,35 +6598,35 @@
 
 Native_Selection_type_Getter(mthis) native "Selection_type_Getter";
 
-Native_Selection_addRange_Callback(mthis, range) native "Selection_addRange_Callback";
+Native_Selection_addRange_Callback(mthis, range) native "Selection_addRange_Callback_RESOLVER_STRING_1_Range";
 
-Native_Selection_collapse_Callback(mthis, node, index) native "Selection_collapse_Callback";
+Native_Selection_collapse_Callback(mthis, node, index) native "Selection_collapse_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Selection_collapseToEnd_Callback(mthis) native "Selection_collapseToEnd_Callback";
+Native_Selection_collapseToEnd_Callback(mthis) native "Selection_collapseToEnd_Callback_RESOLVER_STRING_0_";
 
-Native_Selection_collapseToStart_Callback(mthis) native "Selection_collapseToStart_Callback";
+Native_Selection_collapseToStart_Callback(mthis) native "Selection_collapseToStart_Callback_RESOLVER_STRING_0_";
 
-Native_Selection_containsNode_Callback(mthis, node, allowPartial) native "Selection_containsNode_Callback";
+Native_Selection_containsNode_Callback(mthis, node, allowPartial) native "Selection_containsNode_Callback_RESOLVER_STRING_2_Node_boolean";
 
-Native_Selection_deleteFromDocument_Callback(mthis) native "Selection_deleteFromDocument_Callback";
+Native_Selection_deleteFromDocument_Callback(mthis) native "Selection_deleteFromDocument_Callback_RESOLVER_STRING_0_";
 
-Native_Selection_empty_Callback(mthis) native "Selection_empty_Callback";
+Native_Selection_empty_Callback(mthis) native "Selection_empty_Callback_RESOLVER_STRING_0_";
 
-Native_Selection_extend_Callback(mthis, node, offset) native "Selection_extend_Callback";
+Native_Selection_extend_Callback(mthis, node, offset) native "Selection_extend_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Selection_getRangeAt_Callback(mthis, index) native "Selection_getRangeAt_Callback";
+Native_Selection_getRangeAt_Callback(mthis, index) native "Selection_getRangeAt_Callback_RESOLVER_STRING_1_long";
 
-Native_Selection_modify_Callback(mthis, alter, direction, granularity) native "Selection_modify_Callback";
+Native_Selection_modify_Callback(mthis, alter, direction, granularity) native "Selection_modify_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_Selection_removeAllRanges_Callback(mthis) native "Selection_removeAllRanges_Callback";
+Native_Selection_removeAllRanges_Callback(mthis) native "Selection_removeAllRanges_Callback_RESOLVER_STRING_0_";
 
-Native_Selection_selectAllChildren_Callback(mthis, node) native "Selection_selectAllChildren_Callback";
+Native_Selection_selectAllChildren_Callback(mthis, node) native "Selection_selectAllChildren_Callback_RESOLVER_STRING_1_Node";
 
-Native_Selection_setBaseAndExtent_Callback(mthis, baseNode, baseOffset, extentNode, extentOffset) native "Selection_setBaseAndExtent_Callback";
+Native_Selection_setBaseAndExtent_Callback(mthis, baseNode, baseOffset, extentNode, extentOffset) native "Selection_setBaseAndExtent_Callback_RESOLVER_STRING_4_Node_long_Node_long";
 
-Native_Selection_setPosition_Callback(mthis, node, offset) native "Selection_setPosition_Callback";
+Native_Selection_setPosition_Callback(mthis, node, offset) native "Selection_setPosition_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Selection_toString_Callback(mthis) native "Selection_toString_Callback";
+Native_Selection_toString_Callback(mthis) native "Selection_toString_Callback_RESOLVER_STRING_0_";
 
 Native_ShadowRoot_activeElement_Getter(mthis) native "ShadowRoot_activeElement_Getter";
 
@@ -6814,35 +6648,29 @@
 
 Native_ShadowRoot_styleSheets_Getter(mthis) native "ShadowRoot_styleSheets_Getter";
 
-Native_ShadowRoot_cloneNode_Callback(mthis, deep) native "ShadowRoot_cloneNode_Callback";
+Native_ShadowRoot_cloneNode_Callback(mthis, deep) native "ShadowRoot_cloneNode_Callback_RESOLVER_STRING_1_boolean";
 
-Native_ShadowRoot_elementFromPoint_Callback(mthis, x, y) native "ShadowRoot_elementFromPoint_Callback";
+Native_ShadowRoot_elementFromPoint_Callback(mthis, x, y) native "ShadowRoot_elementFromPoint_Callback_RESOLVER_STRING_2_long_long";
 
-Native_ShadowRoot_getElementById_Callback(mthis, elementId) native "ShadowRoot_getElementById_Callback";
+Native_ShadowRoot_getElementById_Callback(mthis, elementId) native "ShadowRoot_getElementById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ShadowRoot_getElementsByClassName_Callback(mthis, className) native "ShadowRoot_getElementsByClassName_Callback";
+Native_ShadowRoot_getElementsByClassName_Callback(mthis, className) native "ShadowRoot_getElementsByClassName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ShadowRoot_getElementsByTagName_Callback(mthis, tagName) native "ShadowRoot_getElementsByTagName_Callback";
+Native_ShadowRoot_getElementsByTagName_Callback(mthis, tagName) native "ShadowRoot_getElementsByTagName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ShadowRoot_getSelection_Callback(mthis) native "ShadowRoot_getSelection_Callback";
+Native_ShadowRoot_getSelection_Callback(mthis) native "ShadowRoot_getSelection_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_SharedWorker_SharedWorker(scriptURL, name) {
     return Native_SharedWorker__create_1constructorCallback(scriptURL, name);
   }
 
-Native_SharedWorker__create_1constructorCallback(scriptURL, name) native "SharedWorker__create_1constructorCallback";
+Native_SharedWorker__create_1constructorCallback(scriptURL, name) native "SharedWorker_constructorCallback_RESOLVER_STRING_2_DOMString_DOMString";
 
 Native_SharedWorker_port_Getter(mthis) native "SharedWorker_port_Getter";
 
 Native_SharedWorker_workerStart_Getter(mthis) native "SharedWorker_workerStart_Getter";
 
-Native_SharedWorker_addEventListener_Callback(mthis, type, listener, useCapture) native "SharedWorker_addEventListener_Callback";
-
-Native_SharedWorker_dispatchEvent_Callback(mthis, event) native "SharedWorker_dispatchEvent_Callback";
-
-Native_SharedWorker_removeEventListener_Callback(mthis, type, listener, useCapture) native "SharedWorker_removeEventListener_Callback";
-
 Native_SharedWorkerGlobalScope_name_Getter(mthis) native "SharedWorkerGlobalScope_name_Getter";
 
 Native_SourceBuffer_appendWindowEnd_Getter(mthis) native "SourceBuffer_appendWindowEnd_Getter";
@@ -6865,9 +6693,9 @@
 
 Native_SourceBuffer_updating_Getter(mthis) native "SourceBuffer_updating_Getter";
 
-Native_SourceBuffer_abort_Callback(mthis) native "SourceBuffer_abort_Callback";
+Native_SourceBuffer_abort_Callback(mthis) native "SourceBuffer_abort_Callback_RESOLVER_STRING_0_";
 
-Native_SourceBuffer_appendBuffer_Callback(mthis, data) native "SourceBuffer_appendBuffer_Callback";
+Native_SourceBuffer_appendBuffer_Callback(mthis, data) native "SourceBuffer_appendBuffer_Callback_RESOLVER_STRING_1_ArrayBuffer";
 
   // Generated overload resolver
 Native_SourceBuffer_appendStream(mthis, stream, maxSize) {
@@ -6879,31 +6707,19 @@
     return;
   }
 
-Native_SourceBuffer__appendStream_1_Callback(mthis, stream, maxSize) native "SourceBuffer__appendStream_1_Callback";
+Native_SourceBuffer__appendStream_1_Callback(mthis, stream, maxSize) native "SourceBuffer_appendStream_Callback_RESOLVER_STRING_2_Stream_unsigned long long";
 
-Native_SourceBuffer__appendStream_2_Callback(mthis, stream) native "SourceBuffer__appendStream_2_Callback";
+Native_SourceBuffer__appendStream_2_Callback(mthis, stream) native "SourceBuffer_appendStream_Callback_RESOLVER_STRING_1_Stream";
 
-Native_SourceBuffer_appendTypedData_Callback(mthis, data) native "SourceBuffer_appendTypedData_Callback";
+Native_SourceBuffer_appendTypedData_Callback(mthis, data) native "SourceBuffer_appendBuffer_Callback_RESOLVER_STRING_1_ArrayBufferView";
 
-Native_SourceBuffer_remove_Callback(mthis, start, end) native "SourceBuffer_remove_Callback";
-
-Native_SourceBuffer_addEventListener_Callback(mthis, type, listener, useCapture) native "SourceBuffer_addEventListener_Callback";
-
-Native_SourceBuffer_dispatchEvent_Callback(mthis, event) native "SourceBuffer_dispatchEvent_Callback";
-
-Native_SourceBuffer_removeEventListener_Callback(mthis, type, listener, useCapture) native "SourceBuffer_removeEventListener_Callback";
+Native_SourceBuffer_remove_Callback(mthis, start, end) native "SourceBuffer_remove_Callback_RESOLVER_STRING_2_double_double";
 
 Native_SourceBufferList_length_Getter(mthis) native "SourceBufferList_length_Getter";
 
-Native_SourceBufferList_NativeIndexed_Getter(mthis, index) native "SourceBufferList_item_Callback";
+Native_SourceBufferList_NativeIndexed_Getter(mthis, index) native "SourceBufferList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SourceBufferList_item_Callback(mthis, index) native "SourceBufferList_item_Callback";
-
-Native_SourceBufferList_addEventListener_Callback(mthis, type, listener, useCapture) native "SourceBufferList_addEventListener_Callback";
-
-Native_SourceBufferList_dispatchEvent_Callback(mthis, event) native "SourceBufferList_dispatchEvent_Callback";
-
-Native_SourceBufferList_removeEventListener_Callback(mthis, type, listener, useCapture) native "SourceBufferList_removeEventListener_Callback";
+Native_SourceBufferList_item_Callback(mthis, index) native "SourceBufferList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_SourceInfo_facing_Getter(mthis) native "SourceInfo_facing_Getter";
 
@@ -6918,7 +6734,7 @@
     return Native_SpeechGrammar__create_1constructorCallback();
   }
 
-Native_SpeechGrammar__create_1constructorCallback() native "SpeechGrammar__create_1constructorCallback";
+Native_SpeechGrammar__create_1constructorCallback() native "SpeechGrammar_constructorCallback_RESOLVER_STRING_0_";
 
 Native_SpeechGrammar_src_Getter(mthis) native "SpeechGrammar_src_Getter";
 
@@ -6933,11 +6749,11 @@
     return Native_SpeechGrammarList__create_1constructorCallback();
   }
 
-Native_SpeechGrammarList__create_1constructorCallback() native "SpeechGrammarList__create_1constructorCallback";
+Native_SpeechGrammarList__create_1constructorCallback() native "SpeechGrammarList_constructorCallback_RESOLVER_STRING_0_";
 
 Native_SpeechGrammarList_length_Getter(mthis) native "SpeechGrammarList_length_Getter";
 
-Native_SpeechGrammarList_NativeIndexed_Getter(mthis, index) native "SpeechGrammarList_item_Callback";
+Native_SpeechGrammarList_NativeIndexed_Getter(mthis, index) native "SpeechGrammarList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
   // Generated overload resolver
 Native_SpeechGrammarList_addFromString(mthis, string, weight) {
@@ -6949,9 +6765,9 @@
     return;
   }
 
-Native_SpeechGrammarList__addFromString_1_Callback(mthis, string, weight) native "SpeechGrammarList__addFromString_1_Callback";
+Native_SpeechGrammarList__addFromString_1_Callback(mthis, string, weight) native "SpeechGrammarList_addFromString_Callback_RESOLVER_STRING_2_DOMString_float";
 
-Native_SpeechGrammarList__addFromString_2_Callback(mthis, string) native "SpeechGrammarList__addFromString_2_Callback";
+Native_SpeechGrammarList__addFromString_2_Callback(mthis, string) native "SpeechGrammarList_addFromString_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
 Native_SpeechGrammarList_addFromUri(mthis, src, weight) {
@@ -6963,11 +6779,11 @@
     return;
   }
 
-Native_SpeechGrammarList__addFromUri_1_Callback(mthis, src, weight) native "SpeechGrammarList__addFromUri_1_Callback";
+Native_SpeechGrammarList__addFromUri_1_Callback(mthis, src, weight) native "SpeechGrammarList_addFromUri_Callback_RESOLVER_STRING_2_DOMString_float";
 
-Native_SpeechGrammarList__addFromUri_2_Callback(mthis, src) native "SpeechGrammarList__addFromUri_2_Callback";
+Native_SpeechGrammarList__addFromUri_2_Callback(mthis, src) native "SpeechGrammarList_addFromUri_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SpeechGrammarList_item_Callback(mthis, index) native "SpeechGrammarList_item_Callback";
+Native_SpeechGrammarList_item_Callback(mthis, index) native "SpeechGrammarList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_SpeechInputEvent_results_Getter(mthis) native "SpeechInputEvent_results_Getter";
 
@@ -6977,16 +6793,16 @@
 
 Native_SpeechInputResultList_length_Getter(mthis) native "SpeechInputResultList_length_Getter";
 
-Native_SpeechInputResultList_NativeIndexed_Getter(mthis, index) native "SpeechInputResultList_item_Callback";
+Native_SpeechInputResultList_NativeIndexed_Getter(mthis, index) native "SpeechInputResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SpeechInputResultList_item_Callback(mthis, index) native "SpeechInputResultList_item_Callback";
+Native_SpeechInputResultList_item_Callback(mthis, index) native "SpeechInputResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
   // Generated overload resolver
 Native_SpeechRecognition_SpeechRecognition() {
     return Native_SpeechRecognition__create_1constructorCallback();
   }
 
-Native_SpeechRecognition__create_1constructorCallback() native "SpeechRecognition__create_1constructorCallback";
+Native_SpeechRecognition__create_1constructorCallback() native "SpeechRecognition_constructorCallback_RESOLVER_STRING_0_";
 
 Native_SpeechRecognition_continuous_Getter(mthis) native "SpeechRecognition_continuous_Getter";
 
@@ -7008,17 +6824,11 @@
 
 Native_SpeechRecognition_maxAlternatives_Setter(mthis, value) native "SpeechRecognition_maxAlternatives_Setter";
 
-Native_SpeechRecognition_abort_Callback(mthis) native "SpeechRecognition_abort_Callback";
+Native_SpeechRecognition_abort_Callback(mthis) native "SpeechRecognition_abort_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechRecognition_start_Callback(mthis) native "SpeechRecognition_start_Callback";
+Native_SpeechRecognition_start_Callback(mthis) native "SpeechRecognition_start_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechRecognition_stop_Callback(mthis) native "SpeechRecognition_stop_Callback";
-
-Native_SpeechRecognition_addEventListener_Callback(mthis, type, listener, useCapture) native "SpeechRecognition_addEventListener_Callback";
-
-Native_SpeechRecognition_dispatchEvent_Callback(mthis, event) native "SpeechRecognition_dispatchEvent_Callback";
-
-Native_SpeechRecognition_removeEventListener_Callback(mthis, type, listener, useCapture) native "SpeechRecognition_removeEventListener_Callback";
+Native_SpeechRecognition_stop_Callback(mthis) native "SpeechRecognition_stop_Callback_RESOLVER_STRING_0_";
 
 Native_SpeechRecognitionAlternative_confidence_Getter(mthis) native "SpeechRecognitionAlternative_confidence_Getter";
 
@@ -7040,13 +6850,13 @@
 
 Native_SpeechRecognitionResult_length_Getter(mthis) native "SpeechRecognitionResult_length_Getter";
 
-Native_SpeechRecognitionResult_item_Callback(mthis, index) native "SpeechRecognitionResult_item_Callback";
+Native_SpeechRecognitionResult_item_Callback(mthis, index) native "SpeechRecognitionResult_item_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_SpeechRecognitionResultList_length_Getter(mthis) native "SpeechRecognitionResultList_length_Getter";
 
-Native_SpeechRecognitionResultList_NativeIndexed_Getter(mthis, index) native "SpeechRecognitionResultList_item_Callback";
+Native_SpeechRecognitionResultList_NativeIndexed_Getter(mthis, index) native "SpeechRecognitionResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SpeechRecognitionResultList_item_Callback(mthis, index) native "SpeechRecognitionResultList_item_Callback";
+Native_SpeechRecognitionResultList_item_Callback(mthis, index) native "SpeechRecognitionResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_SpeechSynthesis_paused_Getter(mthis) native "SpeechSynthesis_paused_Getter";
 
@@ -7054,21 +6864,15 @@
 
 Native_SpeechSynthesis_speaking_Getter(mthis) native "SpeechSynthesis_speaking_Getter";
 
-Native_SpeechSynthesis_cancel_Callback(mthis) native "SpeechSynthesis_cancel_Callback";
+Native_SpeechSynthesis_cancel_Callback(mthis) native "SpeechSynthesis_cancel_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechSynthesis_getVoices_Callback(mthis) native "SpeechSynthesis_getVoices_Callback";
+Native_SpeechSynthesis_getVoices_Callback(mthis) native "SpeechSynthesis_getVoices_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechSynthesis_pause_Callback(mthis) native "SpeechSynthesis_pause_Callback";
+Native_SpeechSynthesis_pause_Callback(mthis) native "SpeechSynthesis_pause_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechSynthesis_resume_Callback(mthis) native "SpeechSynthesis_resume_Callback";
+Native_SpeechSynthesis_resume_Callback(mthis) native "SpeechSynthesis_resume_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechSynthesis_speak_Callback(mthis, utterance) native "SpeechSynthesis_speak_Callback";
-
-Native_SpeechSynthesis_addEventListener_Callback(mthis, type, listener, useCapture) native "SpeechSynthesis_addEventListener_Callback";
-
-Native_SpeechSynthesis_dispatchEvent_Callback(mthis, event) native "SpeechSynthesis_dispatchEvent_Callback";
-
-Native_SpeechSynthesis_removeEventListener_Callback(mthis, type, listener, useCapture) native "SpeechSynthesis_removeEventListener_Callback";
+Native_SpeechSynthesis_speak_Callback(mthis, utterance) native "SpeechSynthesis_speak_Callback_RESOLVER_STRING_1_SpeechSynthesisUtterance";
 
 Native_SpeechSynthesisEvent_charIndex_Getter(mthis) native "SpeechSynthesisEvent_charIndex_Getter";
 
@@ -7081,7 +6885,7 @@
     return Native_SpeechSynthesisUtterance__create_1constructorCallback(text);
   }
 
-Native_SpeechSynthesisUtterance__create_1constructorCallback(text) native "SpeechSynthesisUtterance__create_1constructorCallback";
+Native_SpeechSynthesisUtterance__create_1constructorCallback(text) native "SpeechSynthesisUtterance_constructorCallback_RESOLVER_STRING_1_DOMString";
 
 Native_SpeechSynthesisUtterance_lang_Getter(mthis) native "SpeechSynthesisUtterance_lang_Getter";
 
@@ -7107,12 +6911,6 @@
 
 Native_SpeechSynthesisUtterance_volume_Setter(mthis, value) native "SpeechSynthesisUtterance_volume_Setter";
 
-Native_SpeechSynthesisUtterance_addEventListener_Callback(mthis, type, listener, useCapture) native "SpeechSynthesisUtterance_addEventListener_Callback";
-
-Native_SpeechSynthesisUtterance_dispatchEvent_Callback(mthis, event) native "SpeechSynthesisUtterance_dispatchEvent_Callback";
-
-Native_SpeechSynthesisUtterance_removeEventListener_Callback(mthis, type, listener, useCapture) native "SpeechSynthesisUtterance_removeEventListener_Callback";
-
 Native_SpeechSynthesisVoice_default_Getter(mthis) native "SpeechSynthesisVoice_default_Getter";
 
 Native_SpeechSynthesisVoice_lang_Getter(mthis) native "SpeechSynthesisVoice_lang_Getter";
@@ -7136,9 +6934,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Storage____delete___1_Callback(mthis, index_OR_name) native "Storage____delete___1_Callback";
+Native_Storage____delete___1_Callback(mthis, index_OR_name) native "Storage___delete___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Storage____delete___2_Callback(mthis, index_OR_name) native "Storage____delete___2_Callback";
+Native_Storage____delete___2_Callback(mthis, index_OR_name) native "Storage___delete___Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
 Native_Storage___getter__(mthis, index_OR_name) {
@@ -7151,9 +6949,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Storage____getter___1_Callback(mthis, index_OR_name) native "Storage____getter___1_Callback";
+Native_Storage____getter___1_Callback(mthis, index_OR_name) native "Storage___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Storage____getter___2_Callback(mthis, index_OR_name) native "Storage____getter___2_Callback";
+Native_Storage____getter___2_Callback(mthis, index_OR_name) native "Storage___getter___Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
 Native_Storage___setter__(mthis, index_OR_name, value) {
@@ -7168,19 +6966,19 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Storage____setter___1_Callback(mthis, index_OR_name, value) native "Storage____setter___1_Callback";
+Native_Storage____setter___1_Callback(mthis, index_OR_name, value) native "Storage___setter___Callback_RESOLVER_STRING_2_unsigned long_DOMString";
 
-Native_Storage____setter___2_Callback(mthis, index_OR_name, value) native "Storage____setter___2_Callback";
+Native_Storage____setter___2_Callback(mthis, index_OR_name, value) native "Storage___setter___Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Storage_clear_Callback(mthis) native "Storage_clear_Callback";
+Native_Storage_clear_Callback(mthis) native "Storage_clear_Callback_RESOLVER_STRING_0_";
 
-Native_Storage_getItem_Callback(mthis, key) native "Storage_getItem_Callback";
+Native_Storage_getItem_Callback(mthis, key) native "Storage_getItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Storage_key_Callback(mthis, index) native "Storage_key_Callback";
+Native_Storage_key_Callback(mthis, index) native "Storage_key_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Storage_removeItem_Callback(mthis, key) native "Storage_removeItem_Callback";
+Native_Storage_removeItem_Callback(mthis, key) native "Storage_removeItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Storage_setItem_Callback(mthis, key, data) native "Storage_setItem_Callback";
+Native_Storage_setItem_Callback(mthis, key, data) native "Storage_setItem_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
 Native_StorageEvent_key_Getter(mthis) native "StorageEvent_key_Getter";
 
@@ -7192,7 +6990,7 @@
 
 Native_StorageEvent_url_Getter(mthis) native "StorageEvent_url_Getter";
 
-Native_StorageEvent_initStorageEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg) native "StorageEvent_initStorageEvent_Callback";
+Native_StorageEvent_initStorageEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg) native "StorageEvent_initStorageEvent_Callback_RESOLVER_STRING_8_DOMString_boolean_boolean_DOMString_DOMString_DOMString_DOMString_Storage";
 
 Native_StorageInfo_quota_Getter(mthis) native "StorageInfo_quota_Getter";
 
@@ -7204,19 +7002,19 @@
 
 Native_StyleMedia_type_Getter(mthis) native "StyleMedia_type_Getter";
 
-Native_StyleMedia_matchMedium_Callback(mthis, mediaquery) native "StyleMedia_matchMedium_Callback";
+Native_StyleMedia_matchMedium_Callback(mthis, mediaquery) native "StyleMedia_matchMedium_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_StyleSheetList_length_Getter(mthis) native "StyleSheetList_length_Getter";
 
-Native_StyleSheetList_NativeIndexed_Getter(mthis, index) native "StyleSheetList_item_Callback";
+Native_StyleSheetList_NativeIndexed_Getter(mthis, index) native "StyleSheetList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_StyleSheetList___getter___Callback(mthis, name) native "StyleSheetList___getter___Callback";
+Native_StyleSheetList___getter___Callback(mthis, name) native "StyleSheetList___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_StyleSheetList_item_Callback(mthis, index) native "StyleSheetList_item_Callback";
+Native_StyleSheetList_item_Callback(mthis, index) native "StyleSheetList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_TextEvent_data_Getter(mthis) native "TextEvent_data_Getter";
 
-Native_TextEvent_initTextEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "TextEvent_initTextEvent_Callback";
+Native_TextEvent_initTextEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "TextEvent_initTextEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_Window_DOMString";
 
 Native_TextMetrics_width_Getter(mthis) native "TextMetrics_width_Getter";
 
@@ -7238,19 +7036,13 @@
 
 Native_TextTrack_regions_Getter(mthis) native "TextTrack_regions_Getter";
 
-Native_TextTrack_addCue_Callback(mthis, cue) native "TextTrack_addCue_Callback";
+Native_TextTrack_addCue_Callback(mthis, cue) native "TextTrack_addCue_Callback_RESOLVER_STRING_1_TextTrackCue";
 
-Native_TextTrack_addRegion_Callback(mthis, region) native "TextTrack_addRegion_Callback";
+Native_TextTrack_addRegion_Callback(mthis, region) native "TextTrack_addRegion_Callback_RESOLVER_STRING_1_VTTRegion";
 
-Native_TextTrack_removeCue_Callback(mthis, cue) native "TextTrack_removeCue_Callback";
+Native_TextTrack_removeCue_Callback(mthis, cue) native "TextTrack_removeCue_Callback_RESOLVER_STRING_1_TextTrackCue";
 
-Native_TextTrack_removeRegion_Callback(mthis, region) native "TextTrack_removeRegion_Callback";
-
-Native_TextTrack_addEventListener_Callback(mthis, type, listener, useCapture) native "TextTrack_addEventListener_Callback";
-
-Native_TextTrack_dispatchEvent_Callback(mthis, event) native "TextTrack_dispatchEvent_Callback";
-
-Native_TextTrack_removeEventListener_Callback(mthis, type, listener, useCapture) native "TextTrack_removeEventListener_Callback";
+Native_TextTrack_removeRegion_Callback(mthis, region) native "TextTrack_removeRegion_Callback_RESOLVER_STRING_1_VTTRegion";
 
 Native_TextTrackCue_endTime_Getter(mthis) native "TextTrackCue_endTime_Getter";
 
@@ -7270,41 +7062,29 @@
 
 Native_TextTrackCue_track_Getter(mthis) native "TextTrackCue_track_Getter";
 
-Native_TextTrackCue_addEventListener_Callback(mthis, type, listener, useCapture) native "TextTrackCue_addEventListener_Callback";
-
-Native_TextTrackCue_dispatchEvent_Callback(mthis, event) native "TextTrackCue_dispatchEvent_Callback";
-
-Native_TextTrackCue_removeEventListener_Callback(mthis, type, listener, useCapture) native "TextTrackCue_removeEventListener_Callback";
-
 Native_TextTrackCueList_length_Getter(mthis) native "TextTrackCueList_length_Getter";
 
-Native_TextTrackCueList_NativeIndexed_Getter(mthis, index) native "TextTrackCueList_item_Callback";
+Native_TextTrackCueList_NativeIndexed_Getter(mthis, index) native "TextTrackCueList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_TextTrackCueList_getCueById_Callback(mthis, id) native "TextTrackCueList_getCueById_Callback";
+Native_TextTrackCueList_getCueById_Callback(mthis, id) native "TextTrackCueList_getCueById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_TextTrackCueList_item_Callback(mthis, index) native "TextTrackCueList_item_Callback";
+Native_TextTrackCueList_item_Callback(mthis, index) native "TextTrackCueList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_TextTrackList_length_Getter(mthis) native "TextTrackList_length_Getter";
 
-Native_TextTrackList_NativeIndexed_Getter(mthis, index) native "TextTrackList_item_Callback";
+Native_TextTrackList_NativeIndexed_Getter(mthis, index) native "TextTrackList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_TextTrackList_getTrackById_Callback(mthis, id) native "TextTrackList_getTrackById_Callback";
+Native_TextTrackList_getTrackById_Callback(mthis, id) native "TextTrackList_getTrackById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_TextTrackList_item_Callback(mthis, index) native "TextTrackList_item_Callback";
-
-Native_TextTrackList_addEventListener_Callback(mthis, type, listener, useCapture) native "TextTrackList_addEventListener_Callback";
-
-Native_TextTrackList_dispatchEvent_Callback(mthis, event) native "TextTrackList_dispatchEvent_Callback";
-
-Native_TextTrackList_removeEventListener_Callback(mthis, type, listener, useCapture) native "TextTrackList_removeEventListener_Callback";
+Native_TextTrackList_item_Callback(mthis, index) native "TextTrackList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_TimeRanges_length_Getter(mthis) native "TimeRanges_length_Getter";
 
-Native_TimeRanges_end_Callback(mthis, index) native "TimeRanges_end_Callback";
+Native_TimeRanges_end_Callback(mthis, index) native "TimeRanges_end_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_TimeRanges_start_Callback(mthis, index) native "TimeRanges_start_Callback";
+Native_TimeRanges_start_Callback(mthis, index) native "TimeRanges_start_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Timeline_play_Callback(mthis, source) native "Timeline_play_Callback";
+Native_Timeline_play_Callback(mthis, source) native "Timeline_play_Callback_RESOLVER_STRING_1_TimedItem";
 
 Native_Timing_delay_Getter(mthis) native "Timing_delay_Getter";
 
@@ -7338,7 +7118,7 @@
 
 Native_Timing_playbackRate_Setter(mthis, value) native "Timing_playbackRate_Setter";
 
-Native_Timing___setter___Callback(mthis, name, duration) native "Timing___setter___Callback";
+Native_Timing___setter___Callback(mthis, name, duration) native "Timing___setter___Callback_RESOLVER_STRING_2_DOMString_double";
 
 Native_Touch_clientX_Getter(mthis) native "Touch_clientX_Getter";
 
@@ -7378,13 +7158,13 @@
 
 Native_TouchEvent_touches_Getter(mthis) native "TouchEvent_touches_Getter";
 
-Native_TouchEvent_initTouchEvent_Callback(mthis, touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey) native "TouchEvent_initTouchEvent_Callback";
+Native_TouchEvent_initTouchEvent_Callback(mthis, touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey) native "TouchEvent_initTouchEvent_Callback_RESOLVER_STRING_13_TouchList_TouchList_TouchList_DOMString_Window_long_long_long_long_boolean_boolean_boolean_boolean";
 
 Native_TouchList_length_Getter(mthis) native "TouchList_length_Getter";
 
-Native_TouchList_NativeIndexed_Getter(mthis, index) native "TouchList_item_Callback";
+Native_TouchList_NativeIndexed_Getter(mthis, index) native "TouchList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_TouchList_item_Callback(mthis, index) native "TouchList_item_Callback";
+Native_TouchList_item_Callback(mthis, index) native "TouchList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_TrackEvent_track_Getter(mthis) native "TrackEvent_track_Getter";
 
@@ -7404,19 +7184,19 @@
 
 Native_TreeWalker_whatToShow_Getter(mthis) native "TreeWalker_whatToShow_Getter";
 
-Native_TreeWalker_firstChild_Callback(mthis) native "TreeWalker_firstChild_Callback";
+Native_TreeWalker_firstChild_Callback(mthis) native "TreeWalker_firstChild_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_lastChild_Callback(mthis) native "TreeWalker_lastChild_Callback";
+Native_TreeWalker_lastChild_Callback(mthis) native "TreeWalker_lastChild_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_nextNode_Callback(mthis) native "TreeWalker_nextNode_Callback";
+Native_TreeWalker_nextNode_Callback(mthis) native "TreeWalker_nextNode_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_nextSibling_Callback(mthis) native "TreeWalker_nextSibling_Callback";
+Native_TreeWalker_nextSibling_Callback(mthis) native "TreeWalker_nextSibling_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_parentNode_Callback(mthis) native "TreeWalker_parentNode_Callback";
+Native_TreeWalker_parentNode_Callback(mthis) native "TreeWalker_parentNode_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_previousNode_Callback(mthis) native "TreeWalker_previousNode_Callback";
+Native_TreeWalker_previousNode_Callback(mthis) native "TreeWalker_previousNode_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_previousSibling_Callback(mthis) native "TreeWalker_previousSibling_Callback";
+Native_TreeWalker_previousSibling_Callback(mthis) native "TreeWalker_previousSibling_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_URL_createObjectUrl(blob_OR_source_OR_stream) {
@@ -7432,19 +7212,19 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_URL__createObjectURL_1_Callback(blob_OR_source_OR_stream) native "URL__createObjectURL_1_Callback";
+Native_URL__createObjectURL_1_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_Blob";
 
-Native_URL__createObjectURL_2_Callback(blob_OR_source_OR_stream) native "URL__createObjectURL_2_Callback";
+Native_URL__createObjectURL_2_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaStream";
 
-Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream) native "URL__createObjectURL_3_Callback";
+Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
 
-Native_URL_createObjectUrlFromBlob_Callback(blob) native "URL_createObjectUrlFromBlob_Callback";
+Native_URL_createObjectUrlFromBlob_Callback(blob) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_Blob";
 
-Native_URL_createObjectUrlFromSource_Callback(source) native "URL_createObjectUrlFromSource_Callback";
+Native_URL_createObjectUrlFromSource_Callback(source) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
 
-Native_URL_createObjectUrlFromStream_Callback(stream) native "URL_createObjectUrlFromStream_Callback";
+Native_URL_createObjectUrlFromStream_Callback(stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaStream";
 
-Native_URL_revokeObjectURL_Callback(url) native "URL_revokeObjectURL_Callback";
+Native_URL_revokeObjectURL_Callback(url) native "URL_revokeObjectURL_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_URL_hash_Getter(mthis) native "URL_hash_Getter";
 
@@ -7488,7 +7268,7 @@
 
 Native_URL_username_Setter(mthis, value) native "URL_username_Setter";
 
-Native_URL_toString_Callback(mthis) native "URL_toString_Callback";
+Native_URL_toString_Callback(mthis) native "URL_toString_Callback_RESOLVER_STRING_0_";
 
 Native_URLUtilsReadOnly_hash_Getter(mthis) native "URLUtilsReadOnly_hash_Getter";
 
@@ -7506,14 +7286,14 @@
 
 Native_URLUtilsReadOnly_search_Getter(mthis) native "URLUtilsReadOnly_search_Getter";
 
-Native_URLUtilsReadOnly_toString_Callback(mthis) native "URLUtilsReadOnly_toString_Callback";
+Native_URLUtilsReadOnly_toString_Callback(mthis) native "URLUtilsReadOnly_toString_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_VTTCue_VttCue(startTime, endTime, text) {
     return Native_VTTCue__create_1constructorCallback(startTime, endTime, text);
   }
 
-Native_VTTCue__create_1constructorCallback(startTime, endTime, text) native "VTTCue__create_1constructorCallback";
+Native_VTTCue__create_1constructorCallback(startTime, endTime, text) native "VTTCue_constructorCallback_RESOLVER_STRING_3_double_double_DOMString";
 
 Native_VTTCue_align_Getter(mthis) native "VTTCue_align_Getter";
 
@@ -7547,14 +7327,14 @@
 
 Native_VTTCue_vertical_Setter(mthis, value) native "VTTCue_vertical_Setter";
 
-Native_VTTCue_getCueAsHTML_Callback(mthis) native "VTTCue_getCueAsHTML_Callback";
+Native_VTTCue_getCueAsHTML_Callback(mthis) native "VTTCue_getCueAsHTML_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
 Native_VTTRegion_VttRegion() {
     return Native_VTTRegion__create_1constructorCallback();
   }
 
-Native_VTTRegion__create_1constructorCallback() native "VTTRegion__create_1constructorCallback";
+Native_VTTRegion__create_1constructorCallback() native "VTTRegion_constructorCallback_RESOLVER_STRING_0_";
 
 Native_VTTRegion_height_Getter(mthis) native "VTTRegion_height_Getter";
 
@@ -7592,9 +7372,9 @@
 
 Native_VTTRegionList_length_Getter(mthis) native "VTTRegionList_length_Getter";
 
-Native_VTTRegionList_getRegionById_Callback(mthis, id) native "VTTRegionList_getRegionById_Callback";
+Native_VTTRegionList_getRegionById_Callback(mthis, id) native "VTTRegionList_getRegionById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_VTTRegionList_item_Callback(mthis, index) native "VTTRegionList_item_Callback";
+Native_VTTRegionList_item_Callback(mthis, index) native "VTTRegionList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
 Native_ValidityState_badInput_Getter(mthis) native "ValidityState_badInput_Getter";
 
@@ -7668,43 +7448,43 @@
 
 Native_WebGLContextEvent_statusMessage_Getter(mthis) native "WebGLContextEvent_statusMessage_Getter";
 
-Native_WebGLDebugShaders_getTranslatedShaderSource_Callback(mthis, shader) native "WebGLDebugShaders_getTranslatedShaderSource_Callback";
+Native_WebGLDebugShaders_getTranslatedShaderSource_Callback(mthis, shader) native "WebGLDebugShaders_getTranslatedShaderSource_Callback_RESOLVER_STRING_1_WebGLShader";
 
-Native_WebGLDrawBuffers_drawBuffersWEBGL_Callback(mthis, buffers) native "WebGLDrawBuffers_drawBuffersWEBGL_Callback";
+Native_WebGLDrawBuffers_drawBuffersWEBGL_Callback(mthis, buffers) native "WebGLDrawBuffers_drawBuffersWEBGL_Callback_RESOLVER_STRING_1_sequence<GLenum>";
 
-Native_WebGLLoseContext_loseContext_Callback(mthis) native "WebGLLoseContext_loseContext_Callback";
+Native_WebGLLoseContext_loseContext_Callback(mthis) native "WebGLLoseContext_loseContext_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLLoseContext_restoreContext_Callback(mthis) native "WebGLLoseContext_restoreContext_Callback";
+Native_WebGLLoseContext_restoreContext_Callback(mthis) native "WebGLLoseContext_restoreContext_Callback_RESOLVER_STRING_0_";
 
 Native_WebGLRenderingContext_drawingBufferHeight_Getter(mthis) native "WebGLRenderingContext_drawingBufferHeight_Getter";
 
 Native_WebGLRenderingContext_drawingBufferWidth_Getter(mthis) native "WebGLRenderingContext_drawingBufferWidth_Getter";
 
-Native_WebGLRenderingContext_activeTexture_Callback(mthis, texture) native "WebGLRenderingContext_activeTexture_Callback";
+Native_WebGLRenderingContext_activeTexture_Callback(mthis, texture) native "WebGLRenderingContext_activeTexture_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_attachShader_Callback(mthis, program, shader) native "WebGLRenderingContext_attachShader_Callback";
+Native_WebGLRenderingContext_attachShader_Callback(mthis, program, shader) native "WebGLRenderingContext_attachShader_Callback_RESOLVER_STRING_2_WebGLProgram_WebGLShader";
 
-Native_WebGLRenderingContext_bindAttribLocation_Callback(mthis, program, index, name) native "WebGLRenderingContext_bindAttribLocation_Callback";
+Native_WebGLRenderingContext_bindAttribLocation_Callback(mthis, program, index, name) native "WebGLRenderingContext_bindAttribLocation_Callback_RESOLVER_STRING_3_WebGLProgram_unsigned long_DOMString";
 
-Native_WebGLRenderingContext_bindBuffer_Callback(mthis, target, buffer) native "WebGLRenderingContext_bindBuffer_Callback";
+Native_WebGLRenderingContext_bindBuffer_Callback(mthis, target, buffer) native "WebGLRenderingContext_bindBuffer_Callback_RESOLVER_STRING_2_unsigned long_WebGLBuffer";
 
-Native_WebGLRenderingContext_bindFramebuffer_Callback(mthis, target, framebuffer) native "WebGLRenderingContext_bindFramebuffer_Callback";
+Native_WebGLRenderingContext_bindFramebuffer_Callback(mthis, target, framebuffer) native "WebGLRenderingContext_bindFramebuffer_Callback_RESOLVER_STRING_2_unsigned long_WebGLFramebuffer";
 
-Native_WebGLRenderingContext_bindRenderbuffer_Callback(mthis, target, renderbuffer) native "WebGLRenderingContext_bindRenderbuffer_Callback";
+Native_WebGLRenderingContext_bindRenderbuffer_Callback(mthis, target, renderbuffer) native "WebGLRenderingContext_bindRenderbuffer_Callback_RESOLVER_STRING_2_unsigned long_WebGLRenderbuffer";
 
-Native_WebGLRenderingContext_bindTexture_Callback(mthis, target, texture) native "WebGLRenderingContext_bindTexture_Callback";
+Native_WebGLRenderingContext_bindTexture_Callback(mthis, target, texture) native "WebGLRenderingContext_bindTexture_Callback_RESOLVER_STRING_2_unsigned long_WebGLTexture";
 
-Native_WebGLRenderingContext_blendColor_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_blendColor_Callback";
+Native_WebGLRenderingContext_blendColor_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_blendColor_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_WebGLRenderingContext_blendEquation_Callback(mthis, mode) native "WebGLRenderingContext_blendEquation_Callback";
+Native_WebGLRenderingContext_blendEquation_Callback(mthis, mode) native "WebGLRenderingContext_blendEquation_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_blendEquationSeparate_Callback(mthis, modeRGB, modeAlpha) native "WebGLRenderingContext_blendEquationSeparate_Callback";
+Native_WebGLRenderingContext_blendEquationSeparate_Callback(mthis, modeRGB, modeAlpha) native "WebGLRenderingContext_blendEquationSeparate_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_blendFunc_Callback(mthis, sfactor, dfactor) native "WebGLRenderingContext_blendFunc_Callback";
+Native_WebGLRenderingContext_blendFunc_Callback(mthis, sfactor, dfactor) native "WebGLRenderingContext_blendFunc_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_blendFuncSeparate_Callback(mthis, srcRGB, dstRGB, srcAlpha, dstAlpha) native "WebGLRenderingContext_blendFuncSeparate_Callback";
+Native_WebGLRenderingContext_blendFuncSeparate_Callback(mthis, srcRGB, dstRGB, srcAlpha, dstAlpha) native "WebGLRenderingContext_blendFuncSeparate_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_bufferByteData_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferByteData_Callback";
+Native_WebGLRenderingContext_bufferByteData_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBuffer_unsigned long";
 
   // Generated overload resolver
 Native_WebGLRenderingContext_bufferData(mthis, target, data_OR_size, usage) {
@@ -7723,15 +7503,15 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebGLRenderingContext__bufferData_1_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_1_Callback";
+Native_WebGLRenderingContext__bufferData_1_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBufferView_unsigned long";
 
-Native_WebGLRenderingContext__bufferData_2_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_2_Callback";
+Native_WebGLRenderingContext__bufferData_2_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBuffer_unsigned long";
 
-Native_WebGLRenderingContext__bufferData_3_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_3_Callback";
+Native_WebGLRenderingContext__bufferData_3_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_long long_unsigned long";
 
-Native_WebGLRenderingContext_bufferDataTyped_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferDataTyped_Callback";
+Native_WebGLRenderingContext_bufferDataTyped_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBufferView_unsigned long";
 
-Native_WebGLRenderingContext_bufferSubByteData_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubByteData_Callback";
+Native_WebGLRenderingContext_bufferSubByteData_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBuffer";
 
   // Generated overload resolver
 Native_WebGLRenderingContext_bufferSubData(mthis, target, offset, data) {
@@ -7746,105 +7526,105 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebGLRenderingContext__bufferSubData_1_Callback(mthis, target, offset, data) native "WebGLRenderingContext__bufferSubData_1_Callback";
+Native_WebGLRenderingContext__bufferSubData_1_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBufferView";
 
-Native_WebGLRenderingContext__bufferSubData_2_Callback(mthis, target, offset, data) native "WebGLRenderingContext__bufferSubData_2_Callback";
+Native_WebGLRenderingContext__bufferSubData_2_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBuffer";
 
-Native_WebGLRenderingContext_bufferSubDataTyped_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubDataTyped_Callback";
+Native_WebGLRenderingContext_bufferSubDataTyped_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBufferView";
 
-Native_WebGLRenderingContext_checkFramebufferStatus_Callback(mthis, target) native "WebGLRenderingContext_checkFramebufferStatus_Callback";
+Native_WebGLRenderingContext_checkFramebufferStatus_Callback(mthis, target) native "WebGLRenderingContext_checkFramebufferStatus_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_clear_Callback(mthis, mask) native "WebGLRenderingContext_clear_Callback";
+Native_WebGLRenderingContext_clear_Callback(mthis, mask) native "WebGLRenderingContext_clear_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_clearColor_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_clearColor_Callback";
+Native_WebGLRenderingContext_clearColor_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_clearColor_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_WebGLRenderingContext_clearDepth_Callback(mthis, depth) native "WebGLRenderingContext_clearDepth_Callback";
+Native_WebGLRenderingContext_clearDepth_Callback(mthis, depth) native "WebGLRenderingContext_clearDepth_Callback_RESOLVER_STRING_1_float";
 
-Native_WebGLRenderingContext_clearStencil_Callback(mthis, s) native "WebGLRenderingContext_clearStencil_Callback";
+Native_WebGLRenderingContext_clearStencil_Callback(mthis, s) native "WebGLRenderingContext_clearStencil_Callback_RESOLVER_STRING_1_long";
 
-Native_WebGLRenderingContext_colorMask_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_colorMask_Callback";
+Native_WebGLRenderingContext_colorMask_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_colorMask_Callback_RESOLVER_STRING_4_boolean_boolean_boolean_boolean";
 
-Native_WebGLRenderingContext_compileShader_Callback(mthis, shader) native "WebGLRenderingContext_compileShader_Callback";
+Native_WebGLRenderingContext_compileShader_Callback(mthis, shader) native "WebGLRenderingContext_compileShader_Callback_RESOLVER_STRING_1_WebGLShader";
 
-Native_WebGLRenderingContext_compressedTexImage2D_Callback(mthis, target, level, internalformat, width, height, border, data) native "WebGLRenderingContext_compressedTexImage2D_Callback";
+Native_WebGLRenderingContext_compressedTexImage2D_Callback(mthis, target, level, internalformat, width, height, border, data) native "WebGLRenderingContext_compressedTexImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_unsigned long_long_long_long_ArrayBufferView";
 
-Native_WebGLRenderingContext_compressedTexSubImage2D_Callback(mthis, target, level, xoffset, yoffset, width, height, format, data) native "WebGLRenderingContext_compressedTexSubImage2D_Callback";
+Native_WebGLRenderingContext_compressedTexSubImage2D_Callback(mthis, target, level, xoffset, yoffset, width, height, format, data) native "WebGLRenderingContext_compressedTexSubImage2D_Callback_RESOLVER_STRING_8_unsigned long_long_long_long_long_long_unsigned long_ArrayBufferView";
 
-Native_WebGLRenderingContext_copyTexImage2D_Callback(mthis, target, level, internalformat, x, y, width, height, border) native "WebGLRenderingContext_copyTexImage2D_Callback";
+Native_WebGLRenderingContext_copyTexImage2D_Callback(mthis, target, level, internalformat, x, y, width, height, border) native "WebGLRenderingContext_copyTexImage2D_Callback_RESOLVER_STRING_8_unsigned long_long_unsigned long_long_long_long_long_long";
 
-Native_WebGLRenderingContext_copyTexSubImage2D_Callback(mthis, target, level, xoffset, yoffset, x, y, width, height) native "WebGLRenderingContext_copyTexSubImage2D_Callback";
+Native_WebGLRenderingContext_copyTexSubImage2D_Callback(mthis, target, level, xoffset, yoffset, x, y, width, height) native "WebGLRenderingContext_copyTexSubImage2D_Callback_RESOLVER_STRING_8_unsigned long_long_long_long_long_long_long_long";
 
-Native_WebGLRenderingContext_createBuffer_Callback(mthis) native "WebGLRenderingContext_createBuffer_Callback";
+Native_WebGLRenderingContext_createBuffer_Callback(mthis) native "WebGLRenderingContext_createBuffer_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_createFramebuffer_Callback(mthis) native "WebGLRenderingContext_createFramebuffer_Callback";
+Native_WebGLRenderingContext_createFramebuffer_Callback(mthis) native "WebGLRenderingContext_createFramebuffer_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_createProgram_Callback(mthis) native "WebGLRenderingContext_createProgram_Callback";
+Native_WebGLRenderingContext_createProgram_Callback(mthis) native "WebGLRenderingContext_createProgram_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_createRenderbuffer_Callback(mthis) native "WebGLRenderingContext_createRenderbuffer_Callback";
+Native_WebGLRenderingContext_createRenderbuffer_Callback(mthis) native "WebGLRenderingContext_createRenderbuffer_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_createShader_Callback(mthis, type) native "WebGLRenderingContext_createShader_Callback";
+Native_WebGLRenderingContext_createShader_Callback(mthis, type) native "WebGLRenderingContext_createShader_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_createTexture_Callback(mthis) native "WebGLRenderingContext_createTexture_Callback";
+Native_WebGLRenderingContext_createTexture_Callback(mthis) native "WebGLRenderingContext_createTexture_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_cullFace_Callback(mthis, mode) native "WebGLRenderingContext_cullFace_Callback";
+Native_WebGLRenderingContext_cullFace_Callback(mthis, mode) native "WebGLRenderingContext_cullFace_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_deleteBuffer_Callback(mthis, buffer) native "WebGLRenderingContext_deleteBuffer_Callback";
+Native_WebGLRenderingContext_deleteBuffer_Callback(mthis, buffer) native "WebGLRenderingContext_deleteBuffer_Callback_RESOLVER_STRING_1_WebGLBuffer";
 
-Native_WebGLRenderingContext_deleteFramebuffer_Callback(mthis, framebuffer) native "WebGLRenderingContext_deleteFramebuffer_Callback";
+Native_WebGLRenderingContext_deleteFramebuffer_Callback(mthis, framebuffer) native "WebGLRenderingContext_deleteFramebuffer_Callback_RESOLVER_STRING_1_WebGLFramebuffer";
 
-Native_WebGLRenderingContext_deleteProgram_Callback(mthis, program) native "WebGLRenderingContext_deleteProgram_Callback";
+Native_WebGLRenderingContext_deleteProgram_Callback(mthis, program) native "WebGLRenderingContext_deleteProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_deleteRenderbuffer_Callback(mthis, renderbuffer) native "WebGLRenderingContext_deleteRenderbuffer_Callback";
+Native_WebGLRenderingContext_deleteRenderbuffer_Callback(mthis, renderbuffer) native "WebGLRenderingContext_deleteRenderbuffer_Callback_RESOLVER_STRING_1_WebGLRenderbuffer";
 
-Native_WebGLRenderingContext_deleteShader_Callback(mthis, shader) native "WebGLRenderingContext_deleteShader_Callback";
+Native_WebGLRenderingContext_deleteShader_Callback(mthis, shader) native "WebGLRenderingContext_deleteShader_Callback_RESOLVER_STRING_1_WebGLShader";
 
-Native_WebGLRenderingContext_deleteTexture_Callback(mthis, texture) native "WebGLRenderingContext_deleteTexture_Callback";
+Native_WebGLRenderingContext_deleteTexture_Callback(mthis, texture) native "WebGLRenderingContext_deleteTexture_Callback_RESOLVER_STRING_1_WebGLTexture";
 
-Native_WebGLRenderingContext_depthFunc_Callback(mthis, func) native "WebGLRenderingContext_depthFunc_Callback";
+Native_WebGLRenderingContext_depthFunc_Callback(mthis, func) native "WebGLRenderingContext_depthFunc_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_depthMask_Callback(mthis, flag) native "WebGLRenderingContext_depthMask_Callback";
+Native_WebGLRenderingContext_depthMask_Callback(mthis, flag) native "WebGLRenderingContext_depthMask_Callback_RESOLVER_STRING_1_boolean";
 
-Native_WebGLRenderingContext_depthRange_Callback(mthis, zNear, zFar) native "WebGLRenderingContext_depthRange_Callback";
+Native_WebGLRenderingContext_depthRange_Callback(mthis, zNear, zFar) native "WebGLRenderingContext_depthRange_Callback_RESOLVER_STRING_2_float_float";
 
-Native_WebGLRenderingContext_detachShader_Callback(mthis, program, shader) native "WebGLRenderingContext_detachShader_Callback";
+Native_WebGLRenderingContext_detachShader_Callback(mthis, program, shader) native "WebGLRenderingContext_detachShader_Callback_RESOLVER_STRING_2_WebGLProgram_WebGLShader";
 
-Native_WebGLRenderingContext_disable_Callback(mthis, cap) native "WebGLRenderingContext_disable_Callback";
+Native_WebGLRenderingContext_disable_Callback(mthis, cap) native "WebGLRenderingContext_disable_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_disableVertexAttribArray_Callback(mthis, index) native "WebGLRenderingContext_disableVertexAttribArray_Callback";
+Native_WebGLRenderingContext_disableVertexAttribArray_Callback(mthis, index) native "WebGLRenderingContext_disableVertexAttribArray_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_drawArrays_Callback(mthis, mode, first, count) native "WebGLRenderingContext_drawArrays_Callback";
+Native_WebGLRenderingContext_drawArrays_Callback(mthis, mode, first, count) native "WebGLRenderingContext_drawArrays_Callback_RESOLVER_STRING_3_unsigned long_long_long";
 
-Native_WebGLRenderingContext_drawElements_Callback(mthis, mode, count, type, offset) native "WebGLRenderingContext_drawElements_Callback";
+Native_WebGLRenderingContext_drawElements_Callback(mthis, mode, count, type, offset) native "WebGLRenderingContext_drawElements_Callback_RESOLVER_STRING_4_unsigned long_long_unsigned long_long long";
 
-Native_WebGLRenderingContext_enable_Callback(mthis, cap) native "WebGLRenderingContext_enable_Callback";
+Native_WebGLRenderingContext_enable_Callback(mthis, cap) native "WebGLRenderingContext_enable_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_enableVertexAttribArray_Callback(mthis, index) native "WebGLRenderingContext_enableVertexAttribArray_Callback";
+Native_WebGLRenderingContext_enableVertexAttribArray_Callback(mthis, index) native "WebGLRenderingContext_enableVertexAttribArray_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_finish_Callback(mthis) native "WebGLRenderingContext_finish_Callback";
+Native_WebGLRenderingContext_finish_Callback(mthis) native "WebGLRenderingContext_finish_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_flush_Callback(mthis) native "WebGLRenderingContext_flush_Callback";
+Native_WebGLRenderingContext_flush_Callback(mthis) native "WebGLRenderingContext_flush_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_framebufferRenderbuffer_Callback(mthis, target, attachment, renderbuffertarget, renderbuffer) native "WebGLRenderingContext_framebufferRenderbuffer_Callback";
+Native_WebGLRenderingContext_framebufferRenderbuffer_Callback(mthis, target, attachment, renderbuffertarget, renderbuffer) native "WebGLRenderingContext_framebufferRenderbuffer_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_unsigned long_WebGLRenderbuffer";
 
-Native_WebGLRenderingContext_framebufferTexture2D_Callback(mthis, target, attachment, textarget, texture, level) native "WebGLRenderingContext_framebufferTexture2D_Callback";
+Native_WebGLRenderingContext_framebufferTexture2D_Callback(mthis, target, attachment, textarget, texture, level) native "WebGLRenderingContext_framebufferTexture2D_Callback_RESOLVER_STRING_5_unsigned long_unsigned long_unsigned long_WebGLTexture_long";
 
-Native_WebGLRenderingContext_frontFace_Callback(mthis, mode) native "WebGLRenderingContext_frontFace_Callback";
+Native_WebGLRenderingContext_frontFace_Callback(mthis, mode) native "WebGLRenderingContext_frontFace_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_generateMipmap_Callback(mthis, target) native "WebGLRenderingContext_generateMipmap_Callback";
+Native_WebGLRenderingContext_generateMipmap_Callback(mthis, target) native "WebGLRenderingContext_generateMipmap_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_getActiveAttrib_Callback(mthis, program, index) native "WebGLRenderingContext_getActiveAttrib_Callback";
+Native_WebGLRenderingContext_getActiveAttrib_Callback(mthis, program, index) native "WebGLRenderingContext_getActiveAttrib_Callback_RESOLVER_STRING_2_WebGLProgram_unsigned long";
 
-Native_WebGLRenderingContext_getActiveUniform_Callback(mthis, program, index) native "WebGLRenderingContext_getActiveUniform_Callback";
+Native_WebGLRenderingContext_getActiveUniform_Callback(mthis, program, index) native "WebGLRenderingContext_getActiveUniform_Callback_RESOLVER_STRING_2_WebGLProgram_unsigned long";
 
 Native_WebGLRenderingContext_getAttachedShaders_Callback(mthis, program) native "WebGLRenderingContext_getAttachedShaders_Callback";
 
-Native_WebGLRenderingContext_getAttribLocation_Callback(mthis, program, name) native "WebGLRenderingContext_getAttribLocation_Callback";
+Native_WebGLRenderingContext_getAttribLocation_Callback(mthis, program, name) native "WebGLRenderingContext_getAttribLocation_Callback_RESOLVER_STRING_2_WebGLProgram_DOMString";
 
 Native_WebGLRenderingContext_getBufferParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getBufferParameter_Callback";
 
-Native_WebGLRenderingContext_getContextAttributes_Callback(mthis) native "WebGLRenderingContext_getContextAttributes_Callback";
+Native_WebGLRenderingContext_getContextAttributes_Callback(mthis) native "WebGLRenderingContext_getContextAttributes_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_getError_Callback(mthis) native "WebGLRenderingContext_getError_Callback";
+Native_WebGLRenderingContext_getError_Callback(mthis) native "WebGLRenderingContext_getError_Callback_RESOLVER_STRING_0_";
 
 Native_WebGLRenderingContext_getExtension_Callback(mthis, name) native "WebGLRenderingContext_getExtension_Callback";
 
@@ -7852,19 +7632,19 @@
 
 Native_WebGLRenderingContext_getParameter_Callback(mthis, pname) native "WebGLRenderingContext_getParameter_Callback";
 
-Native_WebGLRenderingContext_getProgramInfoLog_Callback(mthis, program) native "WebGLRenderingContext_getProgramInfoLog_Callback";
+Native_WebGLRenderingContext_getProgramInfoLog_Callback(mthis, program) native "WebGLRenderingContext_getProgramInfoLog_Callback_RESOLVER_STRING_1_WebGLProgram";
 
 Native_WebGLRenderingContext_getProgramParameter_Callback(mthis, program, pname) native "WebGLRenderingContext_getProgramParameter_Callback";
 
 Native_WebGLRenderingContext_getRenderbufferParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
 
-Native_WebGLRenderingContext_getShaderInfoLog_Callback(mthis, shader) native "WebGLRenderingContext_getShaderInfoLog_Callback";
+Native_WebGLRenderingContext_getShaderInfoLog_Callback(mthis, shader) native "WebGLRenderingContext_getShaderInfoLog_Callback_RESOLVER_STRING_1_WebGLShader";
 
 Native_WebGLRenderingContext_getShaderParameter_Callback(mthis, shader, pname) native "WebGLRenderingContext_getShaderParameter_Callback";
 
-Native_WebGLRenderingContext_getShaderPrecisionFormat_Callback(mthis, shadertype, precisiontype) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";
+Native_WebGLRenderingContext_getShaderPrecisionFormat_Callback(mthis, shadertype, precisiontype) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_getShaderSource_Callback(mthis, shader) native "WebGLRenderingContext_getShaderSource_Callback";
+Native_WebGLRenderingContext_getShaderSource_Callback(mthis, shader) native "WebGLRenderingContext_getShaderSource_Callback_RESOLVER_STRING_1_WebGLShader";
 
 Native_WebGLRenderingContext_getSupportedExtensions_Callback(mthis) native "WebGLRenderingContext_getSupportedExtensions_Callback";
 
@@ -7872,59 +7652,59 @@
 
 Native_WebGLRenderingContext_getUniform_Callback(mthis, program, location) native "WebGLRenderingContext_getUniform_Callback";
 
-Native_WebGLRenderingContext_getUniformLocation_Callback(mthis, program, name) native "WebGLRenderingContext_getUniformLocation_Callback";
+Native_WebGLRenderingContext_getUniformLocation_Callback(mthis, program, name) native "WebGLRenderingContext_getUniformLocation_Callback_RESOLVER_STRING_2_WebGLProgram_DOMString";
 
 Native_WebGLRenderingContext_getVertexAttrib_Callback(mthis, index, pname) native "WebGLRenderingContext_getVertexAttrib_Callback";
 
-Native_WebGLRenderingContext_getVertexAttribOffset_Callback(mthis, index, pname) native "WebGLRenderingContext_getVertexAttribOffset_Callback";
+Native_WebGLRenderingContext_getVertexAttribOffset_Callback(mthis, index, pname) native "WebGLRenderingContext_getVertexAttribOffset_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_hint_Callback(mthis, target, mode) native "WebGLRenderingContext_hint_Callback";
+Native_WebGLRenderingContext_hint_Callback(mthis, target, mode) native "WebGLRenderingContext_hint_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_isBuffer_Callback(mthis, buffer) native "WebGLRenderingContext_isBuffer_Callback";
+Native_WebGLRenderingContext_isBuffer_Callback(mthis, buffer) native "WebGLRenderingContext_isBuffer_Callback_RESOLVER_STRING_1_WebGLBuffer";
 
-Native_WebGLRenderingContext_isContextLost_Callback(mthis) native "WebGLRenderingContext_isContextLost_Callback";
+Native_WebGLRenderingContext_isContextLost_Callback(mthis) native "WebGLRenderingContext_isContextLost_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_isEnabled_Callback(mthis, cap) native "WebGLRenderingContext_isEnabled_Callback";
+Native_WebGLRenderingContext_isEnabled_Callback(mthis, cap) native "WebGLRenderingContext_isEnabled_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_isFramebuffer_Callback(mthis, framebuffer) native "WebGLRenderingContext_isFramebuffer_Callback";
+Native_WebGLRenderingContext_isFramebuffer_Callback(mthis, framebuffer) native "WebGLRenderingContext_isFramebuffer_Callback_RESOLVER_STRING_1_WebGLFramebuffer";
 
-Native_WebGLRenderingContext_isProgram_Callback(mthis, program) native "WebGLRenderingContext_isProgram_Callback";
+Native_WebGLRenderingContext_isProgram_Callback(mthis, program) native "WebGLRenderingContext_isProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_isRenderbuffer_Callback(mthis, renderbuffer) native "WebGLRenderingContext_isRenderbuffer_Callback";
+Native_WebGLRenderingContext_isRenderbuffer_Callback(mthis, renderbuffer) native "WebGLRenderingContext_isRenderbuffer_Callback_RESOLVER_STRING_1_WebGLRenderbuffer";
 
-Native_WebGLRenderingContext_isShader_Callback(mthis, shader) native "WebGLRenderingContext_isShader_Callback";
+Native_WebGLRenderingContext_isShader_Callback(mthis, shader) native "WebGLRenderingContext_isShader_Callback_RESOLVER_STRING_1_WebGLShader";
 
-Native_WebGLRenderingContext_isTexture_Callback(mthis, texture) native "WebGLRenderingContext_isTexture_Callback";
+Native_WebGLRenderingContext_isTexture_Callback(mthis, texture) native "WebGLRenderingContext_isTexture_Callback_RESOLVER_STRING_1_WebGLTexture";
 
-Native_WebGLRenderingContext_lineWidth_Callback(mthis, width) native "WebGLRenderingContext_lineWidth_Callback";
+Native_WebGLRenderingContext_lineWidth_Callback(mthis, width) native "WebGLRenderingContext_lineWidth_Callback_RESOLVER_STRING_1_float";
 
-Native_WebGLRenderingContext_linkProgram_Callback(mthis, program) native "WebGLRenderingContext_linkProgram_Callback";
+Native_WebGLRenderingContext_linkProgram_Callback(mthis, program) native "WebGLRenderingContext_linkProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_pixelStorei_Callback(mthis, pname, param) native "WebGLRenderingContext_pixelStorei_Callback";
+Native_WebGLRenderingContext_pixelStorei_Callback(mthis, pname, param) native "WebGLRenderingContext_pixelStorei_Callback_RESOLVER_STRING_2_unsigned long_long";
 
-Native_WebGLRenderingContext_polygonOffset_Callback(mthis, factor, units) native "WebGLRenderingContext_polygonOffset_Callback";
+Native_WebGLRenderingContext_polygonOffset_Callback(mthis, factor, units) native "WebGLRenderingContext_polygonOffset_Callback_RESOLVER_STRING_2_float_float";
 
-Native_WebGLRenderingContext_readPixels_Callback(mthis, x, y, width, height, format, type, pixels) native "WebGLRenderingContext_readPixels_Callback";
+Native_WebGLRenderingContext_readPixels_Callback(mthis, x, y, width, height, format, type, pixels) native "WebGLRenderingContext_readPixels_Callback_RESOLVER_STRING_7_long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
 
-Native_WebGLRenderingContext_renderbufferStorage_Callback(mthis, target, internalformat, width, height) native "WebGLRenderingContext_renderbufferStorage_Callback";
+Native_WebGLRenderingContext_renderbufferStorage_Callback(mthis, target, internalformat, width, height) native "WebGLRenderingContext_renderbufferStorage_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_long_long";
 
-Native_WebGLRenderingContext_sampleCoverage_Callback(mthis, value, invert) native "WebGLRenderingContext_sampleCoverage_Callback";
+Native_WebGLRenderingContext_sampleCoverage_Callback(mthis, value, invert) native "WebGLRenderingContext_sampleCoverage_Callback_RESOLVER_STRING_2_float_boolean";
 
-Native_WebGLRenderingContext_scissor_Callback(mthis, x, y, width, height) native "WebGLRenderingContext_scissor_Callback";
+Native_WebGLRenderingContext_scissor_Callback(mthis, x, y, width, height) native "WebGLRenderingContext_scissor_Callback_RESOLVER_STRING_4_long_long_long_long";
 
-Native_WebGLRenderingContext_shaderSource_Callback(mthis, shader, string) native "WebGLRenderingContext_shaderSource_Callback";
+Native_WebGLRenderingContext_shaderSource_Callback(mthis, shader, string) native "WebGLRenderingContext_shaderSource_Callback_RESOLVER_STRING_2_WebGLShader_DOMString";
 
-Native_WebGLRenderingContext_stencilFunc_Callback(mthis, func, ref, mask) native "WebGLRenderingContext_stencilFunc_Callback";
+Native_WebGLRenderingContext_stencilFunc_Callback(mthis, func, ref, mask) native "WebGLRenderingContext_stencilFunc_Callback_RESOLVER_STRING_3_unsigned long_long_unsigned long";
 
-Native_WebGLRenderingContext_stencilFuncSeparate_Callback(mthis, face, func, ref, mask) native "WebGLRenderingContext_stencilFuncSeparate_Callback";
+Native_WebGLRenderingContext_stencilFuncSeparate_Callback(mthis, face, func, ref, mask) native "WebGLRenderingContext_stencilFuncSeparate_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_long_unsigned long";
 
-Native_WebGLRenderingContext_stencilMask_Callback(mthis, mask) native "WebGLRenderingContext_stencilMask_Callback";
+Native_WebGLRenderingContext_stencilMask_Callback(mthis, mask) native "WebGLRenderingContext_stencilMask_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_stencilMaskSeparate_Callback(mthis, face, mask) native "WebGLRenderingContext_stencilMaskSeparate_Callback";
+Native_WebGLRenderingContext_stencilMaskSeparate_Callback(mthis, face, mask) native "WebGLRenderingContext_stencilMaskSeparate_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_stencilOp_Callback(mthis, fail, zfail, zpass) native "WebGLRenderingContext_stencilOp_Callback";
+Native_WebGLRenderingContext_stencilOp_Callback(mthis, fail, zfail, zpass) native "WebGLRenderingContext_stencilOp_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_stencilOpSeparate_Callback(mthis, face, fail, zfail, zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback";
+Native_WebGLRenderingContext_stencilOpSeparate_Callback(mthis, face, fail, zfail, zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_unsigned long_unsigned long";
 
   // Generated overload resolver
 Native_WebGLRenderingContext_texImage2D(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) {
@@ -7951,27 +7731,27 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebGLRenderingContext__texImage2D_1_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext__texImage2D_1_Callback";
+Native_WebGLRenderingContext__texImage2D_1_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_9_unsigned long_long_unsigned long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
 
-Native_WebGLRenderingContext__texImage2D_2_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_2_Callback";
+Native_WebGLRenderingContext__texImage2D_2_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_ImageData";
 
-Native_WebGLRenderingContext__texImage2D_3_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_3_Callback";
+Native_WebGLRenderingContext__texImage2D_3_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLImageElement";
 
-Native_WebGLRenderingContext__texImage2D_4_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_4_Callback";
+Native_WebGLRenderingContext__texImage2D_4_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLCanvasElement";
 
-Native_WebGLRenderingContext__texImage2D_5_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_5_Callback";
+Native_WebGLRenderingContext__texImage2D_5_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLVideoElement";
 
-Native_WebGLRenderingContext_texImage2DCanvas_Callback(mthis, target, level, internalformat, format, type, canvas) native "WebGLRenderingContext_texImage2DCanvas_Callback";
+Native_WebGLRenderingContext_texImage2DCanvas_Callback(mthis, target, level, internalformat, format, type, canvas) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLCanvasElement";
 
-Native_WebGLRenderingContext_texImage2DImage_Callback(mthis, target, level, internalformat, format, type, image) native "WebGLRenderingContext_texImage2DImage_Callback";
+Native_WebGLRenderingContext_texImage2DImage_Callback(mthis, target, level, internalformat, format, type, image) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLImageElement";
 
-Native_WebGLRenderingContext_texImage2DImageData_Callback(mthis, target, level, internalformat, format, type, pixels) native "WebGLRenderingContext_texImage2DImageData_Callback";
+Native_WebGLRenderingContext_texImage2DImageData_Callback(mthis, target, level, internalformat, format, type, pixels) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_ImageData";
 
-Native_WebGLRenderingContext_texImage2DVideo_Callback(mthis, target, level, internalformat, format, type, video) native "WebGLRenderingContext_texImage2DVideo_Callback";
+Native_WebGLRenderingContext_texImage2DVideo_Callback(mthis, target, level, internalformat, format, type, video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLVideoElement";
 
-Native_WebGLRenderingContext_texParameterf_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameterf_Callback";
+Native_WebGLRenderingContext_texParameterf_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameterf_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_float";
 
-Native_WebGLRenderingContext_texParameteri_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameteri_Callback";
+Native_WebGLRenderingContext_texParameteri_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameteri_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_long";
 
   // Generated overload resolver
 Native_WebGLRenderingContext_texSubImage2D(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) {
@@ -7998,53 +7778,53 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebGLRenderingContext__texSubImage2D_1_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext__texSubImage2D_1_Callback";
+Native_WebGLRenderingContext__texSubImage2D_1_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_9_unsigned long_long_long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
 
-Native_WebGLRenderingContext__texSubImage2D_2_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_2_Callback";
+Native_WebGLRenderingContext__texSubImage2D_2_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_ImageData";
 
-Native_WebGLRenderingContext__texSubImage2D_3_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_3_Callback";
+Native_WebGLRenderingContext__texSubImage2D_3_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLImageElement";
 
-Native_WebGLRenderingContext__texSubImage2D_4_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_4_Callback";
+Native_WebGLRenderingContext__texSubImage2D_4_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLCanvasElement";
 
-Native_WebGLRenderingContext__texSubImage2D_5_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_5_Callback";
+Native_WebGLRenderingContext__texSubImage2D_5_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLVideoElement";
 
-Native_WebGLRenderingContext_texSubImage2DCanvas_Callback(mthis, target, level, xoffset, yoffset, format, type, canvas) native "WebGLRenderingContext_texSubImage2DCanvas_Callback";
+Native_WebGLRenderingContext_texSubImage2DCanvas_Callback(mthis, target, level, xoffset, yoffset, format, type, canvas) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLCanvasElement";
 
-Native_WebGLRenderingContext_texSubImage2DImage_Callback(mthis, target, level, xoffset, yoffset, format, type, image) native "WebGLRenderingContext_texSubImage2DImage_Callback";
+Native_WebGLRenderingContext_texSubImage2DImage_Callback(mthis, target, level, xoffset, yoffset, format, type, image) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLImageElement";
 
-Native_WebGLRenderingContext_texSubImage2DImageData_Callback(mthis, target, level, xoffset, yoffset, format, type, pixels) native "WebGLRenderingContext_texSubImage2DImageData_Callback";
+Native_WebGLRenderingContext_texSubImage2DImageData_Callback(mthis, target, level, xoffset, yoffset, format, type, pixels) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_ImageData";
 
-Native_WebGLRenderingContext_texSubImage2DVideo_Callback(mthis, target, level, xoffset, yoffset, format, type, video) native "WebGLRenderingContext_texSubImage2DVideo_Callback";
+Native_WebGLRenderingContext_texSubImage2DVideo_Callback(mthis, target, level, xoffset, yoffset, format, type, video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLVideoElement";
 
-Native_WebGLRenderingContext_uniform1f_Callback(mthis, location, x) native "WebGLRenderingContext_uniform1f_Callback";
+Native_WebGLRenderingContext_uniform1f_Callback(mthis, location, x) native "WebGLRenderingContext_uniform1f_Callback_RESOLVER_STRING_2_WebGLUniformLocation_float";
 
 Native_WebGLRenderingContext_uniform1fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform1fv_Callback";
 
-Native_WebGLRenderingContext_uniform1i_Callback(mthis, location, x) native "WebGLRenderingContext_uniform1i_Callback";
+Native_WebGLRenderingContext_uniform1i_Callback(mthis, location, x) native "WebGLRenderingContext_uniform1i_Callback_RESOLVER_STRING_2_WebGLUniformLocation_long";
 
 Native_WebGLRenderingContext_uniform1iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform1iv_Callback";
 
-Native_WebGLRenderingContext_uniform2f_Callback(mthis, location, x, y) native "WebGLRenderingContext_uniform2f_Callback";
+Native_WebGLRenderingContext_uniform2f_Callback(mthis, location, x, y) native "WebGLRenderingContext_uniform2f_Callback_RESOLVER_STRING_3_WebGLUniformLocation_float_float";
 
 Native_WebGLRenderingContext_uniform2fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform2fv_Callback";
 
-Native_WebGLRenderingContext_uniform2i_Callback(mthis, location, x, y) native "WebGLRenderingContext_uniform2i_Callback";
+Native_WebGLRenderingContext_uniform2i_Callback(mthis, location, x, y) native "WebGLRenderingContext_uniform2i_Callback_RESOLVER_STRING_3_WebGLUniformLocation_long_long";
 
 Native_WebGLRenderingContext_uniform2iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform2iv_Callback";
 
-Native_WebGLRenderingContext_uniform3f_Callback(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3f_Callback";
+Native_WebGLRenderingContext_uniform3f_Callback(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3f_Callback_RESOLVER_STRING_4_WebGLUniformLocation_float_float_float";
 
 Native_WebGLRenderingContext_uniform3fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform3fv_Callback";
 
-Native_WebGLRenderingContext_uniform3i_Callback(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3i_Callback";
+Native_WebGLRenderingContext_uniform3i_Callback(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3i_Callback_RESOLVER_STRING_4_WebGLUniformLocation_long_long_long";
 
 Native_WebGLRenderingContext_uniform3iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform3iv_Callback";
 
-Native_WebGLRenderingContext_uniform4f_Callback(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4f_Callback";
+Native_WebGLRenderingContext_uniform4f_Callback(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4f_Callback_RESOLVER_STRING_5_WebGLUniformLocation_float_float_float_float";
 
 Native_WebGLRenderingContext_uniform4fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform4fv_Callback";
 
-Native_WebGLRenderingContext_uniform4i_Callback(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4i_Callback";
+Native_WebGLRenderingContext_uniform4i_Callback(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4i_Callback_RESOLVER_STRING_5_WebGLUniformLocation_long_long_long_long";
 
 Native_WebGLRenderingContext_uniform4iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform4iv_Callback";
 
@@ -8054,29 +7834,29 @@
 
 Native_WebGLRenderingContext_uniformMatrix4fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
 
-Native_WebGLRenderingContext_useProgram_Callback(mthis, program) native "WebGLRenderingContext_useProgram_Callback";
+Native_WebGLRenderingContext_useProgram_Callback(mthis, program) native "WebGLRenderingContext_useProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_validateProgram_Callback(mthis, program) native "WebGLRenderingContext_validateProgram_Callback";
+Native_WebGLRenderingContext_validateProgram_Callback(mthis, program) native "WebGLRenderingContext_validateProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_vertexAttrib1f_Callback(mthis, indx, x) native "WebGLRenderingContext_vertexAttrib1f_Callback";
+Native_WebGLRenderingContext_vertexAttrib1f_Callback(mthis, indx, x) native "WebGLRenderingContext_vertexAttrib1f_Callback_RESOLVER_STRING_2_unsigned long_float";
 
 Native_WebGLRenderingContext_vertexAttrib1fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
 
-Native_WebGLRenderingContext_vertexAttrib2f_Callback(mthis, indx, x, y) native "WebGLRenderingContext_vertexAttrib2f_Callback";
+Native_WebGLRenderingContext_vertexAttrib2f_Callback(mthis, indx, x, y) native "WebGLRenderingContext_vertexAttrib2f_Callback_RESOLVER_STRING_3_unsigned long_float_float";
 
 Native_WebGLRenderingContext_vertexAttrib2fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
 
-Native_WebGLRenderingContext_vertexAttrib3f_Callback(mthis, indx, x, y, z) native "WebGLRenderingContext_vertexAttrib3f_Callback";
+Native_WebGLRenderingContext_vertexAttrib3f_Callback(mthis, indx, x, y, z) native "WebGLRenderingContext_vertexAttrib3f_Callback_RESOLVER_STRING_4_unsigned long_float_float_float";
 
 Native_WebGLRenderingContext_vertexAttrib3fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
 
-Native_WebGLRenderingContext_vertexAttrib4f_Callback(mthis, indx, x, y, z, w) native "WebGLRenderingContext_vertexAttrib4f_Callback";
+Native_WebGLRenderingContext_vertexAttrib4f_Callback(mthis, indx, x, y, z, w) native "WebGLRenderingContext_vertexAttrib4f_Callback_RESOLVER_STRING_5_unsigned long_float_float_float_float";
 
 Native_WebGLRenderingContext_vertexAttrib4fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
 
-Native_WebGLRenderingContext_vertexAttribPointer_Callback(mthis, indx, size, type, normalized, stride, offset) native "WebGLRenderingContext_vertexAttribPointer_Callback";
+Native_WebGLRenderingContext_vertexAttribPointer_Callback(mthis, indx, size, type, normalized, stride, offset) native "WebGLRenderingContext_vertexAttribPointer_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_boolean_long_long long";
 
-Native_WebGLRenderingContext_viewport_Callback(mthis, x, y, width, height) native "WebGLRenderingContext_viewport_Callback";
+Native_WebGLRenderingContext_viewport_Callback(mthis, x, y, width, height) native "WebGLRenderingContext_viewport_Callback_RESOLVER_STRING_4_long_long_long_long";
 
 Native_WebGLShaderPrecisionFormat_precision_Getter(mthis) native "WebGLShaderPrecisionFormat_precision_Getter";
 
@@ -8095,14 +7875,14 @@
     return Native_WebKitCSSMatrix__create_1constructorCallback(cssValue);
   }
 
-Native_WebKitCSSMatrix__create_1constructorCallback(cssValue) native "WebKitCSSMatrix__create_1constructorCallback";
+Native_WebKitCSSMatrix__create_1constructorCallback(cssValue) native "WebKitCSSMatrix_constructorCallback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
 Native_WebKitMediaSource__WebKitMediaSource() {
     return Native_WebKitMediaSource__create_1constructorCallback();
   }
 
-Native_WebKitMediaSource__create_1constructorCallback() native "WebKitMediaSource__create_1constructorCallback";
+Native_WebKitMediaSource__create_1constructorCallback() native "WebKitMediaSource_constructorCallback_RESOLVER_STRING_0_";
 
 Native_WebKitPoint_constructorCallback(x, y) native "WebKitPoint_constructorCallback";
 
@@ -8114,7 +7894,7 @@
 
 Native_WebKitPoint_y_Setter(mthis, value) native "WebKitPoint_y_Setter";
 
-Native_WebKitSourceBufferList_item_Callback(mthis, index) native "WebKitSourceBufferList_item_Callback";
+Native_WebKitSourceBufferList_item_Callback(mthis, index) native "WebKitSourceBufferList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
   // Generated overload resolver
 Native_WebSocket_WebSocket(url, protocol_OR_protocols) {
@@ -8130,11 +7910,11 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebSocket__create_1constructorCallback(url) native "WebSocket__create_1constructorCallback";
+Native_WebSocket__create_1constructorCallback(url) native "WebSocket_constructorCallback_RESOLVER_STRING_1_DOMString";
 
-Native_WebSocket__create_2constructorCallback(url, protocol_OR_protocols) native "WebSocket__create_2constructorCallback";
+Native_WebSocket__create_2constructorCallback(url, protocol_OR_protocols) native "WebSocket_constructorCallback_RESOLVER_STRING_2_DOMString_sequence<DOMString>";
 
-Native_WebSocket__create_3constructorCallback(url, protocol_OR_protocols) native "WebSocket__create_3constructorCallback";
+Native_WebSocket__create_3constructorCallback(url, protocol_OR_protocols) native "WebSocket_constructorCallback_RESOLVER_STRING_2_DOMString_DOMString";
 
 Native_WebSocket_binaryType_Getter(mthis) native "WebSocket_binaryType_Getter";
 
@@ -8164,27 +7944,48 @@
     return;
   }
 
-Native_WebSocket__close_1_Callback(mthis, code, reason) native "WebSocket__close_1_Callback";
+Native_WebSocket__close_1_Callback(mthis, code, reason) native "WebSocket_close_Callback_RESOLVER_STRING_2_unsigned short_DOMString";
 
-Native_WebSocket__close_2_Callback(mthis, code) native "WebSocket__close_2_Callback";
+Native_WebSocket__close_2_Callback(mthis, code) native "WebSocket_close_Callback_RESOLVER_STRING_1_unsigned short";
 
-Native_WebSocket__close_3_Callback(mthis) native "WebSocket__close_3_Callback";
+Native_WebSocket__close_3_Callback(mthis) native "WebSocket_close_Callback_RESOLVER_STRING_0_";
 
-Native_WebSocket_send_Callback(mthis, data) native "WebSocket_send_Callback";
+  // Generated overload resolver
+Native_WebSocket_send(mthis, data) {
+    if ((data is TypedData || data == null)) {
+      Native_WebSocket__send_1_Callback(mthis, data);
+      return;
+    }
+    if ((data is ByteBuffer || data == null)) {
+      Native_WebSocket__send_2_Callback(mthis, data);
+      return;
+    }
+    if ((data is Blob || data == null)) {
+      Native_WebSocket__send_3_Callback(mthis, data);
+      return;
+    }
+    if ((data is String || data == null)) {
+      Native_WebSocket__send_4_Callback(mthis, data);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
 
-Native_WebSocket_sendBlob_Callback(mthis, data) native "WebSocket_sendBlob_Callback";
+Native_WebSocket__send_1_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
 
-Native_WebSocket_sendByteBuffer_Callback(mthis, data) native "WebSocket_sendByteBuffer_Callback";
+Native_WebSocket__send_2_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
 
-Native_WebSocket_sendString_Callback(mthis, data) native "WebSocket_sendString_Callback";
+Native_WebSocket__send_3_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_Blob";
 
-Native_WebSocket_sendTypedData_Callback(mthis, data) native "WebSocket_sendTypedData_Callback";
+Native_WebSocket__send_4_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WebSocket_addEventListener_Callback(mthis, type, listener, useCapture) native "WebSocket_addEventListener_Callback";
+Native_WebSocket_sendBlob_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_Blob";
 
-Native_WebSocket_dispatchEvent_Callback(mthis, event) native "WebSocket_dispatchEvent_Callback";
+Native_WebSocket_sendByteBuffer_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
 
-Native_WebSocket_removeEventListener_Callback(mthis, type, listener, useCapture) native "WebSocket_removeEventListener_Callback";
+Native_WebSocket_sendString_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_DOMString";
+
+Native_WebSocket_sendTypedData_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
 
 Native_WheelEvent_deltaMode_Getter(mthis) native "WheelEvent_deltaMode_Getter";
 
@@ -8200,7 +8001,7 @@
 
 Native_WheelEvent_wheelDeltaY_Getter(mthis) native "WheelEvent_wheelDeltaY_Getter";
 
-Native_WheelEvent_initWebKitWheelEvent_Callback(mthis, wheelDeltaX, wheelDeltaY, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey) native "WheelEvent_initWebKitWheelEvent_Callback";
+Native_WheelEvent_initWebKitWheelEvent_Callback(mthis, wheelDeltaX, wheelDeltaY, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey) native "WheelEvent_initWebKitWheelEvent_Callback_RESOLVER_STRING_11_long_long_Window_long_long_long_long_boolean_boolean_boolean_boolean";
 
 Native_Window_CSS_Getter(mthis) native "Window_CSS_Getter";
 
@@ -8313,79 +8114,73 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Window____getter___1_Callback(mthis, index_OR_name) native "Window____getter___1_Callback";
+Native_Window____getter___1_Callback(mthis, index_OR_name) native "Window___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Window____getter___2_Callback(mthis, index_OR_name) native "Window____getter___2_Callback";
+Native_Window____getter___2_Callback(mthis, index_OR_name) native "Window___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_alert_Callback(mthis, message) native "Window_alert_Callback";
+Native_Window_alert_Callback(mthis, message) native "Window_alert_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_cancelAnimationFrame_Callback(mthis, id) native "Window_cancelAnimationFrame_Callback";
+Native_Window_cancelAnimationFrame_Callback(mthis, id) native "Window_cancelAnimationFrame_Callback_RESOLVER_STRING_1_long";
 
-Native_Window_close_Callback(mthis) native "Window_close_Callback";
+Native_Window_close_Callback(mthis) native "Window_close_Callback_RESOLVER_STRING_0_";
 
-Native_Window_confirm_Callback(mthis, message) native "Window_confirm_Callback";
+Native_Window_confirm_Callback(mthis, message) native "Window_confirm_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_find_Callback(mthis, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog) native "Window_find_Callback";
+Native_Window_find_Callback(mthis, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog) native "Window_find_Callback_RESOLVER_STRING_7_DOMString_boolean_boolean_boolean_boolean_boolean_boolean";
 
-Native_Window_getComputedStyle_Callback(mthis, element, pseudoElement) native "Window_getComputedStyle_Callback";
+Native_Window_getComputedStyle_Callback(mthis, element, pseudoElement) native "Window_getComputedStyle_Callback_RESOLVER_STRING_2_Element_DOMString";
 
-Native_Window_getMatchedCSSRules_Callback(mthis, element, pseudoElement) native "Window_getMatchedCSSRules_Callback";
+Native_Window_getMatchedCSSRules_Callback(mthis, element, pseudoElement) native "Window_getMatchedCSSRules_Callback_RESOLVER_STRING_2_Element_DOMString";
 
-Native_Window_getSelection_Callback(mthis) native "Window_getSelection_Callback";
+Native_Window_getSelection_Callback(mthis) native "Window_getSelection_Callback_RESOLVER_STRING_0_";
 
-Native_Window_matchMedia_Callback(mthis, query) native "Window_matchMedia_Callback";
+Native_Window_matchMedia_Callback(mthis, query) native "Window_matchMedia_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_moveBy_Callback(mthis, x, y) native "Window_moveBy_Callback";
+Native_Window_moveBy_Callback(mthis, x, y) native "Window_moveBy_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Window_moveTo_Callback(mthis, x, y) native "Window_moveTo_Callback";
+Native_Window_moveTo_Callback(mthis, x, y) native "Window_moveTo_Callback_RESOLVER_STRING_2_float_float";
 
 Native_Window_open_Callback(mthis, url, name, options) native "Window_open_Callback";
 
-Native_Window_openDatabase_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "Window_openDatabase_Callback";
+Native_Window_openDatabase_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "Window_openDatabase_Callback_RESOLVER_STRING_5_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
 
 Native_Window_postMessage_Callback(mthis, message, targetOrigin, messagePorts) native "Window_postMessage_Callback";
 
-Native_Window_print_Callback(mthis) native "Window_print_Callback";
+Native_Window_print_Callback(mthis) native "Window_print_Callback_RESOLVER_STRING_0_";
 
-Native_Window_requestAnimationFrame_Callback(mthis, callback) native "Window_requestAnimationFrame_Callback";
+Native_Window_requestAnimationFrame_Callback(mthis, callback) native "Window_requestAnimationFrame_Callback_RESOLVER_STRING_1_RequestAnimationFrameCallback";
 
-Native_Window_resizeBy_Callback(mthis, x, y) native "Window_resizeBy_Callback";
+Native_Window_resizeBy_Callback(mthis, x, y) native "Window_resizeBy_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Window_resizeTo_Callback(mthis, width, height) native "Window_resizeTo_Callback";
+Native_Window_resizeTo_Callback(mthis, width, height) native "Window_resizeTo_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Window_scroll_Callback(mthis, x, y, scrollOptions) native "Window_scroll_Callback";
+Native_Window_scroll_Callback(mthis, x, y, scrollOptions) native "Window_scroll_Callback_RESOLVER_STRING_3_long_long_Dictionary";
 
-Native_Window_scrollBy_Callback(mthis, x, y, scrollOptions) native "Window_scrollBy_Callback";
+Native_Window_scrollBy_Callback(mthis, x, y, scrollOptions) native "Window_scrollBy_Callback_RESOLVER_STRING_3_long_long_Dictionary";
 
-Native_Window_scrollTo_Callback(mthis, x, y, scrollOptions) native "Window_scrollTo_Callback";
+Native_Window_scrollTo_Callback(mthis, x, y, scrollOptions) native "Window_scrollTo_Callback_RESOLVER_STRING_3_long_long_Dictionary";
 
 Native_Window_showModalDialog_Callback(mthis, url, dialogArgs, featureArgs) native "Window_showModalDialog_Callback";
 
-Native_Window_stop_Callback(mthis) native "Window_stop_Callback";
+Native_Window_stop_Callback(mthis) native "Window_stop_Callback_RESOLVER_STRING_0_";
 
 Native_Window_toString_Callback(mthis) native "Window_toString_Callback";
 
-Native_Window_webkitConvertPointFromNodeToPage_Callback(mthis, node, p) native "Window_webkitConvertPointFromNodeToPage_Callback";
+Native_Window_webkitConvertPointFromNodeToPage_Callback(mthis, node, p) native "Window_webkitConvertPointFromNodeToPage_Callback_RESOLVER_STRING_2_Node_WebKitPoint";
 
-Native_Window_webkitConvertPointFromPageToNode_Callback(mthis, node, p) native "Window_webkitConvertPointFromPageToNode_Callback";
+Native_Window_webkitConvertPointFromPageToNode_Callback(mthis, node, p) native "Window_webkitConvertPointFromPageToNode_Callback_RESOLVER_STRING_2_Node_WebKitPoint";
 
-Native_Window_webkitRequestFileSystem_Callback(mthis, type, size, successCallback, errorCallback) native "Window_webkitRequestFileSystem_Callback";
+Native_Window_webkitRequestFileSystem_Callback(mthis, type, size, successCallback, errorCallback) native "Window_webkitRequestFileSystem_Callback_RESOLVER_STRING_4_unsigned short_long long_FileSystemCallback_ErrorCallback";
 
-Native_Window_webkitResolveLocalFileSystemURL_Callback(mthis, url, successCallback, errorCallback) native "Window_webkitResolveLocalFileSystemURL_Callback";
+Native_Window_webkitResolveLocalFileSystemURL_Callback(mthis, url, successCallback, errorCallback) native "Window_webkitResolveLocalFileSystemURL_Callback_RESOLVER_STRING_3_DOMString_EntryCallback_ErrorCallback";
 
-Native_Window_addEventListener_Callback(mthis, type, listener, useCapture) native "Window_addEventListener_Callback";
+Native_Window_atob_Callback(mthis, string) native "Window_atob_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_dispatchEvent_Callback(mthis, event) native "Window_dispatchEvent_Callback";
+Native_Window_btoa_Callback(mthis, string) native "Window_btoa_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_removeEventListener_Callback(mthis, type, listener, useCapture) native "Window_removeEventListener_Callback";
+Native_Window_clearInterval_Callback(mthis, handle) native "Window_clearInterval_Callback_RESOLVER_STRING_1_long";
 
-Native_Window_atob_Callback(mthis, string) native "Window_atob_Callback";
-
-Native_Window_btoa_Callback(mthis, string) native "Window_btoa_Callback";
-
-Native_Window_clearInterval_Callback(mthis, handle) native "Window_clearInterval_Callback";
-
-Native_Window_clearTimeout_Callback(mthis, handle) native "Window_clearTimeout_Callback";
+Native_Window_clearTimeout_Callback(mthis, handle) native "Window_clearTimeout_Callback_RESOLVER_STRING_1_long";
 
 Native_Window_setInterval_Callback(mthis, handler, timeout) native "Window_setInterval_Callback";
 
@@ -8396,27 +8191,15 @@
     return Native_Worker__create_1constructorCallback(scriptUrl);
   }
 
-Native_Worker__create_1constructorCallback(scriptUrl) native "Worker__create_1constructorCallback";
+Native_Worker__create_1constructorCallback(scriptUrl) native "Worker_constructorCallback_RESOLVER_STRING_1_DOMString";
 
 Native_Worker_postMessage_Callback(mthis, message, messagePorts) native "Worker_postMessage_Callback";
 
-Native_Worker_terminate_Callback(mthis) native "Worker_terminate_Callback";
-
-Native_Worker_addEventListener_Callback(mthis, type, listener, useCapture) native "Worker_addEventListener_Callback";
-
-Native_Worker_dispatchEvent_Callback(mthis, event) native "Worker_dispatchEvent_Callback";
-
-Native_Worker_removeEventListener_Callback(mthis, type, listener, useCapture) native "Worker_removeEventListener_Callback";
+Native_Worker_terminate_Callback(mthis) native "Worker_terminate_Callback_RESOLVER_STRING_0_";
 
 Native_WorkerCrypto_getRandomValues_Callback(mthis, array) native "WorkerCrypto_getRandomValues_Callback";
 
-Native_WorkerPerformance_now_Callback(mthis) native "WorkerPerformance_now_Callback";
-
-Native_XMLHttpRequestEventTarget_addEventListener_Callback(mthis, type, listener, useCapture) native "XMLHttpRequestEventTarget_addEventListener_Callback";
-
-Native_XMLHttpRequestEventTarget_dispatchEvent_Callback(mthis, event) native "XMLHttpRequestEventTarget_dispatchEvent_Callback";
-
-Native_XMLHttpRequestEventTarget_removeEventListener_Callback(mthis, type, listener, useCapture) native "XMLHttpRequestEventTarget_removeEventListener_Callback";
+Native_WorkerPerformance_now_Callback(mthis) native "WorkerPerformance_now_Callback_RESOLVER_STRING_0_";
 
 Native_XMLHttpRequest_constructorCallback() native "XMLHttpRequest_constructorCallback";
 
@@ -8446,45 +8229,45 @@
 
 Native_XMLHttpRequest_withCredentials_Setter(mthis, value) native "XMLHttpRequest_withCredentials_Setter";
 
-Native_XMLHttpRequest_abort_Callback(mthis) native "XMLHttpRequest_abort_Callback";
+Native_XMLHttpRequest_abort_Callback(mthis) native "XMLHttpRequest_abort_Callback_RESOLVER_STRING_0_";
 
-Native_XMLHttpRequest_getAllResponseHeaders_Callback(mthis) native "XMLHttpRequest_getAllResponseHeaders_Callback";
+Native_XMLHttpRequest_getAllResponseHeaders_Callback(mthis) native "XMLHttpRequest_getAllResponseHeaders_Callback_RESOLVER_STRING_0_";
 
-Native_XMLHttpRequest_getResponseHeader_Callback(mthis, header) native "XMLHttpRequest_getResponseHeader_Callback";
+Native_XMLHttpRequest_getResponseHeader_Callback(mthis, header) native "XMLHttpRequest_getResponseHeader_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_XMLHttpRequest_open_Callback(mthis, method, url, async, user, password) native "XMLHttpRequest_open_Callback";
 
-Native_XMLHttpRequest_overrideMimeType_Callback(mthis, override) native "XMLHttpRequest_overrideMimeType_Callback";
+Native_XMLHttpRequest_overrideMimeType_Callback(mthis, override) native "XMLHttpRequest_overrideMimeType_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_XMLHttpRequest_send_Callback(mthis, data) native "XMLHttpRequest_send_Callback";
 
-Native_XMLHttpRequest_setRequestHeader_Callback(mthis, header, value) native "XMLHttpRequest_setRequestHeader_Callback";
+Native_XMLHttpRequest_setRequestHeader_Callback(mthis, header, value) native "XMLHttpRequest_setRequestHeader_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
   // Generated overload resolver
 Native_XMLSerializer_XmlSerializer() {
     return Native_XMLSerializer__create_1constructorCallback();
   }
 
-Native_XMLSerializer__create_1constructorCallback() native "XMLSerializer__create_1constructorCallback";
+Native_XMLSerializer__create_1constructorCallback() native "XMLSerializer_constructorCallback_RESOLVER_STRING_0_";
 
-Native_XMLSerializer_serializeToString_Callback(mthis, node) native "XMLSerializer_serializeToString_Callback";
+Native_XMLSerializer_serializeToString_Callback(mthis, node) native "XMLSerializer_serializeToString_Callback_RESOLVER_STRING_1_Node";
 
   // Generated overload resolver
 Native_XPathEvaluator_XPathEvaluator() {
     return Native_XPathEvaluator__create_1constructorCallback();
   }
 
-Native_XPathEvaluator__create_1constructorCallback() native "XPathEvaluator__create_1constructorCallback";
+Native_XPathEvaluator__create_1constructorCallback() native "XPathEvaluator_constructorCallback_RESOLVER_STRING_0_";
 
-Native_XPathEvaluator_createExpression_Callback(mthis, expression, resolver) native "XPathEvaluator_createExpression_Callback";
+Native_XPathEvaluator_createExpression_Callback(mthis, expression, resolver) native "XPathEvaluator_createExpression_Callback_RESOLVER_STRING_2_DOMString_XPathNSResolver";
 
-Native_XPathEvaluator_createNSResolver_Callback(mthis, nodeResolver) native "XPathEvaluator_createNSResolver_Callback";
+Native_XPathEvaluator_createNSResolver_Callback(mthis, nodeResolver) native "XPathEvaluator_createNSResolver_Callback_RESOLVER_STRING_1_Node";
 
-Native_XPathEvaluator_evaluate_Callback(mthis, expression, contextNode, resolver, type, inResult) native "XPathEvaluator_evaluate_Callback";
+Native_XPathEvaluator_evaluate_Callback(mthis, expression, contextNode, resolver, type, inResult) native "XPathEvaluator_evaluate_Callback_RESOLVER_STRING_5_DOMString_Node_XPathNSResolver_unsigned short_XPathResult";
 
-Native_XPathExpression_evaluate_Callback(mthis, contextNode, type, inResult) native "XPathExpression_evaluate_Callback";
+Native_XPathExpression_evaluate_Callback(mthis, contextNode, type, inResult) native "XPathExpression_evaluate_Callback_RESOLVER_STRING_3_Node_unsigned short_XPathResult";
 
-Native_XPathNSResolver_lookupNamespaceURI_Callback(mthis, prefix) native "XPathNSResolver_lookupNamespaceURI_Callback";
+Native_XPathNSResolver_lookupNamespaceURI_Callback(mthis, prefix) native "XPathNSResolver_lookupNamespaceURI_Callback_RESOLVER_STRING_1_DOMString";
 
 Native_XPathResult_booleanValue_Getter(mthis) native "XPathResult_booleanValue_Getter";
 
@@ -8500,34 +8283,51 @@
 
 Native_XPathResult_stringValue_Getter(mthis) native "XPathResult_stringValue_Getter";
 
-Native_XPathResult_iterateNext_Callback(mthis) native "XPathResult_iterateNext_Callback";
+Native_XPathResult_iterateNext_Callback(mthis) native "XPathResult_iterateNext_Callback_RESOLVER_STRING_0_";
 
-Native_XPathResult_snapshotItem_Callback(mthis, index) native "XPathResult_snapshotItem_Callback";
+Native_XPathResult_snapshotItem_Callback(mthis, index) native "XPathResult_snapshotItem_Callback_RESOLVER_STRING_1_unsigned long";
 
   // Generated overload resolver
 Native_XSLTProcessor_XsltProcessor() {
     return Native_XSLTProcessor__create_1constructorCallback();
   }
 
-Native_XSLTProcessor__create_1constructorCallback() native "XSLTProcessor__create_1constructorCallback";
+Native_XSLTProcessor__create_1constructorCallback() native "XSLTProcessor_constructorCallback_RESOLVER_STRING_0_";
 
-Native_XSLTProcessor_clearParameters_Callback(mthis) native "XSLTProcessor_clearParameters_Callback";
+Native_XSLTProcessor_clearParameters_Callback(mthis) native "XSLTProcessor_clearParameters_Callback_RESOLVER_STRING_0_";
 
 Native_XSLTProcessor_getParameter_Callback(mthis, namespaceURI, localName) native "XSLTProcessor_getParameter_Callback";
 
-Native_XSLTProcessor_importStylesheet_Callback(mthis, stylesheet) native "XSLTProcessor_importStylesheet_Callback";
+Native_XSLTProcessor_importStylesheet_Callback(mthis, stylesheet) native "XSLTProcessor_importStylesheet_Callback_RESOLVER_STRING_1_Node";
 
 Native_XSLTProcessor_removeParameter_Callback(mthis, namespaceURI, localName) native "XSLTProcessor_removeParameter_Callback";
 
-Native_XSLTProcessor_reset_Callback(mthis) native "XSLTProcessor_reset_Callback";
+Native_XSLTProcessor_reset_Callback(mthis) native "XSLTProcessor_reset_Callback_RESOLVER_STRING_0_";
 
 Native_XSLTProcessor_setParameter_Callback(mthis, namespaceURI, localName, value) native "XSLTProcessor_setParameter_Callback";
 
-Native_XSLTProcessor_transformToDocument_Callback(mthis, source) native "XSLTProcessor_transformToDocument_Callback";
+Native_XSLTProcessor_transformToDocument_Callback(mthis, source) native "XSLTProcessor_transformToDocument_Callback_RESOLVER_STRING_1_Node";
 
-Native_XSLTProcessor_transformToFragment_Callback(mthis, source, docVal) native "XSLTProcessor_transformToFragment_Callback";
+Native_XSLTProcessor_transformToFragment_Callback(mthis, source, docVal) native "XSLTProcessor_transformToFragment_Callback_RESOLVER_STRING_2_Node_Document";
 
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+
+// TODO(vsm): This should be moved out of this library.  Into dart:html?
+Type _getType(String key) {
+  // TODO(vsm): Add Cross Frame and JS types here as well.
+  if (htmlBlinkMap.containsKey(key))
+    return htmlBlinkMap[key];
+  if (indexed_dbBlinkMap.containsKey(key))
+    return indexed_dbBlinkMap[key];
+  if (web_audioBlinkMap.containsKey(key))
+    return web_audioBlinkMap[key];
+  if (web_glBlinkMap.containsKey(key))
+    return web_glBlinkMap[key];
+  if (web_sqlBlinkMap.containsKey(key))
+    return web_sqlBlinkMap[key];
+  if (svgBlinkMap.containsKey(key))
+    return svgBlinkMap[key];
+  return null;
+}// 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.
 
@@ -8547,32 +8347,32 @@
 
 Native_Utils_changeElementWrapper(element, type) native "Utils_changeElementWrapper";
 
-// _DOMWindowCrossFrame native entry points
-Native_DOMWindowCrossFrame_get_history(_DOMWindowCrossFrame) native "WindowCrossFrame_history_Getter";
+// FIXME: Return to using explicit cross frame entry points after roll to M35
+Native_DOMWindowCrossFrame_get_history(_DOMWindowCrossFrame) native "Window_history_cross_frame_Getter";
 
-Native_DOMWindowCrossFrame_get_location(_DOMWindowCrossFrame) native "WindowCrossFrame_location_Getter";
+Native_DOMWindowCrossFrame_get_location(_DOMWindowCrossFrame) native "Window_location_cross_frame_Getter";
 
-Native_DOMWindowCrossFrame_get_closed(_DOMWindowCrossFrame) native "WindowCrossFrame_closed_Getter";
+Native_DOMWindowCrossFrame_get_closed(_DOMWindowCrossFrame) native "Window_closed_Getter";
 
-Native_DOMWindowCrossFrame_get_opener(_DOMWindowCrossFrame) native "WindowCrossFrame_opener_Getter";
+Native_DOMWindowCrossFrame_get_opener(_DOMWindowCrossFrame) native "Window_opener_Getter";
 
-Native_DOMWindowCrossFrame_get_parent(_DOMWindowCrossFrame) native "WindowCrossFrame_parent_Getter";
+Native_DOMWindowCrossFrame_get_parent(_DOMWindowCrossFrame) native "Window_parent_Getter";
 
-Native_DOMWindowCrossFrame_get_top(_DOMWindowCrossFrame) native "WindowCrossFrame_top_Getter";
+Native_DOMWindowCrossFrame_get_top(_DOMWindowCrossFrame) native "Window_top_Getter";
 
-Native_DOMWindowCrossFrame_close(_DOMWindowCrossFrame) native "WindowCrossFrame_close_Callback";
+Native_DOMWindowCrossFrame_close(_DOMWindowCrossFrame) native "Window_close_Callback_RESOLVER_STRING_0_";
 
-Native_DOMWindowCrossFrame_postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "WindowCrossFrame_postMessage_Callback";
+Native_DOMWindowCrossFrame_postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "Window_postMessage_Callback";
 
 // _HistoryCrossFrame native entry points
-Native_HistoryCrossFrame_back(_HistoryCrossFrame) native "HistoryCrossFrame_back_Callback";
+Native_HistoryCrossFrame_back(_HistoryCrossFrame) native "History_back_Callback_RESOLVER_STRING_0_";
 
-Native_HistoryCrossFrame_forward(_HistoryCrossFrame) native "HistoryCrossFrame_forward_Callback";
+Native_HistoryCrossFrame_forward(_HistoryCrossFrame) native "History_forward_Callback_RESOLVER_STRING_0_";
 
-Native_HistoryCrossFrame_go(_HistoryCrossFrame, distance) native "HistoryCrossFrame_go_Callback";
+Native_HistoryCrossFrame_go(_HistoryCrossFrame, distance) native "History_go_Callback_RESOLVER_STRING_1_long";
 
 // _LocationCrossFrame native entry points
-Native_LocationCrossFrame_set_href(_LocationCrossFrame, h) native "LocationCrossFrame_href_Setter";
+Native_LocationCrossFrame_set_href(_LocationCrossFrame, h) native "Location_href_Setter";
 
 // _DOMStringMap native entry  points
 Native_DOMStringMap_containsKey(_DOMStringMap, key) native "DOMStringMap_containsKey_Callback";
diff --git a/sdk/lib/_internal/compiler/implementation/apiimpl.dart b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
index d54dc9a..9c6ba20 100644
--- a/sdk/lib/_internal/compiler/implementation/apiimpl.dart
+++ b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
@@ -160,6 +160,7 @@
    */
   Future<leg.Script> readScript(leg.Spannable node, Uri readableUri) {
     if (!readableUri.isAbsolute) {
+      if (node == null) node = leg.NO_LOCATION_SPANNABLE;
       internalError(node,
           'Relative uri $readableUri provided to readScript(Uri).');
     }
diff --git a/sdk/lib/_internal/compiler/implementation/closure.dart b/sdk/lib/_internal/compiler/implementation/closure.dart
index b94c1c0..73a2197 100644
--- a/sdk/lib/_internal/compiler/implementation/closure.dart
+++ b/sdk/lib/_internal/compiler/implementation/closure.dart
@@ -47,13 +47,13 @@
         return new ClosureClassMap(null, null, null,
             new ThisElement(element, compiler.types.dynamicType));
       } else {
-        assert(element.isField());
+        assert(element.isField);
         VariableElement field = element;
         if (field.initializer != null) {
           // The lazy initializer of a static.
           translator.translateLazyInitializer(element, node, field.initializer);
         } else {
-          assert(element.isInstanceMember());
+          assert(element.isInstanceMember);
           closureMappingCache[node] =
               new ClosureClassMap(null, null, null,
                   new ThisElement(element, compiler.types.dynamicType));
@@ -87,14 +87,20 @@
                       ClassElement enclosing)
       : super(name, ElementKind.FIELD, enclosing);
 
+  Node get node {
+    throw new SpannableAssertionFailure(
+        variableElement,
+        'Should not access node of ClosureFieldElement.');
+  }
+
   Expression get initializer {
     throw new SpannableAssertionFailure(
         variableElement,
         'Should not access initializer of ClosureFieldElement.');
   }
 
-  bool isInstanceMember() => true;
-  bool isAssignable() => false;
+  bool get isInstanceMember => true;
+  bool get isAssignable => false;
 
   DartType computeType(Compiler compiler) {
     return variableElement.type;
@@ -129,7 +135,7 @@
               // classes (since the emitter sorts classes by their id).
               compiler.getNextFreeClassId(),
               STATE_DONE) {
-    ClassElement superclass = methodElement.isInstanceMember()
+    ClassElement superclass = methodElement.isInstanceMember
         ? compiler.boundClosureClass
         : compiler.closureClass;
     superclass.ensureResolved(compiler);
@@ -141,9 +147,9 @@
     callType = methodElement.type;
   }
 
-  bool isClosure() => true;
+  bool get isClosure => true;
 
-  Token position() => node.getBeginToken();
+  Token get position => node.getBeginToken();
 
   Node parseNode(DiagnosticListener listener) => node;
 
@@ -155,7 +161,7 @@
   // A [ClosureClassElement] is nested inside a function or initializer in terms
   // of [enclosingElement], but still has to be treated as a top-level
   // element.
-  bool isTopLevel() => true;
+  bool get isTopLevel => true;
 
   get enclosingElement => methodElement;
 
@@ -203,13 +209,13 @@
   ThisElement(Element enclosing, this.type)
       : super('this', ElementKind.PARAMETER, enclosing);
 
-  bool isAssignable() => false;
+  bool get isAssignable => false;
 
   DartType computeType(Compiler compiler) => compiler.types.dynamicType;
 
   // Since there is no declaration corresponding to 'this', use the position of
   // the enclosing method.
-  Token position() => enclosingElement.position();
+  Token get position => enclosingElement.position;
 
   accept(ElementVisitor visitor) => visitor.visitThisElement(this);
 }
@@ -269,7 +275,7 @@
         this.capturingScopes = new Map<Node, ClosureScope>(),
         this.usedVariablesInTry = new Set<Element>();
 
-  bool isClosure() => closureElement != null;
+  bool get isClosure => closureElement != null;
 
   bool capturingScopesBox(Element element) {
     return capturingScopes.values.any((scope) {
@@ -279,7 +285,7 @@
 
   bool isVariableBoxed(Element element) {
     Element copy = freeVariableMapping[element];
-    if (copy != null && !copy.isMember()) return true;
+    if (copy != null && !copy.isMember) return true;
     return capturingScopesBox(element);
   }
 
@@ -382,7 +388,7 @@
         if (fromElement == updatedElement) {
           assert(freeVariableMapping[fromElement] == updatedElement);
           assert(Elements.isLocal(updatedElement)
-                 || updatedElement.isTypeVariable());
+                 || updatedElement.isTypeVariable);
           // The variable has not been boxed.
           fieldCaptures.add(updatedElement);
         } else {
@@ -482,20 +488,20 @@
   }
 
   visitTypeAnnotation(TypeAnnotation node) {
-    Element member = currentElement.getEnclosingMember();
+    Element member = currentElement.enclosingMember;
     DartType type = elements.getType(node);
     // TODO(karlklose,johnniwinther): if the type is null, the annotation is
     // from a parameter which has been analyzed before the method has been
     // resolved and the result has been thrown away.
     if (compiler.enableTypeAssertions && type != null &&
         type.containsTypeVariables) {
-      if (insideClosure && member.isFactoryConstructor()) {
+      if (insideClosure && member.isFactoryConstructor) {
         // This is a closure in a factory constructor.  Since there is no
         // [:this:], we have to mark the type arguments as free variables to
         // capture them in the closure.
         type.forEachTypeVariable((variable) => useLocal(variable.element));
       }
-      if (member.isInstanceMember() && !member.isField()) {
+      if (member.isInstanceMember && !member.isField) {
         // In checked mode, using a type variable in a type annotation may lead
         // to a runtime type check that needs to access the type argument and
         // therefore the closure needs a this-element, if it is not in a field
@@ -512,7 +518,7 @@
     } else {
       Element element = elements[node];
       if (element != null && element.kind == ElementKind.TYPE_VARIABLE) {
-        if (outermostElement.isConstructor()) {
+        if (outermostElement.isConstructor) {
           useLocal(element);
         } else {
           registerNeedsThis();
@@ -526,7 +532,7 @@
     Element element = elements[node];
     if (Elements.isLocal(element)) {
       useLocal(element);
-    } else if (element != null && element.isTypeVariable()) {
+    } else if (element != null && element.isTypeVariable) {
       TypeVariableElement variable = element;
       analyzeType(variable.type);
     } else if (node.receiver == null &&
@@ -573,8 +579,8 @@
     type.forEachTypeVariable((TypeVariableType typeVariable) {
       // Field initializers are inlined and access the type variable as
       // normal parameters.
-      if (!outermostElement.isField() &&
-          !outermostElement.isConstructor()) {
+      if (!outermostElement.isField &&
+          !outermostElement.isConstructor) {
         registerNeedsThis();
       } else {
         useLocal(typeVariable.element);
@@ -585,12 +591,12 @@
   void analyzeType(DartType type) {
     // TODO(johnniwinther): Find out why this can be null.
     if (type == null) return;
-    if (outermostElement.isMember() &&
-        compiler.backend.classNeedsRti(outermostElement.getEnclosingClass())) {
-      if (outermostElement.isConstructor() ||
-          outermostElement.isField()) {
+    if (outermostElement.isMember &&
+        compiler.backend.classNeedsRti(outermostElement.enclosingClass)) {
+      if (outermostElement.isConstructor ||
+          outermostElement.isField) {
         analyzeTypeVariables(type);
-      } else if (outermostElement.isInstanceMember()) {
+      } else if (outermostElement.isInstanceMember) {
         if (type.containsTypeVariables) {
           registerNeedsThis();
         }
@@ -607,7 +613,7 @@
     Map<Element, Element> scopeMapping = new Map<Element, Element>();
     for (Element element in scopeVariables) {
       // No need to box non-assignable elements.
-      if (!element.isAssignable()) continue;
+      if (!element.isAssignable) continue;
       if (!mutatedVariables.contains(element)) continue;
       if (capturedVariableMapping.containsKey(element)) {
         if (box == null) {
@@ -692,9 +698,9 @@
               || enclosingElement.kind == ElementKind.SETTER);
          enclosingElement = enclosingElement.enclosingElement) {
       // TODO(johnniwinther): Simplify computed names.
-      if (enclosingElement.isGenerativeConstructor() ||
-          enclosingElement.isGenerativeConstructorBody() ||
-          enclosingElement.isFactoryConstructor()) {
+      if (enclosingElement.isGenerativeConstructor ||
+          enclosingElement.isGenerativeConstructorBody ||
+          enclosingElement.isFactoryConstructor) {
         parts = parts.prepend(
             Elements.reconstructConstructorName(enclosingElement));
       } else {
@@ -715,7 +721,7 @@
                                    TypedElement element) {
     String closureName = computeClosureName(element);
     ClassElement globalizedElement = new ClosureClassElement(
-        node, closureName, compiler, element, element.getCompilationUnit());
+        node, closureName, compiler, element, element.compilationUnit);
     FunctionElement callElement =
         new SynthesizedCallMethodElementX(Compiler.CALL_OPERATOR_NAME,
                                           element,
@@ -743,7 +749,7 @@
     } else {
       outermostElement = element;
       Element thisElement = null;
-      if (element.isInstanceMember() || element.isGenerativeConstructor()) {
+      if (element.isInstanceMember || element.isGenerativeConstructor) {
         thisElement = new ThisElement(element, compiler.types.dynamicType);
       }
       closureData = new ClosureClassMap(null, null, null, thisElement);
@@ -763,7 +769,7 @@
         declareLocal(element);
       }
 
-      if (currentElement.isFactoryConstructor() &&
+      if (currentElement.isFactoryConstructor &&
           compiler.backend.classNeedsRti(currentElement.enclosingElement)) {
         // Declare the type parameters in the scope. Generative
         // constructors just use 'this'.
@@ -810,7 +816,7 @@
   visitFunctionExpression(FunctionExpression node) {
     Element element = elements[node];
 
-    if (element.isParameter()) {
+    if (element.isParameter) {
       // TODO(ahe): This is a hack. This method should *not* call
       // visitChildren.
       return node.name.accept(this);
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index 33576a4..c091eb2 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -106,9 +106,9 @@
       return result;
     }
     Element currentElement = element;
-    if (element.isParameter() ||
-        element.isFieldParameter() ||
-        element.isVariable()) {
+    if (element.isParameter ||
+        element.isFieldParameter ||
+        element.isVariable) {
       currentElement = element.enclosingElement;
     }
     return compiler.withCurrentElement(currentElement, () {
@@ -129,7 +129,7 @@
   Constant compileVariableWithDefinitions(VariableElement element,
                                           TreeElements definitions,
                                           {bool isConst: false}) {
-    Node node = element.parseNode(compiler);
+    Node node = element.node;
     if (pendingVariables.contains(element)) {
       if (isConst) {
         compiler.reportFatalError(
@@ -149,7 +149,7 @@
           initializer, definitions, isConst: isConst);
       if (compiler.enableTypeAssertions &&
           value != null &&
-          element.isField()) {
+          element.isField) {
         DartType elementType = element.type;
         if (elementType.kind == TypeKind.MALFORMED_TYPE && !value.isNull) {
           if (isConst) {
@@ -280,7 +280,7 @@
   }
 
   Constant visitLiteralList(LiteralList node) {
-    if (!node.isConst())  {
+    if (!node.isConst)  {
       return signalNotCompileTimeConstant(node);
     }
     List<Constant> arguments = <Constant>[];
@@ -294,7 +294,7 @@
   }
 
   Constant visitLiteralMap(LiteralMap node) {
-    if (!node.isConst()) {
+    if (!node.isConst) {
       return signalNotCompileTimeConstant(node);
     }
     List<Constant> keys = <Constant>[];
@@ -442,9 +442,9 @@
         return new FunctionConstant(element);
       } else if (Elements.isStaticOrTopLevelField(element)) {
         Constant result;
-        if (element.modifiers.isConst()) {
+        if (element.isConst) {
           result = handler.compileConstant(element);
-        } else if (element.modifiers.isFinal() && !isEvaluatingConstant) {
+        } else if (element.isFinal && !isEvaluatingConstant) {
           result = handler.compileVariable(element);
         }
         if (result != null) return result;
@@ -454,8 +454,8 @@
       } else if (send.receiver != null) {
         // Fall through to error handling.
       } else if (!Elements.isUnresolved(element)
-                 && element.isVariable()
-                 && element.modifiers.isConst()) {
+                 && element.isVariable
+                 && element.isConst) {
         Constant result = handler.compileConstant(element);
         if (result != null) return result;
       }
@@ -636,7 +636,7 @@
   }
 
   Constant visitNewExpression(NewExpression node) {
-    if (!node.isConst()) {
+    if (!node.isConst) {
       return signalNotCompileTimeConstant(node);
     }
 
@@ -738,14 +738,15 @@
   }
 
   Constant makeConstructedConstant(
-      Spannable node, InterfaceType type, FunctionElement constructor,
-      List<Constant> getArguments(FunctionElement constructor)) {
+      Spannable node, InterfaceType type, ConstructorElement constructor,
+      List<Constant> getArguments(ConstructorElement constructor)) {
     // The redirection chain of this element may not have been resolved through
     // a post-process action, so we have to make sure it is done here.
     compiler.resolver.resolveRedirectionChain(constructor, node);
-    InterfaceType constructedType = constructor.computeTargetType(type);
-    constructor = constructor.redirectionTarget;
-    ClassElement classElement = constructor.getEnclosingClass();
+    InterfaceType constructedType =
+        constructor.computeEffectiveTargetType(type);
+    constructor = constructor.effectiveTarget;
+    ClassElement classElement = constructor.enclosingClass;
     // The constructor must be an implementation to ensure that field
     // initializers are handled correctly.
     constructor = constructor.implementation;
@@ -849,9 +850,9 @@
     // Assign arguments to parameters.
     FunctionSignature signature = constructor.functionSignature;
     int index = 0;
-    signature.orderedForEachParameter((Element parameter) {
+    signature.orderedForEachParameter((ParameterElement parameter) {
       Constant argument = arguments[index++];
-      Node node = parameter.parseNode(compiler);
+      Node node = parameter.node;
       potentiallyCheckType(node, parameter, argument);
       definitions[parameter] = argument;
       if (parameter.kind == ElementKind.FIELD_PARAMETER) {
@@ -864,7 +865,7 @@
   void evaluateSuperOrRedirectSend(List<Constant> compiledArguments,
                                    FunctionElement targetConstructor) {
     ConstructorEvaluator evaluator = new ConstructorEvaluator(
-        constructedType.asInstanceOf(targetConstructor.getEnclosingClass()),
+        constructedType.asInstanceOf(targetConstructor.enclosingClass),
         targetConstructor, handler, compiler);
     evaluator.evaluateConstructorFieldValues(compiledArguments);
     // Copy over the fieldValues from the super/redirect-constructor.
@@ -893,7 +894,7 @@
       evaluateSuperOrRedirectSend(compiledArguments, target);
       return;
     }
-    FunctionExpression functionNode = constructor.parseNode(compiler);
+    FunctionExpression functionNode = constructor.node;
     NodeList initializerList = functionNode.initializers;
 
     bool foundSuperOrRedirect = false;
@@ -925,14 +926,14 @@
     if (!foundSuperOrRedirect) {
       // No super initializer found. Try to find the default constructor if
       // the class is not Object.
-      ClassElement enclosingClass = constructor.getEnclosingClass();
+      ClassElement enclosingClass = constructor.enclosingClass;
       ClassElement superClass = enclosingClass.superclass;
       if (enclosingClass != compiler.objectClass) {
         assert(superClass != null);
         assert(superClass.resolutionState == STATE_DONE);
 
         Selector selector =
-            new Selector.callDefaultConstructor(enclosingClass.getLibrary());
+            new Selector.callDefaultConstructor(enclosingClass.library);
 
         FunctionElement targetConstructor =
             superClass.lookupConstructor(selector);
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 4ab4f27..1c84e52 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -261,7 +261,7 @@
 
   bool isDefaultNoSuchMethodImplementation(Element element) {
     assert(element.name == Compiler.NO_SUCH_METHOD);
-    ClassElement classElement = element.getEnclosingClass();
+    ClassElement classElement = element.enclosingClass;
     return classElement == compiler.objectClass;
   }
 
@@ -433,7 +433,7 @@
 
   final bool suppressWarnings;
 
-  final api.CompilerOutputProvider outputProvider;
+  api.CompilerOutputProvider outputProvider;
 
   bool disableInlining = false;
 
@@ -772,7 +772,7 @@
     } else if (node is Element) {
       return spanFromElement(node);
     } else if (node is MetadataAnnotation) {
-      Uri uri = node.annotatedElement.getCompilationUnit().script.readableUri;
+      Uri uri = node.annotatedElement.compilationUnit.script.readableUri;
       return spanFromTokens(node.beginToken, node.endToken, uri);
     } else {
       throw 'No error location.';
@@ -972,7 +972,7 @@
   Element get unnamedListConstructor {
     if (_unnamedListConstructor != null) return _unnamedListConstructor;
     Selector callConstructor = new Selector.callConstructor(
-        "", listClass.getLibrary());
+        "", listClass.library);
     return _unnamedListConstructor =
         listClass.lookupConstructor(callConstructor);
   }
@@ -981,7 +981,7 @@
   Element get filledListConstructor {
     if (_filledListConstructor != null) return _filledListConstructor;
     Selector callConstructor = new Selector.callConstructor(
-        "filled", listClass.getLibrary());
+        "filled", listClass.library);
     return _filledListConstructor =
         listClass.lookupConstructor(callConstructor);
   }
@@ -1080,10 +1080,10 @@
                        "library."});
         }
       } else {
-        if (main.isErroneous()) {
+        if (main.isErroneous) {
           reportFatalError(main, MessageKind.GENERIC,
               {'text': "Cannot determine which '$MAIN' to use."});
-        } else if (!main.isFunction()) {
+        } else if (!main.isFunction) {
           reportFatalError(main, MessageKind.GENERIC,
               {'text': "'$MAIN' is not a function."});
         }
@@ -1209,7 +1209,7 @@
   }
 
   void fullyEnqueueTopLevelElement(Element element, Enqueuer world) {
-    if (element.isClass()) {
+    if (element.isClass) {
       ClassElement cls = element;
       cls.ensureResolved(this);
       cls.forEachLocalMember(enqueuer.resolution.addToWorkList);
@@ -1240,7 +1240,7 @@
         // TODO(ngeoffray, floitsch): we should also ensure that the
         // class IsolateMessage is instantiated. Currently, just enabling
         // isolate support works.
-        world.enableIsolateSupport(main.getLibrary());
+        world.enableIsolateSupport(main.library);
         world.registerInstantiatedClass(listClass, globalDependencies);
         world.registerInstantiatedClass(stringClass, globalDependencies);
       }
@@ -1273,22 +1273,22 @@
       resolved.remove(e);
     }
     for (Element e in new Set.from(resolved)) {
-      if (e.isClass() ||
-          e.isField() ||
-          e.isTypeVariable() ||
-          e.isTypedef() ||
+      if (e.isClass ||
+          e.isField ||
+          e.isTypeVariable ||
+          e.isTypedef ||
           identical(e.kind, ElementKind.ABSTRACT_FIELD)) {
         resolved.remove(e);
       }
       if (identical(e.kind, ElementKind.GENERATIVE_CONSTRUCTOR)) {
-        ClassElement enclosingClass = e.getEnclosingClass();
+        ClassElement enclosingClass = e.enclosingClass;
         resolved.remove(e);
 
       }
-      if (identical(e.getLibrary(), jsHelperLibrary)) {
+      if (identical(e.library, jsHelperLibrary)) {
         resolved.remove(e);
       }
-      if (identical(e.getLibrary(), interceptorsLibrary)) {
+      if (identical(e.library, interceptorsLibrary)) {
         resolved.remove(e);
       }
     }
@@ -1302,12 +1302,12 @@
 
   TreeElements analyzeElement(Element element) {
     assert(invariant(element,
-           element.impliesType() ||
-           element.isField() ||
-           element.isFunction() ||
-           element.isGenerativeConstructor() ||
-           element.isGetter() ||
-           element.isSetter(),
+           element.impliesType ||
+           element.isField ||
+           element.isFunction ||
+           element.isGenerativeConstructor ||
+           element.isGetter ||
+           element.isSetter,
            message: 'Unexpected element kind: ${element.kind}'));
     assert(invariant(element, element is AnalyzableElement,
         message: 'Element $element is not analyzable.'));
@@ -1460,7 +1460,7 @@
       throw 'Cannot find tokens to produce error message.';
     }
     if (uri == null && currentElement != null) {
-      uri = currentElement.getCompilationUnit().script.readableUri;
+      uri = currentElement.compilationUnit.script.readableUri;
     }
     return SourceSpan.withCharacterOffsets(begin, end,
       (beginOffset, endOffset) => new SourceSpan(uri, beginOffset, endOffset));
@@ -1474,9 +1474,9 @@
     if (Elements.isErroneousElement(element)) {
       element = element.enclosingElement;
     }
-    if (element.position() == null &&
-        !element.isLibrary() &&
-        !element.isCompilationUnit()) {
+    if (element.position == null &&
+        !element.isLibrary &&
+        !element.isCompilationUnit) {
       // Sometimes, the backend fakes up elements that have no
       // position. So we use the enclosing element instead. It is
       // not a good error location, but cancel really is "internal
@@ -1488,8 +1488,8 @@
     if (element == null) {
       element = currentElement;
     }
-    Token position = element.position();
-    Uri uri = element.getCompilationUnit().script.readableUri;
+    Token position = element.position;
+    Uri uri = element.compilationUnit.script.readableUri;
     return (position == null)
         ? new SourceSpan(uri, 0, 0)
         : spanFromTokens(position, position, uri);
@@ -1502,7 +1502,7 @@
     if (position == null) return spanFromElement(element);
     Token token = position.token;
     if (token == null) return spanFromElement(element);
-    Uri uri = element.getCompilationUnit().script.readableUri;
+    Uri uri = element.compilationUnit.script.readableUri;
     return spanFromTokens(token, token, uri);
   }
 
@@ -1576,19 +1576,19 @@
 
   void reportUnusedCode() {
     void checkLive(member) {
-      if (member.isFunction()) {
+      if (member.isFunction) {
         if (!enqueuer.resolution.isLive(member)) {
           reportHint(member, MessageKind.UNUSED_METHOD,
                      {'name': member.name});
         }
-      } else if (member.isClass()) {
+      } else if (member.isClass) {
         if (!member.isResolved) {
           reportHint(member, MessageKind.UNUSED_CLASS,
                      {'name': member.name});
         } else {
           member.forEachLocalMember(checkLive);
         }
-      } else if (member.isTypedef()) {
+      } else if (member.isTypedef) {
         if (!member.isResolved) {
           reportHint(member, MessageKind.UNUSED_TYPEDEF,
                      {'name': member.name});
@@ -1644,7 +1644,7 @@
       return true;
     }
     if (element == null) return false;
-    Uri libraryUri = element.getLibrary().canonicalUri;
+    Uri libraryUri = element.library.canonicalUri;
     if (libraryUri.scheme == 'package') {
       for (Uri uri in entrypoints) {
         if (uri.scheme != 'package') continue;
@@ -1675,7 +1675,7 @@
   /// the canonical URI of the library itself.
   Uri getCanonicalUri(Element element) {
     if (element == null) return null;
-    Uri libraryUri = element.getLibrary().canonicalUri;
+    Uri libraryUri = element.library.canonicalUri;
     if (libraryUri.scheme == 'package') {
       int slashPos = libraryUri.path.indexOf('/');
       if (slashPos != -1) {
diff --git a/sdk/lib/_internal/compiler/implementation/constants.dart b/sdk/lib/_internal/compiler/implementation/constants.dart
index ab9a45b..8fe7212 100644
--- a/sdk/lib/_internal/compiler/implementation/constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/constants.dart
@@ -18,6 +18,7 @@
   R visitType(TypeConstant constant);
   R visitInterceptor(InterceptorConstant constant);
   R visitDummy(DummyConstant constant);
+  R visitDeferred(DeferredConstant constant);
 }
 
 abstract class Constant {
@@ -652,3 +653,36 @@
     return sb.toString();
   }
 }
+
+/// A reference to a constant in another output unit.
+/// Used for referring to deferred constants.
+class DeferredConstant extends Constant {
+  DeferredConstant(this.referenced, this.prefix);
+
+  final Constant referenced;
+  final PrefixElement prefix;
+
+  bool get isReference => true;
+
+  bool operator ==(other) {
+    return other is DeferredConstant
+        && referenced == other.referenced
+        && prefix == other.prefix;
+  }
+
+  get hashCode => (referenced.hashCode * 17 + prefix.hashCode) & 0x3fffffff;
+
+  List<Constant> getDependencies() => <Constant>[referenced];
+
+  accept(ConstantVisitor visitor) => visitor.visitDeferred(this);
+
+  DartType computeType(Compiler compiler) => referenced.computeType(compiler);
+
+  ti.TypeMask computeMask(Compiler compiler) {
+    return referenced.computeMask(compiler);
+  }
+
+  String toString() {
+    return 'DeferredConstant($referenced)';
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
index 3821107..137bd26 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
@@ -21,6 +21,7 @@
          AnalyzableElement,
          DeferredLoaderGetterElementX,
          SynthesizedCallMethodElementX;
+import 'helpers/helpers.dart';
 import 'js_backend/js_backend.dart' as js_backend;
 import 'native_handler.dart' as native;
 import 'scanner/scannerlib.dart';
@@ -37,7 +38,7 @@
 import 'resolution/class_members.dart' show MembersCreator;
 import 'source_file.dart' show SourceFile;
 import 'js/js.dart' as js;
-import 'deferred_load.dart' show DeferredLoadTask;
+import 'deferred_load.dart' show DeferredLoadTask, OutputUnit;
 import 'mirrors_used.dart' show MirrorUsageAnalyzerTask;
 import 'dump_info.dart';
 import 'tracer.dart' show Tracer;
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index f5fbcae..bd61e85 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -154,12 +154,8 @@
     for (final library in compiler.libraries.values) {
       if (!library.isPlatformLibrary) continue;
       library.implementation.forEachLocalMember((Element element) {
-        if (element.isClass()) {
+        if (element.isClass) {
           ClassElement classElement = element;
-          // Make sure we parsed the class to initialize its local members.
-          // TODO(smok): Figure out if there is a better way to fill local
-          // members.
-          element.parseNode(compiler);
           classElement.forEachLocalMember((member) {
             final name = member.name;
             // Skip operator names.
@@ -179,7 +175,7 @@
       });
       for (Element export in library.exports) {
         if (!library.isInternalLibrary &&
-            export.getLibrary().isInternalLibrary) {
+            export.library.isInternalLibrary) {
           // If an element of an internal library is reexported by a platform
           // library, we have to import the reexporting library instead of the
           // internal library, because the internal library is an
@@ -191,7 +187,7 @@
     // As of now names of named optionals are not renamed. Therefore add all
     // field names used as named optionals into [fixedMemberNames].
     for (final element in resolvedElements.keys) {
-      if (!element.isConstructor()) continue;
+      if (!element.isConstructor) continue;
       Link<Element> optionalParameters =
           element.computeSignature(compiler).optionalParameters;
       for (final optional in optionalParameters) {
@@ -219,34 +215,31 @@
      * Object should not be in the resulting code.
      */
     bool shouldOutput(Element element) {
-      return (element.kind != ElementKind.VOID
-          && isUserLibrary(element.getLibrary())
+      return (isUserLibrary(element.library)
           && !element.isSynthesized
           && element is !AbstractFieldElement)
-          || element.getLibrary() == mirrorHelperLibrary;
+          || element.library == mirrorHelperLibrary;
     }
 
     final elementAsts = new Map<Element, ElementAst>();
 
-    ElementAst parse(Element element, TreeElements treeElements) {
+    ElementAst parse(AstElement element, TreeElements treeElements) {
       Node node;
       if (!compiler.irBuilder.hasIr(element)) {
-        node = element.parseNode(compiler);
+        node = element.node;
       } else {
         ir.FunctionDefinition function = compiler.irBuilder.getIr(element);
         tree.Builder builder = new tree.Builder(compiler);
         tree.FunctionDefinition definition = builder.build(function);
-        if (definition == null) {
-          node = element.parseNode(compiler);
-        } else {
-          compiler.tracer.traceCompilation(element.name, null, compiler);
-          compiler.tracer.traceGraph('Tree builder', definition);
-          treeElements = new TreeElementMapping(element);
-          tree.Unnamer unnamer = new tree.Unnamer();
-          unnamer.unname(definition);
-          compiler.tracer.traceGraph('Unnamer', definition);
-          node = dart_codegen.emit(element, treeElements, definition);
-        }
+        assert(definition != null);
+        compiler.tracer.traceCompilation(element.name, null, compiler);
+        compiler.tracer.traceGraph('Tree builder', definition);
+        treeElements = new TreeElementMapping(element);
+        new tree.StatementRewriter().rewrite(definition);
+        compiler.tracer.traceGraph('Statement rewriter', definition);
+        new tree.LogicalRewriter().rewrite(definition);
+        compiler.tracer.traceGraph('Logical rewriter', definition);
+        node = dart_codegen.emit(element, treeElements, definition);
       }
       return new ElementAst(node, treeElements);
     }
@@ -269,22 +262,22 @@
       elementAsts[element] = elementAst;
     }
 
-    addTopLevel(element, elementAst) {
+    addTopLevel(AstElement element, ElementAst elementAst) {
       if (topLevelElements.contains(element)) return;
       topLevelElements.add(element);
       processElement(element, elementAst);
     }
 
-    addClass(classElement) {
+    addClass(ClassElement classElement) {
       addTopLevel(classElement,
-                  new ElementAst(classElement.parseNode(compiler),
+                  new ElementAst(classElement.node,
                                  classElement.treeElements));
       classMembers.putIfAbsent(classElement, () => new Set());
     }
 
     newTypedefElementCallback = (TypedefElement element) {
       if (!shouldOutput(element)) return;
-      addTopLevel(element, new ElementAst(element.parseNode(compiler),
+      addTopLevel(element, new ElementAst(element.node,
                                           element.treeElements));
     };
     newClassElementCallback = (ClassElement classElement) {
@@ -300,16 +293,16 @@
       if (!shouldOutput(element) || treeElements == null) return;
       ElementAst elementAst = parse(element, treeElements);
 
-      if (element.isMember()) {
-        ClassElement enclosingClass = element.getEnclosingClass();
-        assert(enclosingClass.isClass());
-        assert(enclosingClass.isTopLevel());
+      if (element.isMember) {
+        ClassElement enclosingClass = element.enclosingClass;
+        assert(enclosingClass.isClass);
+        assert(enclosingClass.isTopLevel);
         assert(shouldOutput(enclosingClass));
         addClass(enclosingClass);
         classMembers[enclosingClass].add(element);
         processElement(element, elementAst);
       } else {
-        if (element.isTopLevel()) {
+        if (element.isTopLevel) {
           addTopLevel(element, elementAst);
         }
       }
@@ -335,20 +328,23 @@
     for (ClassElement classElement in classMembers.keys) {
       if (emitNoMembersFor.contains(classElement)) continue;
       for (Element member in classMembers[classElement]) {
-        if (member.isConstructor()) continue NextClassElement;
+        if (member.isConstructor) continue NextClassElement;
       }
       if (classElement.constructors.isEmpty) continue NextClassElement;
 
       // TODO(antonm): check with AAR team if there is better approach.
       // As an idea: provide template as a Dart code---class C { C.name(); }---
       // and then overwrite necessary parts.
-      var classNode = classElement.parseNode(compiler);
+      var classNode = classElement.node;
       SynthesizedConstructorElementX constructor =
           new SynthesizedConstructorElementX(
               classElement.name, null, classElement, false);
       constructor.typeCache =
-          new FunctionType(constructor, compiler.types.voidType);
-      constructor.cachedNode = new FunctionExpression(
+          new FunctionType(constructor, const VoidType());
+      if (!constructor.isSynthesized) {
+        classMembers[classElement].add(constructor);
+      }
+      FunctionExpression node = new FunctionExpression(
           new Send(classNode.name, synthesizedIdentifier),
           new NodeList(new StringToken.fromString(OPEN_PAREN_INFO, '(', -1),
                        const Link<Node>(),
@@ -357,11 +353,8 @@
               new StringToken.fromString(SEMICOLON_INFO, ';', -1)),
           null, Modifiers.EMPTY, null, null);
 
-      if (!constructor.isSynthesized) {
-        classMembers[classElement].add(constructor);
-      }
       elementAsts[constructor] =
-          new ElementAst(constructor.cachedNode, new TreeElementMapping(null));
+          new ElementAst(node, new TreeElementMapping(null));
     }
 
     // Create all necessary placeholders.
@@ -373,11 +366,11 @@
     makePlaceholders(element) {
       bool oldUseHelper = useMirrorHelperLibrary;
       useMirrorHelperLibrary = (useMirrorHelperLibrary
-                               && element.getLibrary() != mirrorHelperLibrary);
+                               && element.library != mirrorHelperLibrary);
       collector.collect(element);
       useMirrorHelperLibrary = oldUseHelper;
 
-      if (element.isClass()) {
+      if (element.isClass) {
         classMembers[element].forEach(makePlaceholders);
       }
     }
@@ -409,7 +402,7 @@
 
       // Emit XML for AST instead of the program.
       for (final topLevel in sortedTopLevels) {
-        if (topLevel.isClass() && !emitNoMembersFor.contains(topLevel)) {
+        if (topLevel.isClass && !emitNoMembersFor.contains(topLevel)) {
           // TODO(antonm): add some class info.
           sortedClassMembers[topLevel].forEach(outputElement);
         } else {
@@ -423,7 +416,7 @@
     final topLevelNodes = <Node>[];
     for (final element in sortedTopLevels) {
       topLevelNodes.add(elementAsts[element].ast);
-      if (element.isClass() && !element.isMixinApplication) {
+      if (element.isClass && !element.isMixinApplication) {
         final members = <Node>[];
         for (final member in sortedClassMembers[element]) {
           members.add(elementAsts[member].ast);
@@ -484,7 +477,7 @@
   void registerTypeLiteral(Element element,
                            Enqueuer enqueuer,
                            TreeElements elements) {
-    if (element.isClass()) {
+    if (element.isClass) {
       usedTypeLiterals.add(element);
     }
   }
@@ -497,7 +490,7 @@
 
   void registerMirrorHelperElement(Element element, Node node) {
     if (mirrorHelperLibrary != null
-        && element.getLibrary() == mirrorHelperLibrary) {
+        && element.library == mirrorHelperLibrary) {
       mirrorRenamer.registerHelperElement(element, node);
     }
   }
@@ -567,9 +560,8 @@
     final DartType type = treeElements.getType(typeAnnotation);
     assert(invariant(typeAnnotation, type != null,
         message: "Missing type for type annotation: $treeElements."));
-    Element typeElement = type.element;
-    if (typeElement.isTypedef()) newTypedefElementCallback(typeElement);
-    if (typeElement.isClass()) newClassElementCallback(typeElement);
+    if (type.kind == TypeKind.TYPEDEF) newTypedefElementCallback(type.element);
+    if (type.kind == TypeKind.INTERFACE) newClassElementCallback(type.element);
     typeAnnotation.visitChildren(this);
   }
 
@@ -589,9 +581,9 @@
 }
 
 compareElements(e0, e1) {
-  int result = compareBy((e) => e.getLibrary().canonicalUri.toString())(e0, e1);
+  int result = compareBy((e) => e.library.canonicalUri.toString())(e0, e1);
   if (result != 0) return result;
-  return compareBy((e) => e.position().charOffset)(e0, e1);
+  return compareBy((e) => e.position.charOffset)(e0, e1);
 }
 
 List<Element> sortElements(Iterable<Element> elements) =>
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 d8d7573..18f094d 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
@@ -1,3 +1,7 @@
+// 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 dart_codegen;
 
 import 'dart_tree.dart' as tree;
@@ -8,6 +12,8 @@
 import '../elements/elements.dart';
 import '../dart_types.dart';
 import '../elements/modelx.dart' as modelx;
+import '../universe/universe.dart';
+import '../tree/tree.dart' as tree show Modifiers;
 
 /// Translates the dart_tree IR to Dart frontend AST.
 frontend.FunctionExpression emit(FunctionElement element,
@@ -21,20 +27,38 @@
 class ASTEmitter extends tree.Visitor<dynamic, Expression> {
   /// Variables to be hoisted at the top of the current function.
   List<VariableDeclaration> variables;
-  
+
+  /// Set of variables that have had their declaration inserted in [variables].
+  Set<tree.Variable> seenVariables;
+
   /// Statements emitted by the most recent call to [visitStatement].
   List<Statement> statementBuffer;
-  
+
   /// The function currently being emitted.
   FunctionElement functionElement;
-  
+
+  /// Bookkeeping object needed to synthesize a variable declaration.
+  modelx.VariableList variableList;
+
+  /// Input to [visitStatement]. Denotes the statement that will execute next
+  /// if the statements produced by [visitStatement] complete normally.
+  /// Set to null if control will fall over the end of the method.
+  tree.Statement fallthrough;
+
+  /// Labels that could not be eliminated using fallthrough.
+  Set<tree.Label> usedLabels;
+
   FunctionExpression emit(FunctionElement element,
                           tree.FunctionDefinition definition) {
     functionElement = element;
     variables = <VariableDeclaration>[];
     statementBuffer = <Statement>[];
+    seenVariables = new Set<tree.Variable>();
     tree.Variable.counter = 0;
-    
+    variableList = new modelx.VariableList(tree.Modifiers.EMPTY);
+    fallthrough = null;
+    usedLabels = new Set<tree.Label>();
+
     Parameters parameters = emitParameters(definition.parameters);
     visitStatement(definition.body);
     removeTrailingReturn();
@@ -43,21 +67,24 @@
       Statement head = new VariableDeclarations(variables);
       body = new Block([head, body]);
     }
-    
+
     FunctionType functionType = element.type;
-    
+
     variables = null;
     statementBuffer = null;
     functionElement = null;
-    
+    variableList = null;
+    seenVariables = null;
+    usedLabels = null;
+
     return new FunctionExpression(
-        parameters, 
+        parameters,
         body,
         name: element.name,
         returnType: emitOptionalType(functionType.returnType))
         ..element = element;
   }
-  
+
   /// Removes a trailing "return null" from [statementBuffer].
   void removeTrailingReturn() {
     if (statementBuffer.isEmpty) return;
@@ -68,66 +95,194 @@
       statementBuffer.removeLast();
     }
   }
-  
+
   Parameter emitParameter(tree.Variable param) {
+    seenVariables.add(param);
     ParameterElement element = param.element;
     TypeAnnotation type = emitOptionalType(element.type);
     return new Parameter(element.name, type:type)
                ..element = element;
   }
-  
+
   Parameters emitParameters(List<tree.Variable> params) {
     return new Parameters(params.map(emitParameter).toList(growable:false));
   }
-  
+
   void visitExpressionStatement(tree.ExpressionStatement stmt) {
     Expression e = visitExpression(stmt.expression);
     statementBuffer.add(new ExpressionStatement(e));
     visitStatement(stmt.next);
   }
-  
-  void visitLetVal(tree.LetVal stmt) {
+
+  void visitLabeledStatement(tree.LabeledStatement stmt) {
+    List<Statement> savedBuffer = statementBuffer;
+    tree.Statement savedFallthrough = fallthrough;
+    statementBuffer = <Statement>[];
+    fallthrough = stmt.next;
+    visitStatement(stmt.body);
+    if (usedLabels.remove(stmt.label)) {
+      savedBuffer.add(new LabeledStatement(stmt.label.name,
+                                           new Block(statementBuffer)));
+    } else {
+      savedBuffer.add(new Block(statementBuffer));
+    }
+    fallthrough = savedFallthrough;
+    statementBuffer = savedBuffer;
+    visitStatement(stmt.next);
+  }
+
+  void visitAssign(tree.Assign stmt) {
     // Synthesize an element for the variable, if necessary.
     if (stmt.variable.element == null) {
-      stmt.variable.element = new modelx.VariableElementX.synthetic(
+      stmt.variable.element = new modelx.VariableElementX(
           stmt.variable.name,
           ElementKind.VARIABLE,
-          functionElement);
+          functionElement,
+          variableList,
+          null);
     }
-    variables.add(new VariableDeclaration(stmt.variable.name));
+    if (seenVariables.add(stmt.variable)) {
+      variables.add(new VariableDeclaration(stmt.variable.name)
+                            ..element = stmt.variable.element);
+    }
     Expression def = visitExpression(stmt.definition);
     statementBuffer.add(new ExpressionStatement(new Assignment(
-        visitVariable(stmt.variable), 
-        '=', 
+        visitVariable(stmt.variable),
+        '=',
         def)));
-    visitStatement(stmt.body);
+    visitStatement(stmt.next);
   }
-  
+
   void visitReturn(tree.Return stmt) {
     Expression inner = visitExpression(stmt.value);
     statementBuffer.add(new Return(inner));
   }
-  
+
+  void visitBreak(tree.Break stmt) {
+    tree.Statement fall = fallthrough;
+    if (stmt.target.binding.next == fall) {
+      // Fall through to break target
+    } else if (fall is tree.Break && fall.target == stmt.target) {
+      // Fall through to equivalent break
+    } else {
+      usedLabels.add(stmt.target);
+      statementBuffer.add(new Break(stmt.target.name));
+    }
+  }
+
+  void visitIf(tree.If stmt) {
+    Expression condition = visitExpression(stmt.condition);
+    List<Statement> savedBuffer = statementBuffer;
+    List<Statement> thenBuffer = statementBuffer = <Statement>[];
+    visitStatement(stmt.thenStatement);
+    List<Statement> elseBuffer = statementBuffer = <Statement>[];
+    visitStatement(stmt.elseStatement);
+    savedBuffer.add(
+        new If(condition, new Block(thenBuffer), new Block(elseBuffer)));
+    statementBuffer = savedBuffer;
+  }
+
   Expression visitConstant(tree.Constant exp) {
     return emitConstant(exp.value);
   }
-  
+
+  List<Argument> emitArguments(tree.Invoke exp) {
+    List<tree.Expression> args = exp.arguments;
+    int positionalArgumentCount = exp.selector.positionalArgumentCount;
+    List<Argument> result = new List<Argument>.generate(positionalArgumentCount,
+        (i) => visitExpression(exp.arguments[i]));
+    for (int i = 0; i < exp.selector.namedArgumentCount; ++i) {
+      result.add(new NamedArgument(exp.selector.namedArguments[i],
+          visitExpression(exp.arguments[positionalArgumentCount + i])));
+    }
+    return result;
+  }
+
   Expression visitInvokeStatic(tree.InvokeStatic exp) {
-    List args = exp.arguments.map(visitExpression).toList(growable:false);
+    List<Argument> args = emitArguments(exp);
     return new CallStatic(null, exp.target.name, args)
                ..element = exp.target;
   }
-  
+
+  Expression visitInvokeMethod(tree.InvokeMethod exp) {
+    Expression receiver = visitExpression(exp.receiver);
+    List<Argument> args = emitArguments(exp);
+    switch (exp.selector.kind) {
+      case SelectorKind.CALL:
+        return new CallMethod(receiver, exp.selector.name, args);
+
+      case SelectorKind.OPERATOR:
+        if (args.length == 0) {
+          String name = exp.selector.name;
+          if (name == 'unary-') {
+            name = '-';
+          }
+          return new UnaryOperator(name, receiver);
+        }
+        return new BinaryOperator(receiver, exp.selector.name, args[0]);
+
+      case SelectorKind.GETTER:
+        return new FieldExpression(receiver, exp.selector.name);
+
+      case SelectorKind.SETTER:
+        return new Assignment(
+            new FieldExpression(receiver, exp.selector.name),
+            '=',
+            args[0]);
+
+      case SelectorKind.INDEX:
+        Expression e = new IndexExpression(receiver, args[0]);
+        if (args.length == 2) {
+          e = new Assignment(e, '=', args[1]);
+        }
+        return e;
+
+      default:
+        throw "Unexpected selector in InvokeMethod: ${exp.selector.kind}";
+    }
+  }
+
+  Expression visitInvokeConstructor(tree.InvokeConstructor exp) {
+    List args = emitArguments(exp);
+    FunctionElement constructor = exp.target;
+    String name = constructor.name.isEmpty ? null : constructor.name;
+    return new CallNew(emitType(exp.type), args, constructorName: name)
+               ..constructor = constructor
+               ..dartType = exp.type;
+  }
+
+  Expression visitConcatenateStrings(tree.ConcatenateStrings exp) {
+    List args = exp.arguments.map(visitExpression).toList(growable:false);
+    return new StringConcat(args);
+  }
+
+  Expression visitConditional(tree.Conditional exp) {
+    return new Conditional(
+        visitExpression(exp.condition),
+        visitExpression(exp.thenExpression),
+        visitExpression(exp.elseExpression));
+  }
+
+  Expression visitLogicalOperator(tree.LogicalOperator exp) {
+    return new BinaryOperator(visitExpression(exp.left),
+                              exp.operator,
+                              visitExpression(exp.right));
+  }
+
+  Expression visitNot(tree.Not exp) {
+    return new UnaryOperator('!', visitExpression(exp.operand));
+  }
+
   Expression visitVariable(tree.Variable exp) {
     return new Identifier(exp.name)
                ..element = exp.element;
   }
-  
+
   TypeAnnotation emitType(DartType type) {
     if (type is GenericType) { // TODO(asgerf): faster Link.map
       return new TypeAnnotation(
-          type.element.name, 
-          type.typeArguments.toList(growable:false) 
+          type.element.name,
+          type.typeArguments.toList(growable:false)
               .map(emitType).toList(growable:false))
           ..dartType = type;
     } else if (type is VoidType) {
@@ -137,10 +292,10 @@
       return new TypeAnnotation(type.name)
           ..dartType = type;
     } else {
-      throw "Unsupported type annotation: ${type.runtimeType}";
+      throw "Unsupported type annotation: $type";
     }
   }
-  
+
   /// Like [emitType] except the dynamic type is converted to null.
   TypeAnnotation emitOptionalType(DartType type) {
     if (type.isDynamic) {
@@ -149,7 +304,7 @@
       return emitType(type);
     }
   }
-  
+
   Expression emitConstant(dart2js.Constant constant) {
     if (constant is dart2js.PrimitiveConstant) {
       return new Literal(constant);
@@ -159,12 +314,12 @@
       List<LiteralMapEntry> entries = <LiteralMapEntry>[];
       for (var i = 0; i < constant.keys.length; i++) {
         entries.add(new LiteralMapEntry(
-            emitConstant(constant.keys.entries[i]), 
+            emitConstant(constant.keys.entries[i]),
             emitConstant(constant.values[i])));
       }
       return new LiteralMap(entries, isConst: true);
     } else {
-      throw "Unsupported constant: ${constant.runtimeType}";
+      throw "Unsupported constant: $constant";
     }
   }
 }
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 9320905..50ba9b2 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
@@ -2,19 +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.
 
-
-// OPEN DESIGN QUESTIONS:
-
-// Should the AST enforce that variable definitions are hoisted at the top?
-// This would simplify the AST for [For] and [ForIn] and also simplify block 
-// flattening.
-// On the other hand, the code gets harder to test because the unparser only
-// works together with the middle-end.
-
-// Should the ${E.toString()} ==> ${E} rewrite be in the unparser?
-// It seems more like a semantic rewrite than a syntactic one. 
-// On the other hand, it is really easy to do and costs almost nothing.
-
 // TODO(asgerf): Include metadata.
 // TODO(asgerf): Include cascade operator.
 library dart_printer;
@@ -25,10 +12,10 @@
 import '../elements/elements.dart' as elements;
 import '../dart_types.dart' as types;
 
-/// The following nodes correspond to [tree.Send] expressions: 
-/// [FieldExpression], [IndexExpression], [Assignment], [Increment], 
+/// The following nodes correspond to [tree.Send] expressions:
+/// [FieldExpression], [IndexExpression], [Assignment], [Increment],
 /// [CallFunction], [CallMethod], [CallNew], [CallStatic], [UnaryOperator],
-/// [BinaryOperator], and [TypeOperator].  
+/// [BinaryOperator], and [TypeOperator].
 abstract class Node {}
 
 /// Receiver is an [Expression] or the [SuperReceiver].
@@ -44,7 +31,7 @@
 abstract class Statement extends Node {}
 
 /// Used as receiver in expressions that dispatch to the super class.
-/// For instance, an expression such as `super.f()` is represented 
+/// For instance, an expression such as `super.f()` is represented
 /// by a [CallMethod] node with [SuperReceiver] as its receiver.
 class SuperReceiver extends Receiver {
   static final SuperReceiver _instance = new SuperReceiver._create();
@@ -53,21 +40,21 @@
   SuperReceiver._create();
 }
 
-/// Named arguments may occur in the argument list of 
+/// Named arguments may occur in the argument list of
 /// [CallFunction], [CallMethod], [CallNew], and [CallStatic].
 class NamedArgument extends Argument {
   final String name;
   final Expression expression;
-  
+
   NamedArgument(this.name, this.expression);
 }
 
 class TypeAnnotation extends Node {
   final String name;
   final List<TypeAnnotation> typeArguments;
-  
+
   types.DartType dartType;
-  
+
   TypeAnnotation(this.name, [this.typeArguments = const <TypeAnnotation>[]]);
 }
 
@@ -94,7 +81,7 @@
 
 class EmptyStatement extends Statement {
   static final EmptyStatement _instance = new EmptyStatement._create();
-  
+
   factory EmptyStatement() => _instance;
   EmptyStatement._create();
 }
@@ -114,7 +101,7 @@
   /// Initializer must be [VariableDeclarations] or [Expression] or null.
   For(this.initializer, this.condition, this.updates, this.body) {
     assert(initializer == null
-        || initializer is VariableDeclarations 
+        || initializer is VariableDeclarations
         || initializer is Expression);
   }
 }
@@ -125,12 +112,12 @@
   final Statement body;
 
   /// [leftHandValue] must be [Identifier] or [VariableDeclarations] with
-  /// exactly one definition, and that variable definition must have no 
+  /// exactly one definition, and that variable definition must have no
   /// initializer.
   ForIn(Node leftHandValue, this.expression, this.body)
       : this.leftHandValue = leftHandValue {
-    assert(leftHandValue is Identifier 
-        || (leftHandValue is VariableDeclarations 
+    assert(leftHandValue is Identifier
+        || (leftHandValue is VariableDeclarations
             && leftHandValue.declarations.length == 1
             && leftHandValue.declarations[0].initializer == null));
   }
@@ -183,18 +170,18 @@
 
 /// A sequence of case clauses followed by a sequence of statements.
 /// Represents the default case if [expressions] is null.
-/// 
+///
 /// NOTE:
 /// Control will never fall through to the following SwitchCase, even if
 /// the list of statements is empty. An empty list of statements will be
-/// unparsed to a semicolon to guarantee this behaviour. 
+/// unparsed to a semicolon to guarantee this behaviour.
 class SwitchCase extends Node {
   final List<Expression> expressions;
   final List<Statement> statements;
 
   SwitchCase(this.expressions, this.statements);
   SwitchCase.defaultCase(this.statements) : expressions = null;
-  
+
   bool get isDefaultCase => expressions == null;
 }
 
@@ -233,9 +220,9 @@
   final bool isConst;
   final List<VariableDeclaration> declarations;
 
-  VariableDeclarations(this.declarations, 
-                      { this.type, 
-                        this.isFinal: false, 
+  VariableDeclarations(this.declarations,
+                      { this.type,
+                        this.isFinal: false,
                         this.isConst: false }) {
     // Cannot be both final and const.
     assert(!isFinal || !isConst);
@@ -246,6 +233,8 @@
   final String name;
   final Expression initializer;
 
+  elements.Element element;
+
   VariableDeclaration(this.name, [this.initializer]);
 }
 
@@ -258,7 +247,7 @@
 
   FunctionDeclaration(this.name,
                       this.parameters,
-                      this.body, 
+                      this.body,
                       [ this.returnType ]);
 }
 
@@ -266,47 +255,47 @@
   final List<Parameter> requiredParameters;
   final List<Parameter> optionalParameters;
   final bool hasNamedParameters;
-  
+
   Parameters(this.requiredParameters,
-             [ this.optionalParameters, 
+             [ this.optionalParameters,
                this.hasNamedParameters = false ]);
-  
+
   Parameters.named(this.requiredParameters, this.optionalParameters)
       : hasNamedParameters = true;
-  
+
   Parameters.positional(this.requiredParameters, this.optionalParameters)
         : hasNamedParameters = false;
-  
-  bool get hasOptionalParameters => 
+
+  bool get hasOptionalParameters =>
       optionalParameters != null && optionalParameters.length > 0;
 }
 
 class Parameter extends Node {
   final String name;
-  
+
   /// Type of parameter, or return type of function parameter.
   final TypeAnnotation type;
-  
+
   final Expression defaultValue;
-  
+
   /// Parameters to function parameter. Null for non-function parameters.
   final Parameters parameters;
-  
+
   elements.ParameterElement element;
-  
+
   Parameter(this.name, {this.type, this.defaultValue})
       : parameters = null;
-  
-  Parameter.function(this.name, 
-                     TypeAnnotation returnType, 
-                     this.parameters, 
+
+  Parameter.function(this.name,
+                     TypeAnnotation returnType,
+                     this.parameters,
                      [ this.defaultValue ]) : type = returnType {
     assert(parameters != null);
   }
-  
+
   /// True if this is a function parameter.
   bool get isFunction => parameters != null;
-  
+
   // TODO(asgerf): Support modifiers on parameters (final, ...).
 }
 
@@ -317,12 +306,12 @@
   final String name;
   final Parameters parameters;
   final Statement body;
-  
+
   elements.FunctionElement element;
 
-  FunctionExpression(this.parameters, 
-                     this.body, 
-                     { this.name, 
+  FunctionExpression(this.parameters,
+                     this.body,
+                     { this.name,
                        this.returnType }) {
     // Function must have a name if it has a return type
     assert(returnType == null || name != null);
@@ -337,17 +326,17 @@
   Conditional(this.condition, this.thenExpression, this.elseExpression);
 }
 
-/// An identifier expression. 
-/// The unparser does not concern itself with scoping rules, and it is the 
-/// responsibility of the AST creator to ensure that the identifier resolves 
+/// An identifier expression.
+/// The unparser does not concern itself with scoping rules, and it is the
+/// responsibility of the AST creator to ensure that the identifier resolves
 /// to the proper definition.
 class Identifier extends Expression {
   final String name;
-  
+
   elements.Element element;
 
   Identifier(this.name);
-  
+
   bool get assignable => true;
 }
 
@@ -371,8 +360,8 @@
   final List<LiteralMapEntry> entries;
 
   LiteralMap(this.entries, { this.typeArguments, this.isConst: false }) {
-    assert(this.typeArguments == null 
-        || this.typeArguments.length == 0 
+    assert(this.typeArguments == null
+        || this.typeArguments.length == 0
         || this.typeArguments.length == 2);
   }
 }
@@ -386,7 +375,7 @@
 
 class LiteralSymbol extends Expression {
   final String id;
-  
+
   /// [id] should not include the # symbol
   LiteralSymbol(this.id);
 }
@@ -409,7 +398,7 @@
   final String fieldName;
 
   FieldExpression(this.object, this.fieldName);
-  
+
   bool get assignable => true;
 }
 
@@ -419,7 +408,7 @@
   final Expression index;
 
   IndexExpression(this.object, this.index);
-  
+
   bool get assignable => true;
 }
 
@@ -434,7 +423,7 @@
   CallFunction(this.callee, this.arguments);
 }
 
-/// Expression of form `e.f(..)`. 
+/// Expression of form `e.f(..)`.
 class CallMethod extends Expression {
   final Receiver object;
   final String methodName;
@@ -451,9 +440,12 @@
   final String constructorName;
   final List<Argument> arguments;
 
-  CallNew(this.type, 
-          this.arguments, 
-         { this.constructorName, 
+  elements.FunctionElement constructor;
+  types.DartType dartType;
+
+  CallNew(this.type,
+          this.arguments,
+         { this.constructorName,
            this.isConst: false });
 }
 
@@ -462,7 +454,7 @@
   final String className;
   final String methodName;
   final List<Argument> arguments;
-  
+
   elements.FunctionElement element;
 
   CallStatic(this.className, this.methodName, this.arguments);
@@ -478,7 +470,7 @@
   }
 }
 
-/// Expression of form `e1 + e2`, `e1 - e2`, etc. 
+/// Expression of form `e1 + e2`, `e1 - e2`, etc.
 /// This node also represents application of the logical operators && and ||.
 class BinaryOperator extends Expression {
   final Receiver left;
@@ -495,10 +487,10 @@
   final Expression expression;
   final String operatorName;
   final TypeAnnotation type;
-  
+
   TypeOperator(this.expression, this.operatorName, this.type) {
-    assert(operatorName == 'is' 
-        || operatorName == 'as' 
+    assert(operatorName == 'is'
+        || operatorName == 'as'
         || operatorName == 'is!');
   }
 }
@@ -513,7 +505,7 @@
     assert(expression.assignable);
   }
 
-  Increment.prefix(Expression expression, String operator) 
+  Increment.prefix(Expression expression, String operator)
       : this(expression, operator, true);
 
   Increment.postfix(Expression expression, String operator)
@@ -521,7 +513,7 @@
 }
 
 class Assignment extends Expression {
-  static final _operators = 
+  static final _operators =
       new Set.from(['=', '|=', '^=', '&=', '<<=', '>>=',
                     '+=', '-=', '*=', '/=', '%=', '~/=']);
 
@@ -558,9 +550,6 @@
 }
 
 
-const int NEWLINE = 10;
-const int CARRIAGE_RETURN = 13;
-
 // Precedence levels
 const int EXPRESSION = 1;
 const int CONDITIONAL = 2;
@@ -578,31 +567,31 @@
 const int POSTFIX_INCREMENT = 15;
 const int PRIMARY = 20;
 
-/// Precedence level required for the callee in a [FunctionCall]. 
+/// Precedence level required for the callee in a [FunctionCall].
 const int CALLEE = 21;
 
 const Map<String,int> BINARY_PRECEDENCE = const {
   '&&': LOGICAL_AND,
   '||': LOGICAL_OR,
-                                  
+
   '==': EQUALITY,
   '!=': EQUALITY,
-  
+
   '>': RELATIONAL,
   '>=': RELATIONAL,
   '<': RELATIONAL,
   '<=': RELATIONAL,
-  
+
   '|': BITWISE_OR,
   '^': BITWISE_XOR,
   '&': BITWISE_AND,
-  
+
   '>>': SHIFT,
   '<<': SHIFT,
-  
+
   '+': ADDITIVE,
   '-': ADDITIVE,
-  
+
   '*': MULTIPLICATIVE,
   '%': MULTIPLICATIVE,
   '/': MULTIPLICATIVE,
@@ -612,7 +601,7 @@
 /// Return true if binary operators with the given precedence level are
 /// (left) associative. False if they are non-associative.
 bool isAssociativeBinaryOperator(int precedence) {
-  return precedence != EQUALITY && precedence != RELATIONAL; 
+  return precedence != EQUALITY && precedence != RELATIONAL;
 }
 
 /// True if [x] is a letter, digit, or underscore.
@@ -621,7 +610,7 @@
   if (x is! int) {
     return false;
   }
-  return (characters.$0 <= x && x <= characters.$9) || 
+  return (characters.$0 <= x && x <= characters.$9) ||
          (characters.$A <= x && x <= characters.$Z) ||
          (characters.$a <= x && x <= characters.$z) ||
          (x == characters.$_);
@@ -644,9 +633,7 @@
 ///     !(E == E) ==> E != E
 ///   Introduce is-not operator:
 ///     !(E is T) ==> E is!T
-///   Remove .toString() from string interpolation (see [StringConcat])
-///     "X ${E.toString()} Y" ==> "X ${E} Y"
-/// 
+///
 /// The following transformations will NOT be applied here:
 ///   Use implicit this:
 ///     this.foo ==> foo              (preconditions too complex for unparser)
@@ -654,21 +641,21 @@
 ///     var x; var y  ==> var x,y;    (hoisting will be done elsewhere)
 ///   Merge adjacent labels:
 ///     foo: bar: S ==> foobar: S     (scoping is categorically ignored)
-/// 
+///
 /// The following transformations might be applied here in the future:
 ///   Use implicit dynamic types:
 ///     dynamic x = E ==> var x = E
 ///     <dynamic>[]   ==> []
 class Unparser {
   StringSink output;
-  
+
   Unparser(this.output);
-  
+
 
   void write(String s) {
     output.write(s);
   }
-  
+
   /// Outputs each element from [items] separated by [separator].
   /// The actual printing must be performed by the [callback].
   void writeEach(String separator, Iterable items, void callback(any)) {
@@ -682,13 +669,13 @@
       callback(x);
     }
   }
-  
+
   void writeOperator(String operator) {
     write(" "); // TODO(asgerf): Minimize use of whitespace.
     write(operator);
     write(" ");
   }
-  
+
   /// Unfolds singleton blocks and returns the inner statement.
   /// If an empty block is found, the [EmptyStatement] is returned instead.
   Statement unfoldBlocks(Statement stmt) {
@@ -703,7 +690,7 @@
       return new EmptyStatement();
     return stmt;
   }
-  
+
   void writeArgument(Argument arg) {
     if (arg is NamedArgument) {
       write(arg.name);
@@ -713,8 +700,8 @@
       writeExpression(arg);
     }
   }
-  
-  /// Prints the expression [e]. 
+
+  /// Prints the expression [e].
   void writeExpression(Expression e) {
     writeExp(e, EXPRESSION);
   }
@@ -724,9 +711,9 @@
   /// 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): 
+    // 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?  
+    //   on the AST instead of a chain of "if (e is T)" statements?
     void withPrecedence(int actual, void action()) {
       if (actual < minPrecedence) {
         write("(");
@@ -745,7 +732,7 @@
       withPrecedence(precedence, () {
         // A named function expression at the beginning of a statement
         // can be mistaken for a function declaration.
-        // (Note: Functions with a return type also have a name) 
+        // (Note: Functions with a return type also have a name)
         bool needParen = beginStmt && e.name != null;
         if (needParen) {
           write('(');
@@ -782,7 +769,24 @@
       if (e.value is dart2js.StringConstant) {
         writeStringLiteral(e);
       }
-      else {
+      else if (e.value is dart2js.DoubleConstant) {
+        double v = e.value.value;
+        if (v == double.INFINITY) {
+          withPrecedence(MULTIPLICATIVE, () {
+            write('1/0.0');
+          });
+        } else if (v == double.NEGATIVE_INFINITY) {
+          withPrecedence(MULTIPLICATIVE, () {
+            write('-1/0.0');
+          });
+        } else if (v.isNaN) {
+          withPrecedence(MULTIPLICATIVE, () {
+            write('0/0.0');
+          });
+        } else {
+          write(v.toString());
+        }
+      } else {
         write(e.value.toString());
       }
     } else if (e is LiteralList) {
@@ -833,7 +837,7 @@
     } else if (e is UnaryOperator) {
       Receiver operand = e.operand;
       // !(x == y) ==> x != y.
-      if (e.operatorName == '!' && 
+      if (e.operatorName == '!' &&
           operand is BinaryOperator && operand.operatorName == '==') {
         withPrecedence(EQUALITY, () {
           writeExp(operand.left, RELATIONAL);
@@ -885,14 +889,14 @@
       withPrecedence(PRIMARY, () {
         writeExp(e.object, PRIMARY, beginStmt: beginStmt);
         write('.');
-        write(e.fieldName);        
+        write(e.fieldName);
       });
     } else if (e is IndexExpression) {
       withPrecedence(CALLEE, () {
         writeExp(e.object, PRIMARY, beginStmt: beginStmt);
         write('[');
         writeExp(e.index, EXPRESSION);
-        write(']');        
+        write(']');
       });
     } else if (e is CallFunction) {
       withPrecedence(CALLEE, () {
@@ -954,7 +958,7 @@
       throw "Unexpected expression: $e";
     }
   }
-  
+
   void writeParameters(Parameters params) {
     write('(');
     bool first = true;
@@ -991,7 +995,7 @@
     }
     write(')');
   }
-  
+
   void writeStatement(Statement stmt, {bool shortIf: true}) {
     stmt = unfoldBlocks(stmt);
     if (stmt is Block) {
@@ -1155,7 +1159,7 @@
       throw "Unexpected statement: $stmt";
     }
   }
-  
+
   /// Writes a variable definition statement without the trailing semicolon
   void writeVariableDefinitions(VariableDeclarations vds) {
     if (vds.isConst)
@@ -1177,13 +1181,13 @@
       }
     });
   }
-  
+
   /// True of statements that introduce variables in the scope of their
   /// surrounding block. Blocks containing such statements cannot be unfolded.
-  bool definesVariable(Statement s) {
+  static bool definesVariable(Statement s) {
     return s is VariableDeclarations || s is FunctionDeclaration;
   }
-  
+
   /// Writes the given statement in a context where only blocks are allowed.
   void writeBlock(Statement stmt) {
     if (stmt is Block) {
@@ -1194,7 +1198,7 @@
       write('}');
     }
   }
-  
+
   /// Outputs a statement that is a member of a block statement (or a similar
   /// sequence of statements, such as in switch statement).
   /// This will flatten blocks and skip empty statement.
@@ -1207,16 +1211,16 @@
       writeStatement(stmt);
     }
   }
-  
+
   void writeType(TypeAnnotation type) {
     write(type.name);
     if (type.typeArguments != null && type.typeArguments.length > 0) {
       write('<');
       writeEach(',', type.typeArguments, writeType);
       write('>');
-    }  
+    }
   }
-  
+
   static StringLiteralOutput analyzeStringLiteral(Expression node) {
     // TODO(asgerf): This might be a bit too expensive. Benchmark.
     // Flatten the StringConcat tree.
@@ -1228,36 +1232,30 @@
         for (int char in e.value.value) {
           parts.add(char);
         }
-      } else if (e is CallMethod && 
-                 e.object is Expression && // Do not match super.toString()
-                 e.methodName == "toString" && 
-                 e.arguments.length == 0) {
-        // ${e.toString()} ==> ${e}
-        collectParts(e.object);
       } else {
         parts.add(e);
       }
     }
     collectParts(node);
-    
+
     // We use a dynamic algorithm to compute the optimal way of printing
     // the string literal.
     //
     // Using string juxtapositions, it is possible to switch from one quoting
     // to another, e.g. the constant "''''" '""""' uses this trick.
     //
-    // As we move through the string from left to right, we maintain a strategy 
-    // for each StringQuoting Q, denoting the best way to print the current 
+    // As we move through the string from left to right, we maintain a strategy
+    // for each StringQuoting Q, denoting the best way to print the current
     // prefix so that we end with a string literal quoted with Q.
     // At every step, each strategy is either:
     //  1) Updated to include the cost of printing the next character.
     //  2) Abandoned because it is cheaper to use another strategy as prefix,
     //     and then switching quotation using a juxtaposition.
-    
+
     int getQuoteCost(tree.StringQuoting quot) {
       return quot.leftQuoteLength + quot.rightQuoteLength;
     }
-    
+
     // Create initial scores for each StringQuoting and index them
     // into raw/non-raw and single-quote/double-quote.
     List<OpenStringChunk> best = <OpenStringChunk>[];
@@ -1269,11 +1267,11 @@
       // Ignore multiline quotings for now. Encoding of line breaks is unclear.
       // TODO(asgerf): Include multiline quotation schemes.
       if (q.leftQuoteCharCount >= 3)
-        continue; 
+        continue;
       OpenStringChunk chunk = new OpenStringChunk(null, q, getQuoteCost(q));
       int index = best.length;
       best.add(chunk);
-      
+
       if (q.raw) {
         raws.add(index);
       } else {
@@ -1285,23 +1283,23 @@
         dqs.add(index);
       }
     }
-    
+
 
     /// Applies additional cost to each track in [penalized], and considers
     /// switching from each [penalized] to a [nonPenalized] track.
-    void penalize(List<int> penalized, 
+    void penalize(List<int> penalized,
                   List<int> nonPenalized,
                   int endIndex,
                   num cost(tree.StringQuoting q)) {
       for (int j in penalized) {
         // Check if another track can benefit from switching from this track.
         for (int k in nonPenalized) {
-          num newCost = best[j].cost 
+          num newCost = best[j].cost
                       + 1             // Whitespace in string juxtaposition
                       + getQuoteCost(best[k].quoting);
           if (newCost < best[k].cost) {
             best[k] = new OpenStringChunk(
-                best[j].end(endIndex), 
+                best[j].end(endIndex),
                 best[k].quoting,
                 newCost);
           }
@@ -1309,7 +1307,7 @@
         best[j].cost += cost(best[j].quoting);
       }
     }
-    
+
     // Iterate through the string and update the score for each StringQuoting.
     for (int i = 0; i < parts.length; i++) {
       var part = parts[i];
@@ -1326,19 +1324,24 @@
           case characters.$SQ:
             penalize(sqs, dqs, i, (q) => q.raw ? double.INFINITY : 1);
             break;
-          case NEWLINE:
-          case CARRIAGE_RETURN:
+          case characters.$LF:
+          case characters.$CR:
+          case characters.$FF:
+          case characters.$BS:
+          case characters.$VTAB:
+          case characters.$TAB:
+          case characters.$EOF:
             penalize(raws, nonRaws, i, (q) => double.INFINITY);
             break;
         }
       } else {
         // Penalize raw literals for string interpolation.
         penalize(raws, nonRaws, i, (q) => double.INFINITY);
-        
+
         // Splitting a string can sometimes allow us to use a shorthand
         // string interpolation that would otherwise be illegal.
         // E.g. "...${foo}x..." -> "...$foo" 'x...'
-        // If are other factors that make splitting advantageous, 
+        // If are other factors that make splitting advantageous,
         // we can gain even more by doing the split here.
         if (part is Identifier &&
             !part.name.contains(r'$') &&
@@ -1346,13 +1349,13 @@
             isIdentifierPartNoDollar(parts[i+1])) {
           for (int j in nonRaws) {
             for (int k = 0; k < best.length; k++) {
-              num newCost = best[j].cost 
+              num newCost = best[j].cost
                           + 1             // Whitespace in string juxtaposition
                           - 2             // Save two curly braces
                           + getQuoteCost(best[k].quoting);
               if (newCost < best[k].cost) {
                 best[k] = new OpenStringChunk(
-                    best[j].end(i+1), 
+                    best[j].end(i+1),
                     best[k].quoting,
                     newCost);
               }
@@ -1361,7 +1364,7 @@
         }
       }
     }
-    
+
     // Select the cheapest strategy
     OpenStringChunk bestChunk = best[0];
     for (OpenStringChunk chunk in best) {
@@ -1369,10 +1372,10 @@
         bestChunk = chunk;
       }
     }
-    
+
     return new StringLiteralOutput(parts, bestChunk.end(parts.length));
   }
-  
+
   void writeStringLiteral(Expression node) {
     StringLiteralOutput output = analyzeStringLiteral(node);
     List parts = output.parts;
@@ -1395,45 +1398,10 @@
         var part = parts[i];
         if (part is int) {
           int char = part;
-          switch (char) {
-            case characters.$$:
-              if (raw)
-                write(r'$');
-              else
-                write(r'\$');
-              break;
-            case characters.$BACKSLASH:
-              if (raw)
-                write(r'\');
-              else
-                write(r'\\');
-              break;
-            case characters.$DQ:
-              if (quoteCode == char) {
-                write(r'\"');
-              } else {
-                write(r'"');
-              }
-              break;
-            case characters.$SQ:
-              if (quoteCode == char) {
-                write(r"\'");
-              } else {
-                write(r"'");
-              }
-              break;
-            case NEWLINE:
-              write(r'\n');
-              break;
-            case CARRIAGE_RETURN:
-              write(r'\r');
-              break;
-            default:
-              write(new String.fromCharCode(char));
-          }
+          write(getEscapedCharacter(char, quoteCode, raw));
         } else if (part is Identifier &&
                    !part.name.contains(r'$') &&
-                   (i == chunk.endIndex - 1 ||  
+                   (i == chunk.endIndex - 1 ||
                     !isIdentifierPartNoDollar(parts[i+1]))) {
           write(r'$');
           write(part.name);
@@ -1447,7 +1415,36 @@
     }
     printChunk(output.chunk);
   }
-  
+
+  static String getEscapedCharacter(int char, int quoteCode, bool raw) {
+    switch (char) {
+      case characters.$$:
+        return raw ? r'$' : r'\$';
+      case characters.$BACKSLASH:
+        return raw ? r'\' : r'\\';
+      case characters.$DQ:
+        return quoteCode == char ? r'\"' : r'"';
+      case characters.$SQ:
+        return quoteCode == char ? r"\'" : r"'";
+      case characters.$LF:
+        return r'\n';
+      case characters.$CR:
+        return r'\r';
+      case characters.$FF:
+        return r'\f';
+      case characters.$BS:
+        return r'\b';
+      case characters.$TAB:
+        return r'\t';
+      case characters.$VTAB:
+        return r'\v';
+      case characters.$EOF:
+        return r'\x00';
+      default:
+        return new String.fromCharCode(char);
+    }
+  }
+
 }
 
 /// The contents of a string literal together with a strategy for printing it.
@@ -1456,7 +1453,7 @@
   /// and each `int` is the character code of a character in a string literal.
   final List parts;
   final StringChunk chunk;
-  
+
   StringLiteralOutput(this.parts, this.chunk);
 }
 
@@ -1468,20 +1465,20 @@
   final StringChunk previous;
   final tree.StringQuoting quoting;
   final int endIndex;
-  
+
   StringChunk(this.previous, this.quoting, this.endIndex);
 }
 
-/// [StringChunk] that has not yet been assigned an [endIndex]. 
-/// It additionally has a [cost] denoting the number of auxilliary characters 
+/// [StringChunk] that has not yet been assigned an [endIndex].
+/// It additionally has a [cost] denoting the number of auxilliary characters
 /// (quotes, spaces, etc) needed to print the literal using this strategy
 class OpenStringChunk {
   final StringChunk previous;
   final tree.StringQuoting quoting;
   num cost;
-  
+
   OpenStringChunk(this.previous, this.quoting, this.cost);
-  
+
   StringChunk end(int endIndex) {
     return new StringChunk(previous, quoting, endIndex);
   }
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 3e91bb1..99fcad4 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
@@ -5,13 +5,16 @@
 library dart_tree;
 
 import '../dart2jslib.dart' as dart2js;
-import '../dart_types.dart';
-import '../util/util.dart';
 import '../elements/elements.dart'
-    show Element, FunctionElement, FunctionSignature, ParameterElement;
+    show Element, FunctionElement, FunctionSignature, ParameterElement,
+         ClassElement;
+import '../universe/universe.dart';
 import '../ir/ir_nodes.dart' as ir;
 import '../tree/tree.dart' as ast;
 import '../scanner/scannerlib.dart';
+import '../dart_types.dart' show DartType, GenericType;
+import '../helpers/helpers.dart';
+import '../universe/universe.dart' show Selector;
 
 // The Tree language is the target of translation out of the CPS-based IR.
 //
@@ -40,13 +43,47 @@
 abstract class Expression extends Node {
   bool get isPure;
   accept(Visitor v);
+
+  /// Temporary variable used by [StatementRewriter].
+  /// If set to true, this expression has already had enclosing assignments
+  /// propagated into its variables, and should not be processed again.
+  /// It is only set for expressions that are known to be in risk of redundant
+  /// processing.
+  bool processed = false;
 }
 
 abstract class Statement extends Node {
+  Statement get next;
+  void set next(Statement s);
   accept(Visitor v);
 }
 
 /**
+ * Labels name [LabeledStatement]s.
+ */
+class Label {
+  // A counter used to generate names.  The counter is reset to 0 for each
+  // function emitted.
+  static int counter = 0;
+  static String _newName() => 'L${counter++}';
+
+  String cachedName;
+
+  String get name {
+    if (cachedName == null) cachedName = _newName();
+    return cachedName;
+  }
+
+  /// Number of [Break] statements that target this label.
+  /// The [Break] constructor will increment this automatically, but the
+  /// counter must be decremented by hand when a [Break] becomes orphaned.
+  int breakCount = 0;
+
+  /// The [LabeledStatement] binding this label.
+  LabeledStatement binding;
+}
+
+/**
  * Variables are [Expression]s.
  */
 class Variable extends Expression {
@@ -57,7 +94,7 @@
 
   Element element;
   String cachedName;
-  
+
   String get name {
     if (cachedName != null) return cachedName;
     return cachedName = ((element == null) ? _newName() : element.name);
@@ -71,15 +108,24 @@
 }
 
 /**
+ * Common interface for invocations with arguments.
+ */
+abstract class Invoke {
+  List<Expression> get arguments;
+  Selector get selector;
+}
+
+/**
  * A call to a static target.
  *
  * In contrast to the CPS-based IR, the arguments can be arbitrary expressions.
  */
-class InvokeStatic extends Expression {
+class InvokeStatic extends Expression implements Invoke {
   final FunctionElement target;
   final List<Expression> arguments;
+  final Selector selector;
 
-  InvokeStatic(this.target, this.arguments);
+  InvokeStatic(this.target, this.selector, this.arguments);
 
   final bool isPure = false;
 
@@ -87,10 +133,59 @@
 }
 
 /**
+ * A call to a method, operator, getter, setter or index getter/setter.
+ *
+ * In contrast to the CPS-based IR, the receiver and arguments can be
+ * arbitrary expressions.
+ */
+class InvokeMethod extends Expression implements Invoke {
+  Expression receiver;
+  final Selector selector;
+  final List<Expression> arguments;
+
+  InvokeMethod(this.receiver, this.selector, this.arguments) {
+    assert(receiver != null);
+  }
+
+  final bool isPure = false;
+
+  accept(Visitor visitor) => visitor.visitInvokeMethod(this);
+}
+
+/**
+ * Non-const call to a factory or generative constructor.
+ */
+class InvokeConstructor extends Expression implements Invoke {
+  final GenericType type;
+  final FunctionElement target;
+  final List<Expression> arguments;
+  final Selector selector;
+
+  InvokeConstructor(this.type, this.target, this.selector, this.arguments);
+
+  ClassElement get targetClass => target.enclosingElement;
+
+  final bool isPure = false;
+
+  accept(Visitor visitor) => visitor.visitInvokeConstructor(this);
+}
+
+/// Calls [toString] on each argument and concatenates the results.
+class ConcatenateStrings extends Expression {
+  final List<Expression> arguments;
+
+  ConcatenateStrings(this.arguments);
+
+  final bool isPure = false; // invokes toString
+
+  accept(Visitor visitor) => visitor.visitConcatenateStrings(this);
+}
+
+/**
  * A constant.
  */
 class Constant extends Expression {
-  final dart2js.Constant value;
+  dart2js.Constant value;
 
   Constant(this.value);
 
@@ -99,22 +194,88 @@
   accept(Visitor visitor) => visitor.visitConstant(this);
 }
 
+/// A conditional expression.
+class Conditional extends Expression {
+  Expression condition;
+  Expression thenExpression;
+  Expression elseExpression;
+
+  Conditional(this.condition, this.thenExpression, this.elseExpression);
+
+  // TODO(asgerf): Repeatedly computing isPure is potentially expensive,
+  // but caching isPure in a field is dangerous because a subexpression could
+  // become impure during a transformation (e.g. assignment propagation).
+  // Improve the situation somehow.
+  bool get isPure => condition.isPure &&
+                     thenExpression.isPure &&
+                     elseExpression.isPure;
+
+  accept(Visitor visitor) => visitor.visitConditional(this);
+}
+
+/// An && or || expression. The operator is internally represented as a boolean
+/// [isAnd] to simplify rewriting of logical operators.
+class LogicalOperator extends Expression {
+  Expression left;
+  bool isAnd;
+  Expression right;
+
+  LogicalOperator(this.left, this.right, this.isAnd);
+  LogicalOperator.and(this.left, this.right) : isAnd = true;
+  LogicalOperator.or(this.left, this.right) : isAnd = false;
+
+  String get operator => isAnd ? '&&' : '||';
+
+  bool get isPure => left.isPure && right.isPure;
+
+  accept(Visitor visitor) => visitor.visitLogicalOperator(this);
+}
+
+/// Logical negation.
+class Not extends Expression {
+  Expression operand;
+
+  Not(this.operand);
+
+  bool get isPure => operand.isPure;
+
+  accept(Visitor visitor) => visitor.visitNot(this);
+}
+
 /**
- * A local binding of a [Variable] to an [Expression].
- *
- * In contrast to the CPS-based IR, non-primitive expressions can be named
- * with let.
+ * A labeled statement.  Breaks to the label within the labeled statement
+ * target the successor statement.
  */
-class LetVal extends Statement {
+class LabeledStatement extends Statement {
+  Statement next;
+  final Label label;
+  Statement body;
+
+  LabeledStatement(this.label, this.body, this.next) {
+    assert(label.binding == null);
+    label.binding = this;
+  }
+
+  accept(Visitor visitor) => visitor.visitLabeledStatement(this);
+}
+
+/**
+ * An assignments of an [Expression] to a [Variable].
+ *
+ * In contrast to the CPS-based IR, non-primitive expressions can be assigned
+ * to variables.
+ */
+class Assign extends Statement {
+  Statement next;
   final Variable variable;
   Expression definition;
-  Statement body;
   final bool hasExactlyOneUse;
 
-  LetVal(this.variable, this.definition, this.body, this.hasExactlyOneUse);
+  Assign(this.variable, this.definition, this.next, this.hasExactlyOneUse);
 
-  accept(Visitor visitor) => visitor.visitLetVal(this);
+  accept(Visitor visitor) => visitor.visitAssign(this);
 }
+
 /**
  * A return exit from the function.
  *
@@ -122,25 +283,65 @@
  * expression.
  */
 class Return extends Statement {
+  /// Should not be null. Use [Constant] with [NullConstant] for void returns.
   Expression value;
 
-  Return(this.value);
+  Statement get next => null;
+  void set next(Statement s) => throw 'UNREACHABLE';
 
-  final bool isPure = true;
+  Return(this.value);
 
   accept(Visitor visitor) => visitor.visitReturn(this);
 }
 
-class ExpressionStatement extends Statement {
-  Expression expression;
-  Statement next;
-  
-  ExpressionStatement(this.expression, this.next);
-  
-  accept(Visitor visitor) => visitor.visitExpressionStatement(this);
+/**
+ * A break from an enclosing [LabeledStatement].  The break targets the
+ * labeled statement's successor statement.
+ */
+class Break extends Statement {
+  Label _target;
+
+  Label get target => _target;
+  void set target(Label newTarget) {
+    ++newTarget.breakCount;
+    --_target.breakCount;
+    _target = newTarget;
+  }
+
+  Statement get next => null;
+  void set next(Statement s) => throw 'UNREACHABLE';
+
+  Break(this._target) {
+    ++target.breakCount;
+  }
+
+  accept(Visitor visitor) => visitor.visitBreak(this);
 }
 
+/**
+ * A conditional branch based on the true value of an [Expression].
+ */
+class If extends Statement {
+  Expression condition;
+  Statement thenStatement;
+  Statement elseStatement;
 
+  Statement get next => null;
+  void set next(Statement s) => throw 'UNREACHABLE';
+
+  If(this.condition, this.thenStatement, this.elseStatement);
+
+  accept(Visitor visitor) => visitor.visitIf(this);
+}
+
+class ExpressionStatement extends Statement {
+  Statement next;
+  Expression expression;
+
+  ExpressionStatement(this.expression, this.next);
+
+  accept(Visitor visitor) => visitor.visitExpressionStatement(this);
+}
 
 class FunctionDefinition extends Node {
   final List<Variable> parameters;
@@ -153,11 +354,20 @@
   E visitExpression(Expression e) => e.accept(this);
   E visitVariable(Variable node);
   E visitInvokeStatic(InvokeStatic node);
+  E visitInvokeMethod(InvokeMethod node);
+  E visitInvokeConstructor(InvokeConstructor node);
+  E visitConcatenateStrings(ConcatenateStrings node);
   E visitConstant(Constant node);
-  
+  E visitConditional(Conditional node);
+  E visitLogicalOperator(LogicalOperator node);
+  E visitNot(Not node);
+
   S visitStatement(Statement s) => s.accept(this);
-  S visitLetVal(LetVal node);
+  S visitLabeledStatement(LabeledStatement node);
+  S visitAssign(Assign node);
   S visitReturn(Return node);
+  S visitBreak(Break node);
+  S visitIf(If node);
   S visitExpressionStatement(ExpressionStatement node);
 }
 
@@ -196,34 +406,60 @@
 class Builder extends ir.Visitor<Node> {
   final dart2js.Compiler compiler;
 
-  // Uses of IR definitions are replaced with Tree variables.  This is the
-  // mapping from definitions to variables.
-  final Map<ir.Definition, Variable> variables = {};
+  // Uses of IR primitives are replaced with Tree variables.  This is the
+  // mapping from primitives to variables.
+  final Map<ir.Primitive, Variable> variables = <ir.Primitive, 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>{};
 
   FunctionDefinition function;
   ir.Continuation returnContinuation;
 
   Builder(this.compiler);
 
-  static final String _bailout = 'Bailout Tree Builder';
-
-  bailout() => throw _bailout;
-
   FunctionDefinition build(ir.FunctionDefinition node) {
-    try {
-      visit(node);
-      return function;
-    } catch (e) {
-      if (e == _bailout) return null;
-      rethrow;
-    }
+    visit(node);
+    return function;
   }
 
   List<Expression> translateArguments(List<ir.Reference> args) {
-    return new List.generate(args.length,
+    return new List<Expression>.generate(args.length,
          (int index) => variables[args[index].definition]);
   }
 
+  Statement buildParameterAssignments(
+      List<ir.Parameter> parameters,
+      List<Expression> arguments,
+      Statement buildRest()) {
+    assert(parameters.length == arguments.length);
+    Statement first, current;
+    for (int i = 0; i < parameters.length; ++i) {
+      ir.Parameter parameter = parameters[i];
+      Statement assignment;
+      if (parameter.hasAtLeastOneUse) {
+        assignment = new Assign(variables[parameter], arguments[i], null,
+            parameter.hasExactlyOneUse);
+      } else {
+        assignment = new ExpressionStatement(arguments[i], null);
+      }
+
+      if (first == null) {
+        current = first = assignment;
+      } else {
+        current = current.next = assignment;
+      }
+    }
+
+    if (first == null) {
+      first = buildRest();
+    } else {
+      current.next = buildRest();
+    }
+    return first;
+  }
+
   Expression visitFunctionDefinition(ir.FunctionDefinition node) {
     returnContinuation = node.returnContinuation;
     List<Variable> parameters = <Variable>[];
@@ -242,7 +478,7 @@
     if (node.primitive.hasAtLeastOneUse) {
       Variable variable = new Variable(null);
       variables[node.primitive] = variable;
-      return new LetVal(variable, definition, node.body.accept(this),
+      return new Assign(variable, definition, node.body.accept(this),
           node.primitive.hasExactlyOneUse);
     } else if (node.primitive is ir.Constant) {
       // TODO(kmillikin): Implement more systematic treatment of pure CPS
@@ -254,45 +490,109 @@
   }
 
   Statement visitLetCont(ir.LetCont node) {
-    // TODO(kmillikin): Allow continuations to have multiple uses.  This could
-    // arise due to the representation of local control flow or due to
-    // optimization.
-    if (!node.continuation.hasAtMostOneUse) return bailout();
-    return visit(node.body);
+    Label label;
+    if (!node.continuation.hasAtMostOneUse) {
+      label = new Label();
+      labels[node.continuation] = label;
+    }
+    node.continuation.parameters.forEach((p) {
+        if (p.hasAtLeastOneUse) variables[p] = new Variable(null);
+    });
+    Statement body = visit(node.body);
+    if (label == null) return body;
+    return new LabeledStatement(label, body, visit(node.continuation.body));
   }
 
   Statement visitInvokeStatic(ir.InvokeStatic node) {
     // Calls are translated to direct style.
     List<Expression> arguments = translateArguments(node.arguments);
-    Expression invoke = new InvokeStatic(node.target, 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);
-      ir.Parameter parameter = cont.parameters[0];
-      if (parameter.hasAtLeastOneUse) {
-        Variable variable = new Variable(null);
-        variables[parameter] = variable;
-        return new LetVal(variable, invoke, cont.body.accept(this),
-            parameter.hasExactlyOneUse);
-      } else {
-        return new ExpressionStatement(invoke, visit(cont.body));
-      }
+      return buildParameterAssignments(cont.parameters, [invoke],
+          () => visit(cont.body));
+    }
+  }
+
+  Statement visitInvokeMethod(ir.InvokeMethod node) {
+    Variable receiver = variables[node.receiver.definition];
+    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 buildParameterAssignments(cont.parameters, [invoke],
+          () => visit(cont.body));
+    }
+  }
+
+  Statement visitConcatenateStrings(ir.ConcatenateStrings node) {
+    List<Expression> arguments = translateArguments(node.arguments);
+    Expression concat = new ConcatenateStrings(arguments);
+    ir.Continuation cont = node.continuation.definition;
+    if (cont == returnContinuation) {
+      return new Return(concat);
+    } else {
+      assert(cont.hasExactlyOneUse);
+      assert(cont.parameters.length == 1);
+      return buildParameterAssignments(cont.parameters, [concat],
+          () => visit(cont.body));
+    }
+  }
+
+  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 buildParameterAssignments(cont.parameters, [invoke],
+          () => visit(cont.body));
     }
   }
 
   Statement visitInvokeContinuation(ir.InvokeContinuation node) {
-    // TODO(kmillikin): Support non-return continuations.  These could arise
-    // due to local control flow or due to inlining or other optimization.
-    if (node.continuation.definition != returnContinuation) return bailout();
-    assert(node.arguments.length == 1);
-    return new Return(variables[node.arguments[0].definition]);
+    // Invocations of the return continuation are translated to returns.
+    // Other continuation invocations are replaced with assignments of the
+    // arguments to formal parameter variables, followed by the body if
+    // the continuation is singly reference or a break if it is multiply
+    // referenced.
+    ir.Continuation cont = node.continuation.definition;
+    if (cont == returnContinuation) {
+      assert(node.arguments.length == 1);
+      return new Return(variables[node.arguments[0].definition]);
+    } else {
+      List<Expression> arguments = translateArguments(node.arguments);
+      return buildParameterAssignments(cont.parameters, arguments,
+          () => cont.hasExactlyOneUse
+                    ? visit(cont.body)
+                    : new Break(labels[cont]));
+    }
   }
 
-  Expression visitBranch(ir.Branch node) {
-    return bailout();
+  Statement visitBranch(ir.Branch node) {
+    Expression condition = visit(node.condition);
+    Statement thenStatement, elseStatement;
+    ir.Continuation cont = node.trueContinuation.definition;
+    assert(cont.parameters.isEmpty);
+    thenStatement =
+        cont.hasExactlyOneUse ? visit(cont.body) : new Break(labels[cont]);
+    cont = node.falseContinuation.definition;
+    assert(cont.parameters.isEmpty);
+    elseStatement =
+        cont.hasExactlyOneUse ? visit(cont.body) : new Break(labels[cont]);
+    return new If(condition, thenStatement, elseStatement);
   }
 
   Expression visitConstant(ir.Constant node) {
@@ -312,18 +612,39 @@
     compiler.internalError(compiler.currentElement, 'Unexpected IR node.');
     return null;
   }
+
+  Expression visitIsTrue(ir.IsTrue node) {
+    return variables[node.value.definition];
+  }
 }
 
 /**
- * Unnamer propagates single-use definitions to their use site when possible.
+ * Performs the following transformations on the tree:
+ * - Assignment propagation
+ * - If-to-conditional conversion
+ * - Flatten nested ifs
+ * - Break inlining
+ * - Redirect breaks
  *
- * After translating out of CPS, all intermediate values are bound by [LetVal].
+ * The above transformations all eliminate statements from the tree, and may
+ * introduce redexes of each other.
+ *
+ *
+ * ASSIGNMENT PROPAGATION:
+ * Single-use definitions are propagated to their use site when possible.
+ * For example:
+ *
+ *   { v0 = foo(); return v0; }
+ *     ==>
+ *   return foo()
+ *
+ * After translating out of CPS, all intermediate values are bound by [Assign].
  * This transformation propagates such definitions to their uses when it is
  * safe and profitable.  Bindings are processed "on demand" when their uses are
  * seen, but are only processed once to keep this transformation linear in
  * the size of the tree.
  *
- * The transformation builds an environment containing [LetVal] bindings that
+ * The transformation builds an environment containing [Assign] bindings that
  * are in scope.  These bindings have yet-untranslated definitions.  When a use
  * is encountered the transformation determines if it is safe and profitable
  * to propagate the definition to its use.  If so, it is removed from the
@@ -332,14 +653,77 @@
  *
  * See [visitVariable] for the implementation of the heuristic for propagating
  * a definition.
+ *
+ *
+ * IF-TO-CONDITIONAL CONVERSION:
+ * If-statement are converted to conditional expressions when possible.
+ * For example:
+ *
+ *   if (v0) { v1 = foo(); break L } else { v1 = bar(); break L }
+ *     ==>
+ *   { v1 = v0 ? foo() : bar(); break L }
+ *
+ * This can lead to inlining of L, which in turn can lead to further propagation
+ * of the variable v1.
+ *
+ * See [visitIf].
+ *
+ *
+ * FLATTEN NESTED IFS:
+ * An if inside an if is converted to an if with a logical operator.
+ * For example:
+ *
+ *   if (E1) { if (E2) {S} else break L } else break L
+ *     ==>
+ *   if (E1 && E2) {S} else break L
+ *
+ * This may lead to inlining of L.
+ *
+ *
+ * BREAK INLINING:
+ * Single-use labels are inlined at [Break] statements.
+ * For example:
+ *
+ *   L0: { v0 = foo(); break L0 }; return v0;
+ *     ==>
+ *   v0 = foo(); return v0;
+ *
+ * This can lead to propagation of v0.
+ *
+ * See [visitBreak] and [visitLabeledStatement].
+ *
+ *
+ * REDIRECT BREAKS:
+ * Labeled statements whose next is a break become flattened and all breaks
+ * to their label are redirected.
+ * For example:
+ *
+ *   L0: {... break L0 ...}; break L1
+ *     ==>
+ *   {... break L1 ...}
+ *
+ * This may trigger a flattening of nested ifs in case the eliminated label
+ * separated two ifs.
  */
-class Unnamer extends Visitor<Statement, Expression> {
+class StatementRewriter extends Visitor<Statement, Expression> {
   // The binding environment.  The rightmost element of the list is the nearest
   // enclosing binding.
-  List<LetVal> environment;
+  // We use null to mark an impure expressions that does not bind a variable.
+  List<Assign> environment;
 
-  void unname(FunctionDefinition definition) {
-    environment = <LetVal>[];
+  /// Substitution map for labels. Any break to a label L should be substituted
+  /// for a break to L' if L maps to L'.
+  Map<Label, Label> labelRedirects = <Label, Label>{};
+
+  /// Returns the redirect target of [label] or [label] itself if it should not
+  /// be redirected.
+  Label redirect(Label label) {
+    Label newTarget = labelRedirects[label];
+    return newTarget != null ? newTarget : label;
+  }
+
+  void rewrite(FunctionDefinition definition) {
+    environment = <Assign>[];
     definition.body = visitStatement(definition.body);
 
     // TODO(kmillikin):  Allow definitions that are not propagated.  Here,
@@ -348,6 +732,8 @@
     assert(environment.isEmpty);
   }
 
+  Expression visitExpression(Expression e) => e.processed ? e : e.accept(this);
+
   Expression visitVariable(Variable node) {
     // Propagate a variable's definition to its use site if:
     // 1.  It has a single use, to avoid code growth and potential duplication
@@ -364,6 +750,10 @@
     // practice.
     bool seenImpure = false;
     for (int i = environment.length - 1; i >= 0; --i) {
+      if (environment[i] == null) {
+        seenImpure = true;
+        continue;
+      }
       if (environment[i].variable == node) {
         if ((!seenImpure || environment[i].definition.isPure)
             && environment[i].hasExactlyOneUse) {
@@ -382,19 +772,20 @@
     return node;
   }
 
-  Statement visitLetVal(LetVal node) {
+
+  Statement visitAssign(Assign node) {
     environment.add(node);
-    Statement body = visitStatement(node.body);
+    Statement next = visitStatement(node.next);
 
     if (!environment.isEmpty && environment.last == node) {
       // The definition could not be propagated.  Residualize the let binding.
-      node.body = body;
+      node.next = next;
       environment.removeLast();
       node.definition = visitExpression(node.definition);
       return node;
     }
     assert(!environment.contains(node));
-    return body;
+    return next;
   }
 
   Expression visitInvokeStatic(InvokeStatic node) {
@@ -405,18 +796,681 @@
     return node;
   }
 
+  Expression visitInvokeMethod(InvokeMethod node) {
+    for (int i = node.arguments.length - 1; i >= 0; --i) {
+      node.arguments[i] = visitExpression(node.arguments[i]);
+    }
+    node.receiver = visitExpression(node.receiver);
+    return node;
+  }
+
+  Expression visitInvokeConstructor(InvokeConstructor node) {
+    for (int i = node.arguments.length - 1; i >= 0; --i) {
+      node.arguments[i] = visitExpression(node.arguments[i]);
+    }
+    return node;
+  }
+
+  Expression visitConcatenateStrings(ConcatenateStrings node) {
+    for (int i = node.arguments.length - 1; i >= 0; --i) {
+      node.arguments[i] = visitExpression(node.arguments[i]);
+    }
+    return node;
+  }
+
+  Expression visitConditional(Conditional node) {
+    node.condition = visitExpression(node.condition);
+
+    environment.add(null); // impure expressions may not propagate across branch
+    node.thenExpression = visitExpression(node.thenExpression);
+    node.elseExpression = visitExpression(node.elseExpression);
+    environment.removeLast();
+
+    return node;
+  }
+
+  Expression visitLogicalOperator(LogicalOperator node) {
+    node.left = visitExpression(node.left);
+
+    environment.add(null); // impure expressions may not propagate across branch
+    node.right = visitExpression(node.right);
+    environment.removeLast();
+
+    return node;
+  }
+
+  Expression visitNot(Not node) {
+    node.operand = visitExpression(node.operand);
+    return node;
+  }
+
   Statement visitReturn(Return node) {
     node.value = visitExpression(node.value);
     return node;
   }
 
+
+  Statement visitBreak(Break node) {
+    // Redirect through chain of breaks.
+    // Note that breakCount was accounted for at visitLabeledStatement.
+    node.target = redirect(node.target);
+    if (node.target.breakCount == 1) {
+      --node.target.breakCount;
+      return visitStatement(node.target.binding.next);
+    }
+    return node;
+  }
+
+  Statement visitLabeledStatement(LabeledStatement node) {
+    if (node.next is Break) {
+      // Eliminate label if next is just a break statement
+      // Breaks to this label are redirected to the outer label.
+      // Note that breakCount for the two labels is updated proactively here
+      // so breaks can reliably tell if they should inline their target.
+      Break next = node.next;
+      Label newTarget = redirect(next.target);
+      labelRedirects[node.label] = newTarget;
+      newTarget.breakCount += node.label.breakCount;
+      node.label.breakCount = 0;
+      Statement result = visitStatement(node.body);
+      labelRedirects.remove(node.label); // Save some space.
+      return result;
+    }
+
+    node.body = visitStatement(node.body);
+
+    if (node.label.breakCount == 0) {
+      // Eliminate the label if next was inlined at a break
+      return node.body;
+    }
+
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitIf(If node) {
+    node.condition = visitExpression(node.condition);
+
+    environment.add(null); // impure expressions may not propagate across branch
+    node.thenStatement = visitStatement(node.thenStatement);
+    node.elseStatement = visitStatement(node.elseStatement);
+    environment.removeLast();
+
+    tryCollapseIf(node);
+
+    Statement reduced = combineStatementsWithSubexpressions(
+        node.thenStatement,
+        node.elseStatement,
+        (t,f) => new Conditional(node.condition, t, f)..processed = true);
+    if (reduced != null) {
+      if (reduced.next is Break) {
+        // In case the break can now be inlined.
+        reduced = visitStatement(reduced);
+      }
+      return reduced;
+    }
+
+    return node;
+  }
+
   Expression visitConstant(Constant node) {
     return node;
   }
-  
+
   Statement visitExpressionStatement(ExpressionStatement node) {
     node.expression = visitExpression(node.expression);
+    if (!node.expression.isPure) {
+      environment.add(null); // insert impurity marker (TODO: refactor)
+    }
+    node.next = visitStatement(node.next);
+    if (!node.expression.isPure) {
+      environment.removeLast();
+    }
+    return node;
+  }
+
+  /// If [s] and [t] are similar statements we extract their subexpressions
+  /// and returns a new statement of the same type using expressions combined
+  /// with the [combine] callback. For example:
+  ///
+  ///   combineStatements(Return E1, Return E2) = Return combine(E1, E2)
+  ///
+  /// If [combine] returns E1 then the unified statement is equivalent to [s],
+  /// and if [combine] returns E2 the unified statement is equivalence to [t].
+  ///
+  /// It is guaranteed that no side effects occur between the beginning of the
+  /// statement and the position of the combined expression.
+  ///
+  /// Returns null if the statements are too different.
+  ///
+  /// If non-null is returned, the caller MUST discard [s] and [t] and use
+  /// the returned statement instead.
+  static Statement combineStatementsWithSubexpressions(
+      Statement s,
+      Statement t,
+      Expression combine(Expression s, Expression t)) {
+    if (s is Return && t is Return) {
+      return new Return(combine(s.value, t.value));
+    }
+    if (s is Assign && t is Assign && s.variable == t.variable) {
+      Statement next = combineStatements(s.next, t.next);
+      if (next != null) {
+        return new Assign(s.variable,
+                          combine(s.definition, t.definition),
+                          next,
+                          s.hasExactlyOneUse);
+      }
+    }
+    if (s is ExpressionStatement && t is ExpressionStatement) {
+      Statement next = combineStatements(s.next, t.next);
+      if (next != null) {
+        return new ExpressionStatement(combine(s.expression, t.expression),
+                                       next);
+      }
+    }
+    return null;
+  }
+
+  /// Returns a statement equivalent to both [s] and [t], or null if [s] and
+  /// [t] are incompatible.
+  /// If non-null is returned, the caller MUST discard [s] and [t] and use
+  /// the returned statement instead.
+  /// If two breaks are combined, the label's break counter will be decremented.
+  static Statement combineStatements(Statement s, Statement t) {
+    if (s is Break && t is Break && s.target == t.target) {
+      --t.target.breakCount; // Two breaks become one.
+      return s;
+    }
+    if (s is Return && t is Return && equivalentExpressions(s.value, t.value)) {
+      return s;
+    }
+    return null;
+  }
+
+  /// True if the two expressions both syntactically and semantically
+  /// equivalent.
+  static bool equivalentExpressions(Expression e1, Expression e2) {
+    if (e1 == e2) { // Detect same variable reference
+      // TODO(asgerf): This might turn the variable into a single-use,
+      // but we currently don't discover this.
+      return true;
+    }
+    if (e1 is Constant && e2 is Constant) {
+      return e1.value == e2.value;
+    }
+    return false;
+  }
+
+  /// Try to collapse nested ifs using && and || expressions.
+  /// For example:
+  ///
+  ///   if (E1) { if (E2) S else break L } else break L
+  ///     ==>
+  ///   if (E1 && E2) S else break L
+  ///
+  /// [branch1] and [branch2] control the position of the S statement.
+  ///
+  /// Returns true if another collapse redex might have been introduced.
+  void tryCollapseIf(If node) {
+    // Repeatedly try to collapse nested ifs.
+    // The transformation is shrinking (destroys an if) so it remains linear.
+    // Here is an example where more than one iteration is required:
+    //
+    //   if (E1)
+    //     if (E2) break L2 else break L1
+    //   else
+    //     break L1
+    //
+    // L1.target ::=
+    //   if (E3) S else break L2
+    //
+    // After first collapse:
+    //
+    //   if (E1 && E2)
+    //     break L2
+    //   else
+    //     {if (E3) S else break L2}  (inlined from break L1)
+    //
+    // We can then do another collapse using the inlined nested if.
+    bool changed = true;
+    while (changed) {
+      changed = false;
+      if (tryCollapseIfAux(node, true, true)) {
+        changed = true;
+      }
+      if (tryCollapseIfAux(node, true, false)) {
+        changed = true;
+      }
+      if (tryCollapseIfAux(node, false, true)) {
+        changed = true;
+      }
+      if (tryCollapseIfAux(node, false, false)) {
+        changed = true;
+      }
+    }
+  }
+
+  bool tryCollapseIfAux(If outerIf, bool branch1, bool branch2) {
+    // NOTE: We name variables here as if S is in the then-then position.
+    Statement outerThen = getBranch(outerIf, branch1);
+    Statement outerElse = getBranch(outerIf, !branch1);
+    if (outerThen is If && outerElse is Break) {
+      If innerIf = outerThen;
+      Statement innerThen = getBranch(innerIf, branch2);
+      Statement innerElse = getBranch(innerIf, !branch2);
+      if (innerElse is Break && innerElse.target == outerElse.target) {
+        // We always put S in the then branch of the result, and adjust the
+        // condition expression if S was actually found in the else branch(es).
+        outerIf.condition = new LogicalOperator.and(
+            makeCondition(outerIf.condition, branch1),
+            makeCondition(innerIf.condition, branch2));
+        outerIf.thenStatement = innerThen;
+        --innerElse.target.breakCount;
+
+        // Try to inline the remaining break
+        environment.add(null); // Do not propagate impure definitions
+        outerIf.elseStatement = visitStatement(outerElse);
+        environment.removeLast();
+
+        return outerIf.elseStatement is If && innerThen is Break;
+      }
+    }
+    return false;
+  }
+
+  Expression makeCondition(Expression e, bool polarity) {
+    return polarity ? e : new Not(e);
+  }
+
+  Statement getBranch(If node, bool polarity) {
+    return polarity ? node.thenStatement : node.elseStatement;
+  }
+}
+
+
+
+/// Rewrites logical expressions to be more compact.
+///
+/// In this class an expression is said to occur in "boolean context" if
+/// its result is immediately applied to boolean conversion.
+///
+/// IF STATEMENTS:
+///
+/// We apply the following two rules to [If] statements (see [visitIf]).
+///
+///   if (E) {} else S  ==>  if (!E) S else {}    (else can be omitted)
+///   if (!E) S1 else S2  ==>  if (E) S2 else S1  (unless previous rule applied)
+///
+/// NEGATION:
+///
+/// De Morgan's Laws are used to rewrite negations of logical operators so
+/// negations are closer to the root:
+///
+///   !x && !y  -->  !(x || y)
+///
+/// This is to enable other rewrites, such as branch swapping in an if. In some
+/// contexts, the rule is reversed because we do not expect to apply a rewrite
+/// rule to the result. For example:
+///
+///   z = !(x || y)  ==>  z = !x && !y;
+///
+/// CONDITIONALS:
+///
+/// Conditionals with boolean constant operands occur frequently in the input.
+/// They can often the re-written to logical operators, for instance:
+///
+///   if (x ? y : false) S1 else S2
+///     ==>
+///   if (x && y) S1 else S2
+///
+/// Conditionals are tricky to rewrite when they occur out of boolean context.
+/// Here we must apply more conservative rules, such as:
+///
+///   x ? true : false  ==>  !!x
+///
+/// If an operand is known to be a boolean, we can introduce a logical operator:
+///
+///   x ? y : false  ==>  x && y   (if y is known to be a boolean)
+///
+/// The following sequence of rewrites demonstrates the merit of these rules:
+///
+///   x ? (y ? true : false) : false
+///   x ? !!y : false   (double negation introduced by [toBoolean])
+///   x && !!y          (!!y validated by [isBooleanValued])
+///   x && y            (double negation removed by [putInBooleanContext])
+///
+class LogicalRewriter extends Visitor<Statement, Expression> {
+
+  /// Statement to be executed next by natural fallthrough. Although fallthrough
+  /// is not introduced in this phase, we need to reason about fallthrough when
+  /// evaluating the benefit of swapping the branches of an [If].
+  Statement fallthrough;
+
+  void rewrite(FunctionDefinition definition) {
+    definition.body = visitStatement(definition.body);
+  }
+
+  Statement visitLabeledStatement(LabeledStatement node) {
+    Statement savedFallthrough = fallthrough;
+    fallthrough = node.next;
+    node.body = visitStatement(node.body);
+    fallthrough = savedFallthrough;
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitAssign(Assign node) {
+    node.definition = visitExpression(node.definition);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitReturn(Return node) {
+    node.value = visitExpression(node.value);
+    return node;
+  }
+
+  Statement visitBreak(Break node) {
+    return node;
+  }
+
+  bool isFallthroughBreak(Statement node) {
+    return node is Break && node.target.binding.next == fallthrough;
+  }
+
+  Statement visitIf(If node) {
+    // If one of the branches is empty (i.e. just a fallthrough), then that
+    // branch should preferrably be the 'else' so we won't have to print it.
+    // In other words, we wish to perform this rewrite:
+    //   if (E) {} else {S}
+    //     ==>
+    //   if (!E) {S}
+    // In the tree language, empty statements do not exist yet, so we must check
+    // if one branch contains a break that can be eliminated by fallthrough.
+
+    // Swap branches if then is a fallthrough break.
+    if (isFallthroughBreak(node.thenStatement)) {
+      node.condition = new Not(node.condition);
+      Statement tmp = node.thenStatement;
+      node.thenStatement = node.elseStatement;
+      node.elseStatement = tmp;
+    }
+
+    // Can the else part be eliminated?
+    // (Either due to the above swap or if the break was already there).
+    bool emptyElse = isFallthroughBreak(node.elseStatement);
+
+    node.condition = makeCondition(node.condition, true, liftNots: !emptyElse);
+    node.thenStatement = visitStatement(node.thenStatement);
+    node.elseStatement = visitStatement(node.elseStatement);
+
+    // If neither branch is empty, eliminate a negation in the condition
+    // if (!E) S1 else S2
+    //   ==>
+    // if (E) S2 else S1
+    if (!emptyElse && node.condition is Not) {
+      node.condition = (node.condition as Not).operand;
+      Statement tmp = node.thenStatement;
+      node.thenStatement = node.elseStatement;
+      node.elseStatement = tmp;
+    }
+
+    return node;
+  }
+
+  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;
   }
+
+
+  Expression visitVariable(Variable node) {
+    return node;
+  }
+
+  Expression visitInvokeStatic(InvokeStatic node) {
+    for (int i = 0; i < node.arguments.length; i++) {
+      node.arguments[i] = visitExpression(node.arguments[i]);
+    }
+    return node;
+  }
+
+  Expression visitInvokeMethod(InvokeMethod node) {
+    node.receiver = visitExpression(node.receiver);
+    for (int i = 0; i < node.arguments.length; i++) {
+      node.arguments[i] = visitExpression(node.arguments[i]);
+    }
+    return node;
+  }
+
+  Expression visitInvokeConstructor(InvokeConstructor node) {
+    for (int i = 0; i < node.arguments.length; i++) {
+      node.arguments[i] = visitExpression(node.arguments[i]);
+    }
+    return node;
+  }
+
+  Expression visitConcatenateStrings(ConcatenateStrings node) {
+    for (int i = 0; i < node.arguments.length; i++) {
+      node.arguments[i] = visitExpression(node.arguments[i]);
+    }
+    return node;
+  }
+
+  Expression visitConstant(Constant node) {
+    return node;
+  }
+
+  Expression visitNot(Not node) {
+    return toBoolean(makeCondition(node.operand, false, liftNots: false));
+  }
+
+  Expression visitConditional(Conditional node) {
+    // node.condition will be visited after the then and else parts, because its
+    // polarity depends on what rewrite we use.
+    node.thenExpression = visitExpression(node.thenExpression);
+    node.elseExpression = visitExpression(node.elseExpression);
+
+    // In the following, we must take care not to eliminate or introduce a
+    // boolean conversion.
+
+    // x ? true : false --> !!x
+    if (isTrue(node.thenExpression) && isFalse(node.elseExpression)) {
+      return toBoolean(makeCondition(node.condition, true, liftNots: false));
+    }
+    // x ? false : true --> !x
+    if (isFalse(node.thenExpression) && isTrue(node.elseExpression)) {
+      return toBoolean(makeCondition(node.condition, false, liftNots: false));
+    }
+
+    // x ? y : false ==> x && y  (if y is known to be a boolean)
+    if (isBooleanValued(node.thenExpression) && isFalse(node.elseExpression)) {
+      return new LogicalOperator.and(
+          makeCondition(node.condition, true, liftNots:false),
+          putInBooleanContext(node.thenExpression));
+    }
+    // x ? y : true ==> !x || y  (if y is known to be a boolean)
+    if (isBooleanValued(node.thenExpression) && isTrue(node.elseExpression)) {
+      return new LogicalOperator.or(
+          makeCondition(node.condition, false, liftNots: false),
+          putInBooleanContext(node.thenExpression));
+    }
+    // x ? true : y ==> x || y  (if y if known to be boolean)
+    if (isBooleanValued(node.elseExpression) && isTrue(node.thenExpression)) {
+      return new LogicalOperator.or(
+          makeCondition(node.condition, true, liftNots: false),
+          putInBooleanContext(node.elseExpression));
+    }
+    // x ? false : y ==> !x && y  (if y is known to be a boolean)
+    if (isBooleanValued(node.elseExpression) && isTrue(node.thenExpression)) {
+      return new LogicalOperator.and(
+          makeCondition(node.condition, false, liftNots: false),
+          putInBooleanContext(node.elseExpression));
+    }
+
+    node.condition = makeCondition(node.condition, true);
+
+    // !x ? y : z ==> x ? z : y
+    if (node.condition is Not) {
+      node.condition = (node.condition as Not).operand;
+      Expression tmp = node.thenExpression;
+      node.thenExpression = node.elseExpression;
+      node.elseExpression = tmp;
+    }
+
+    return node;
+  }
+
+  Expression visitLogicalOperator(LogicalOperator node) {
+    node.left = makeCondition(node.left, true);
+    node.right = makeCondition(node.right, true);
+    return node;
+  }
+
+  /// True if the given expression is known to evaluate to a boolean.
+  /// This will not recursively traverse [Conditional] expressions, but if
+  /// applied to the result of [visitExpression] conditionals will have been
+  /// rewritten anyway.
+  bool isBooleanValued(Expression e) {
+    return isTrue(e) || isFalse(e) || e is Not || e is LogicalOperator;
+  }
+
+  /// Rewrite an expression that was originally processed in a non-boolean
+  /// context.
+  Expression putInBooleanContext(Expression e) {
+    if (e is Not && e.operand is Not) {
+      return (e.operand as Not).operand;
+    } else {
+      return e;
+    }
+  }
+
+  /// Forces a boolean conversion of the given expression.
+  Expression toBoolean(Expression e) {
+    if (isBooleanValued(e))
+      return e;
+    else
+      return new Not(new Not(e));
+  }
+
+  /// Creates an equivalent boolean expression. The expression must occur in a
+  /// context where its result is immediately subject to boolean conversion.
+  /// If [polarity] if false, the negated condition will be created instead.
+  /// If [liftNots] is true (default) then Not expressions will be lifted toward
+  /// the root the condition so they can be eliminated by the caller.
+  Expression makeCondition(Expression e, bool polarity, {bool liftNots:true}) {
+    if (e is Not) {
+      // !!E ==> E
+      return makeCondition(e.operand, !polarity, liftNots: liftNots);
+    }
+    if (e is LogicalOperator) {
+      // If polarity=false, then apply the rewrite !(x && y) ==> !x || !y
+      e.left = makeCondition(e.left, polarity);
+      e.right = makeCondition(e.right, polarity);
+      if (!polarity) {
+        e.isAnd = !e.isAnd;
+      }
+      // !x && !y ==> !(x || y)  (only if lifting nots)
+      if (e.left is Not && e.right is Not && liftNots) {
+        e.left = (e.left as Not).operand;
+        e.right = (e.right as Not).operand;
+        e.isAnd = !e.isAnd;
+        return new Not(e);
+      }
+      return e;
+    }
+    if (e is Conditional) {
+      // Handle polarity by: !(x ? y : z) ==> x ? !y : !z
+      // Rewrite individual branches now. The condition will be rewritten
+      // when we know what polarity to use (depends on which rewrite is used).
+      e.thenExpression = makeCondition(e.thenExpression, polarity);
+      e.elseExpression = makeCondition(e.elseExpression, polarity);
+
+      // x ? true : false ==> x
+      if (isTrue(e.thenExpression) && isFalse(e.elseExpression)) {
+        return makeCondition(e.condition, true, liftNots: liftNots);
+      }
+      // x ? false : true ==> !x
+      if (isFalse(e.thenExpression) && isTrue(e.elseExpression)) {
+        return makeCondition(e.condition, false, liftNots: liftNots);
+      }
+      // x ? true : y  ==> x || y
+      if (isTrue(e.thenExpression)) {
+        return makeOr(makeCondition(e.condition, true),
+                      e.elseExpression,
+                      liftNots: liftNots);
+      }
+      // x ? false : y  ==> !x && y
+      if (isFalse(e.thenExpression)) {
+        return makeAnd(makeCondition(e.condition, false),
+                       e.elseExpression,
+                       liftNots: liftNots);
+      }
+      // x ? y : true  ==> !x || y
+      if (isTrue(e.elseExpression)) {
+        return makeOr(makeCondition(e.condition, false),
+                      e.thenExpression,
+                      liftNots: liftNots);
+      }
+      // x ? y : false  ==> x && y
+      if (isFalse(e.elseExpression)) {
+        return makeAnd(makeCondition(e.condition, true),
+                       e.thenExpression,
+                       liftNots: liftNots);
+      }
+
+      e.condition = makeCondition(e.condition, true);
+
+      // !x ? y : z ==> x ? z : y
+      if (e.condition is Not) {
+        e.condition = (e.condition as Not).operand;
+        Expression tmp = e.thenExpression;
+        e.thenExpression = e.elseExpression;
+        e.elseExpression = tmp;
+      }
+      // x ? !y : !z ==> !(x ? y : z)  (only if lifting nots)
+      if (e.thenExpression is Not && e.elseExpression is Not && liftNots) {
+        e.thenExpression = (e.thenExpression as Not).operand;
+        e.elseExpression = (e.elseExpression as Not).operand;
+        return new Not(e);
+      }
+      return e;
+    }
+    if (e is Constant && e.value is dart2js.BoolConstant) {
+      // !true ==> false
+      if (!polarity) {
+        e.value = (e.value as dart2js.BoolConstant).negate();
+      }
+      return e;
+    }
+    e = visitExpression(e);
+    return polarity ? e : new Not(e);
+  }
+
+  bool isTrue(Expression e) {
+    return e is Constant && e.value is dart2js.TrueConstant;
+  }
+
+  bool isFalse(Expression e) {
+    return e is Constant && e.value is dart2js.FalseConstant;
+  }
+
+  Expression makeAnd(Expression e1, Expression e2, {bool liftNots: true}) {
+    if (e1 is Not && e2 is Not && liftNots) {
+      return new Not(new LogicalOperator.or(e1.operand, e2.operand));
+    } else {
+      return new LogicalOperator.and(e1, e2);
+    }
+  }
+
+  Expression makeOr(Expression e1, Expression e2, {bool liftNots: true}) {
+    if (e1 is Not && e2 is Not && liftNots) {
+      return new Not(new LogicalOperator.and(e1.operand, e2.operand));
+    } else {
+      return new LogicalOperator.or(e1, e2);
+    }
+  }
+
 }
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 e93f548..2c191ec 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
@@ -1,3 +1,7 @@
+// 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 dart_tree_printer;
 
 import 'dart_printer.dart';
@@ -12,47 +16,47 @@
 /// Converts backend ASTs to frontend ASTs.
 class TreePrinter {
   dart2js.TreeElementMapping treeElements;
-  
+
   TreePrinter([this.treeElements]);
-  
-  void setElement(tree.Node node, elements.Element element) {
+
+  void setElement(tree.Node node, elements.Element element, source) {
     if (treeElements != null) {
       if (element == null) {
-        throw "Missing element";
+        throw "Missing element from ${source}";
       }
       treeElements[node] = element;
     }
   }
-  
-  void setType(tree.Node node, types.DartType type) {
+
+  void setType(tree.Node node, types.DartType type, source) {
     if (treeElements != null) {
       if (type == null) {
-        throw "Missing type from ${node.runtimeType}";
+        throw "Missing type from ${source}";
       }
       treeElements.setType(node, type);
     }
   }
-  
+
   // Group tokens: () [] {} <>
   static BeginGroupToken makeGroup(PrecedenceInfo open, PrecedenceInfo close) {
     BeginGroupToken openTok = new BeginGroupToken(open, -1);
     openTok.endGroup = new SymbolToken(close, -1);
     return openTok;
   }
-  
-  final BeginGroupToken openParen = makeGroup(OPEN_PAREN_INFO, 
+
+  final BeginGroupToken openParen = makeGroup(OPEN_PAREN_INFO,
                                               CLOSE_PAREN_INFO);
-  final BeginGroupToken openBrace = makeGroup(OPEN_CURLY_BRACKET_INFO, 
+  final BeginGroupToken openBrace = makeGroup(OPEN_CURLY_BRACKET_INFO,
                                               CLOSE_CURLY_BRACKET_INFO);
-  final BeginGroupToken openBracket = makeGroup(OPEN_SQUARE_BRACKET_INFO, 
+  final BeginGroupToken openBracket = makeGroup(OPEN_SQUARE_BRACKET_INFO,
                                                 CLOSE_SQUARE_BRACKET_INFO);
   final BeginGroupToken lt = makeGroup(LT_INFO, GT_INFO);
-  
+
   Token get closeParen => openParen.endGroup;
   Token get closeBrace => openBrace.endGroup;
   Token get closeBracket => openBracket.endGroup;
   Token get gt => lt.endGroup;
-  
+
   // Symbol tokens
   final Token semicolon = new SymbolToken(SEMICOLON_INFO, -1);
   final Token indexToken = new SymbolToken(INDEX_INFO, -1); // "[]"
@@ -61,7 +65,7 @@
   final Token hash = new SymbolToken(HASH_INFO, -1);
   final Token bang = new SymbolToken(BANG_INFO, -1);
   final Token eq = new SymbolToken(EQ_INFO, -1);
-  
+
   // Keyword tokens
   static Token makeIdToken(String text) {
     return new StringToken.fromString(IDENTIFIER_INFO, text, -1);
@@ -86,12 +90,12 @@
   final Token catchToken = makeIdToken('catch');
   final Token onToken = makeIdToken('on');
   final Token finallyToken = makeIdToken('finally');
-  
+
   static tree.Identifier makeIdentifier(String name) {
     return new tree.Identifier(
         new StringToken.fromString(IDENTIFIER_INFO, name, -1));
   }
-  
+
   // Utilities for creating NodeLists
   Link<tree.Node> makeLink(Iterable<tree.Node> nodes) {
     LinkBuilder builder = new LinkBuilder();
@@ -100,14 +104,14 @@
     }
     return builder.toLink();
   }
-  
+
   tree.NodeList blankList() {
     return new tree.NodeList(null, makeLink([]), null, '');
   }
   tree.NodeList singleton(tree.Node node) {
     return new tree.NodeList(null, makeLink([node]), null, '');
   }
-  tree.NodeList makeList(String delimiter, 
+  tree.NodeList makeList(String delimiter,
                          Iterable<tree.Node> nodes,
                          { Token open,
                            Token close }) {
@@ -128,7 +132,7 @@
   tree.NodeList typeArgList(Iterable<tree.Node> nodes) {
     return makeList(',', nodes, open: lt, close: gt);
   }
-  
+
   /// Converts a qualified name into nested Sends.
   tree.Node makeName(String name) {
     if (name == null) {
@@ -141,7 +145,7 @@
     }
     return node;
   }
-  
+
   static Token assignmentToken(String operatorName) {
     switch (operatorName) {
       case '=': return new SymbolToken(EQ_INFO, -1);
@@ -160,7 +164,7 @@
         throw "Unrecognized assignment operator: $operatorName";
     }
   }
-  
+
   static Token binopToken(String operatorName) {
     switch (operatorName) {
       case '+': return new SymbolToken(PLUS_INFO, -1);
@@ -186,7 +190,7 @@
         throw "Unrecognized binary operator: $operatorName";
     }
   }
-  
+
   static Token incrementToken(String operatorName) {
     switch (operatorName) {
       case '++': return new SymbolToken(PLUS_PLUS_INFO, -1);
@@ -195,7 +199,7 @@
         throw "Unrecognized increment operator: $operatorName";
     }
   }
-  
+
   static Token typeOpToken(String operatorName) {
     switch (operatorName) { // "is!" is not an operator in the frontend AST.
       case 'is': return new SymbolToken(IS_INFO, -1);
@@ -204,7 +208,7 @@
         throw 'Unrecognized type operator: $operatorName';
     }
   }
-  
+
   Token unopToken(String operatorName) {
     switch (operatorName) {
       case '-': return new SymbolToken(MINUS_INFO, -1);
@@ -214,25 +218,25 @@
         throw "Unrecognized unary operator: $operatorName";
     }
   }
-  
+
   tree.Node makeArgument(Argument arg) {
     if (arg is Expression) {
       return makeExpression(arg);
     } else if (arg is NamedArgument) {
       return new tree.NamedArgument(
-          makeIdentifier(arg.name), 
-          colon, 
+          makeIdentifier(arg.name),
+          colon,
           makeExpression(arg.expression));
     } else {
-      throw "Unrecognized argument type: ${arg.runtimeType}";
+      throw "Unrecognized argument type: ${arg}";
     }
   }
-  
+
   tree.Node makeExpression(Expression exp) {
     return makeExp(exp, EXPRESSION);
   }
-  
-  /// Converts [exp] to a [tree.Node] that unparses to an expression with 
+
+  /// Converts [exp] to a [tree.Node] that unparses to an expression with
   /// a precedence level of at least [minPrecedence]. The expression will be
   /// wrapped in a parenthesis if necessary.
   tree.Node makeExp(Receiver exp, int minPrecedence, {bool beginStmt: false}) {
@@ -260,14 +264,16 @@
       } else if (left is IndexExpression) {
         receiver = makeExp(left.object, PRIMARY, beginStmt: beginStmt);
         selector = new tree.Operator(indexToken);
-        arguments = bracketList(',', 
+        arguments = bracketList(',',
             [makeExpression(left.index), makeExpression(exp.right)]);
       } else {
-        throw "Unexpected left-hand side of assignment: ${left.runtimeType}";
+        throw "Unexpected left-hand side of assignment: ${left}";
       }
       tree.Operator op = new tree.Operator(assignmentToken(exp.operatorName));
       result = new tree.SendSet(receiver, selector, op, arguments);
-      setElement(result, element);
+      if (left is Identifier) {
+        setElement(result, element, exp);
+      }
       precedence = EXPRESSION;
     } else if (exp is BinaryOperator) {
       precedence = BINARY_PRECEDENCE[exp.operatorName];
@@ -283,11 +289,11 @@
       if (callee is Identifier) {
         selector = makeIdentifier(callee.name);
       } else {
-        selector = makeExp(callee, CALLEE, beginStmt: beginStmt); 
+        selector = makeExp(callee, CALLEE, beginStmt: beginStmt);
       }
       result = new tree.Send(
-          null, 
-          selector, 
+          null,
+          selector,
           argList(exp.arguments.map(makeArgument)));
     } else if (exp is CallMethod) {
       precedence = CALLEE;
@@ -302,32 +308,36 @@
         selector = new tree.TypeAnnotation(
             selector,
             typeArgList(exp.type.typeArguments.map(makeType)));
+        setType(selector, exp.dartType, exp);
       }
       if (exp.constructorName != null) {
         selector = new tree.Send(
             selector,
             makeIdentifier(exp.constructorName));
       }
+      tree.Send send = new tree.Send(
+          null,
+          selector,
+          argList(exp.arguments.map(makeArgument)));
       result = new tree.NewExpression(
           exp.isConst ? constToken : newToken,
-          new tree.Send(
-            null,
-            selector,
-            argList(exp.arguments.map(makeArgument))));
+          send);
+      setType(result, exp.dartType, exp);
+      setElement(send, exp.constructor, exp);
     } else if (exp is CallStatic) {
       precedence = CALLEE;
       result = new tree.Send(
           makeName(exp.className),
           makeIdentifier(exp.methodName),
           argList(exp.arguments.map(makeArgument)));
-      setElement(result, exp.element);
+      setElement(result, exp.element, exp);
     } else if (exp is Conditional) {
       precedence = CONDITIONAL;
       result = new tree.Conditional(
           makeExp(exp.condition, LOGICAL_OR, beginStmt: beginStmt),
           makeExp(exp.thenExpression, EXPRESSION),
           makeExp(exp.elseExpression, EXPRESSION),
-          question, 
+          question,
           colon);
     } else if (exp is FieldExpression) {
       precedence = PRIMARY;
@@ -347,11 +357,11 @@
           makeEmptyModifiers(), // TODO(asgerf): Function modifiers?
           null,  // initializers
           null); // get/set
-      setElement(result, exp.element);
+      setElement(result, exp.element, exp);
     } else if (exp is Identifier) {
       precedence = CALLEE;
       result = new tree.Send(null, makeIdentifier(exp.name));
-      setElement(result, exp.element);
+      setElement(result, exp.element, exp);
     } else if (exp is Increment) {
       Expression lvalue = exp.expression;
       tree.Node receiver;
@@ -368,7 +378,7 @@
         selector = new tree.Operator(indexToken);
         argument = makeExpression(lvalue.index);
       } else {
-        throw "Unrecognized left-hand side: ${lvalue.runtimeType}";
+        throw "Unrecognized left-hand side: ${lvalue}";
       }
       tree.Operator op = new tree.Operator(incrementToken(exp.operatorName));
       if (exp.isPrefix) {
@@ -389,17 +399,27 @@
       dart2js.PrimitiveConstant value = exp.value;
       Token tok = new StringToken.fromString(STRING_INFO, '${value.value}', -1);
       if (value is dart2js.StringConstant) {
-        result = new tree.LiteralString(tok, value.value);
+        result = unparseStringLiteral(exp);
       } else if (value is dart2js.IntConstant) {
         result = new tree.LiteralInt(tok, null);
       } else if (value is dart2js.DoubleConstant) {
+        if (value.value == double.INFINITY) {
+          precedence = MULTIPLICATIVE;
+          tok = new StringToken.fromString(STRING_INFO, '1/0.0', -1);
+        } else if (value.value == double.NEGATIVE_INFINITY) {
+          precedence = MULTIPLICATIVE;
+          tok = new StringToken.fromString(STRING_INFO, '-1/0.0', -1);
+        } else if (value.value.isNaN) {
+          precedence = MULTIPLICATIVE;
+          tok = new StringToken.fromString(STRING_INFO, '0/0.0', -1);
+        }
         result = new tree.LiteralDouble(tok, null);
       } else if (value is dart2js.BoolConstant) {
         result = new tree.LiteralBool(tok, null);
       } else if (value is dart2js.NullConstant) {
         result = new tree.LiteralNull(tok);
       } else {
-        throw "Unrecognized constant: ${value.runtimeType}";
+        throw "Unrecognized constant: ${value}";
       }
     } else if (exp is LiteralList) {
       precedence = PRIMARY;
@@ -409,7 +429,7 @@
       }
       result = new tree.LiteralList(
           typeArgs,
-          bracketList(',', exp.values.map(makeExpression)), 
+          bracketList(',', exp.values.map(makeExpression)),
           exp.isConst ? constToken : null);
     } else if (exp is LiteralMap) {
       precedence = PRIMARY;
@@ -428,130 +448,19 @@
     } else if (exp is LiteralSymbol) {
       precedence = PRIMARY;
       result = new tree.LiteralSymbol(
-          hash, 
+          hash,
           makeList('.', exp.id.split('.').map(makeIdentifier)));
     } else if (exp is StringConcat) {
       precedence = PRIMARY;
-      if (exp.expressions.length == 0) {
-        result = new tree.LiteralString(
-            new StringToken.fromString(STRING_INFO, '""', -1), 
-            new tree.DartString.empty());
-      } else {
-        StringLiteralOutput output = Unparser.analyzeStringLiteral(exp);
-        List parts = output.parts;
-        tree.Node printStringChunk(StringChunk chunk) {
-          bool raw = chunk.quoting.raw;
-          int quoteCode = chunk.quoting.quote;
-          
-          List<tree.StringInterpolationPart> literalParts = [];
-          tree.LiteralString firstLiteral;
-          tree.Node currentInterpolation;
-          
-          // sb contains the current unfinished LiteralString
-          StringBuffer sb = new StringBuffer();
-          if (raw) {
-            sb.write('r');
-          }
-          for (int i = 0; i < chunk.quoting.leftQuoteCharCount; i++) {
-            sb.write(chunk.quoting.quoteChar);
-          }
-
-          // Print every character and string interpolation
-          int startIndex = chunk.previous != null ? chunk.previous.endIndex : 0;
-          for (int i = startIndex; i < chunk.endIndex; i++) {
-            var part = parts[i];
-            if (part is Expression) {
-              // Finish the previous string interpolation, if there is one.
-              tree.LiteralString lit = makeVerbatimStringLiteral(sb.toString());
-              if (currentInterpolation != null) {
-                literalParts.add(new tree.StringInterpolationPart(
-                    currentInterpolation, 
-                    lit));
-              } else {
-                firstLiteral = lit;
-              }
-              sb.clear();
-              currentInterpolation = makeExpression(part);
-            } else {
-              int char = part;
-              switch (char) {
-                case characters.$$:
-                  if (raw)
-                    sb.write(r'$');
-                  else
-                    sb.write(r'\$');
-                  break;
-                case characters.$BACKSLASH:
-                  if (raw)
-                    sb.write(r'\');
-                  else
-                    sb.write(r'\\');
-                  break;
-                case characters.$DQ:
-                  if (quoteCode == char) {
-                    sb.write(r'\"');
-                  } else {
-                    sb.write(r'"');
-                  }
-                  break;
-                case characters.$SQ:
-                  if (quoteCode == char) {
-                    sb.write(r"\'");
-                  } else {
-                    sb.write(r"'");
-                  }
-                  break;
-                case NEWLINE:
-                  sb.write(r'\n');
-                  break;
-                case CARRIAGE_RETURN:
-                  sb.write(r'\r');
-                  break;
-                default:
-                  sb.write(new String.fromCharCode(char));
-              }
-            }
-          }
-          
-          // Print ending quotes
-          for (int i = 0; i < chunk.quoting.rightQuoteLength; i++) {
-            sb.write(chunk.quoting.quoteChar);
-          }
-          
-          // Finish the previous string interpolation, if there is one.
-          // Then wrap everything in a StringInterpolation, if relevant.
-          tree.LiteralString lit = makeVerbatimStringLiteral(sb.toString());
-          tree.Node node;
-          if (firstLiteral == null) {
-            node = lit;
-          } else {
-            literalParts.add(new tree.StringInterpolationPart(
-                currentInterpolation,
-                lit));
-            node = new tree.StringInterpolation(
-                firstLiteral, 
-                makeList('', literalParts));
-          }
-          
-          // Juxtapose with the previous string chunks, if any.
-          if (chunk.previous != null) {
-            return new tree.StringJuxtaposition(
-                printStringChunk(chunk.previous),
-                node);
-          } else {
-            return node;
-          }
-        }
-        result = printStringChunk(output.chunk);
-      }
+      result = unparseStringLiteral(exp);
     } else if (exp is This) {
       precedence = CALLEE;
       result = makeIdentifier('this');
     } else if (exp is Throw) {
       precedence = EXPRESSION; // ???
       result = new tree.Throw(
-          makeExpression(exp.expression), 
-          throwToken, 
+          makeExpression(exp.expression),
+          throwToken,
           throwToken); // endToken not used by unparser
     } else if (exp is TypeOperator) {
       precedence = RELATIONAL;
@@ -560,8 +469,8 @@
       if (exp.operatorName == 'is!') {
         operator = new tree.Operator(typeOpToken('is'));
         rightOperand = new tree.Send(
-            rightOperand, 
-            new tree.Operator(bang), 
+            rightOperand,
+            new tree.Operator(bang),
             blankList());
       } else {
         operator = new tree.Operator(typeOpToken(exp.operatorName));
@@ -576,66 +485,90 @@
           makeExp(exp.operand, UNARY),
           new tree.Operator(unopToken(exp.operatorName)));
     } else {
-      throw "Unknown expression type: ${exp.runtimeType}";
+      throw "Unknown expression type: ${exp}";
     }
-    
+
     needParen = needParen || precedence < minPrecedence;
     if (needParen) {
       result = parenthesize(result);
     }
     return result;
   }
-  
-  /// Creates a LiteralString with [verbatim] as the value. 
-  /// No (un)quoting or (un)escaping will be performed by this method. 
+
+  /// Creates a LiteralString with [verbatim] as the value.
+  /// No (un)quoting or (un)escaping will be performed by this method.
   /// The [DartString] inside the literal will be set to null because the
-  /// code emitter does not use it. 
+  /// code emitter does not use it.
   tree.LiteralString makeVerbatimStringLiteral(String verbatim) {
     Token tok = new StringToken.fromString(STRING_INFO, verbatim, -1);
     return new tree.LiteralString(tok, null);
   }
-  
+
   tree.LiteralMapEntry makeLiteralMapEntry(LiteralMapEntry en) {
     return new tree.LiteralMapEntry(
-        makeExpression(en.key), 
-        colon, 
+        makeExpression(en.key),
+        colon,
         makeExpression(en.value));
   }
-  
+
   /// Produces a statement in a context where only blocks are allowed.
   tree.Node makeBlock(Statement stmt) {
     if (stmt is Block)
       return makeStatement(stmt);
     else {
-      return new tree.Block(singleton(makeStatement(stmt)));
+      return new tree.Block(braceList('', [makeStatement(stmt)]));
     }
   }
-  
+
+  /// Adds the given statement to a block. If the statement itself is a block
+  /// it will be flattened (if this does not change lexical scoping).
+  void addBlockMember(Statement stmt, List<tree.Node> accumulator) {
+    if (stmt is Block && !stmt.statements.any(Unparser.definesVariable)) {
+      for (Statement innerStmt in stmt.statements) {
+        addBlockMember(innerStmt, accumulator);
+      }
+    } else if (stmt is EmptyStatement) {
+      // No need to include empty statements inside blocks
+    } else {
+      accumulator.add(makeStatement(stmt));
+    }
+  }
+
+  /// True if [stmt] is equivalent to an empty statement.
+  bool isEmptyStatement(Statement stmt) {
+    return stmt is EmptyStatement ||
+          (stmt is Block && stmt.statements.every(isEmptyStatement));
+  }
+
   tree.Node makeStatement(Statement stmt, {bool shortIf: true}) {
     if (stmt is Block) {
-      return new tree.Block(braceList('', stmt.statements.map(makeStatement)));
+      List<tree.Node> body = <tree.Node>[];
+      for (Statement innerStmt in stmt.statements) {
+        addBlockMember(innerStmt, body);
+      }
+      return new tree.Block(braceList('', body));
     } else if (stmt is Break) {
       return new tree.BreakStatement(
-          stmt.label == null ? null : makeIdentifier(stmt.label), 
-          breakToken, 
+          stmt.label == null ? null : makeIdentifier(stmt.label),
+          breakToken,
           semicolon);
     } else if (stmt is Continue) {
       return new tree.ContinueStatement(
-          stmt.label == null ? null : makeIdentifier(stmt.label), 
-          continueToken, 
+          stmt.label == null ? null : makeIdentifier(stmt.label),
+          continueToken,
           semicolon);
     } else if (stmt is DoWhile) {
       return new tree.DoWhile(
-          makeStatement(stmt.body, shortIf: shortIf), 
-          parenthesize(makeExpression(stmt.condition)), 
-          doToken, 
-          whileToken, 
+          makeStatement(stmt.body, shortIf: shortIf),
+          parenthesize(makeExpression(stmt.condition)),
+          doToken,
+          whileToken,
           semicolon);
     } else if (stmt is EmptyStatement) {
       return new tree.EmptyStatement(semicolon);
     } else if (stmt is ExpressionStatement) {
       return new tree.ExpressionStatement(
-          makeExp(stmt.expression, EXPRESSION, beginStmt: true), 
+          makeExp(stmt.expression, EXPRESSION, beginStmt: true),
           semicolon);
     } else if (stmt is For) {
       tree.Node initializer;
@@ -649,16 +582,16 @@
       tree.Node condition;
       if (stmt.condition != null) {
         condition = new tree.ExpressionStatement(
-            makeExpression(stmt.condition), 
+            makeExpression(stmt.condition),
             semicolon);
       } else {
         condition = new tree.EmptyStatement(semicolon);
       }
       return new tree.For(
-          initializer, 
-          condition, 
-          makeList(',', stmt.updates.map(makeExpression)), 
-          makeStatement(stmt.body, shortIf: shortIf), 
+          initializer,
+          condition,
+          makeList(',', stmt.updates.map(makeExpression)),
+          makeStatement(stmt.body, shortIf: shortIf),
           forToken);
     } else if (stmt is ForIn) {
       tree.Node left;
@@ -670,8 +603,8 @@
       return new tree.ForIn(
           left,
           makeExpression(stmt.expression),
-          makeStatement(stmt.body, shortIf: shortIf), 
-          forToken, 
+          makeStatement(stmt.body, shortIf: shortIf),
+          forToken,
           inToken);
     } else if (stmt is FunctionDeclaration) {
       return new tree.FunctionDeclaration(new tree.FunctionExpression(
@@ -683,9 +616,9 @@
           null,  // initializers
           null)); // get/set
     } else if (stmt is If) {
-      if (stmt.elseStatement == null) {
+      if (stmt.elseStatement == null || isEmptyStatement(stmt.elseStatement)) {
         tree.Node node = new tree.If(
-            parenthesize(makeExpression(stmt.condition)), 
+            parenthesize(makeExpression(stmt.condition)),
             makeStatement(stmt.thenStatement),
             null, // else statement
             ifToken,
@@ -696,7 +629,7 @@
           return new tree.Block(braceList('', [node]));
       } else {
         return new tree.If(
-            parenthesize(makeExpression(stmt.condition)), 
+            parenthesize(makeExpression(stmt.condition)),
             makeStatement(stmt.thenStatement, shortIf: false),
             makeStatement(stmt.elseStatement, shortIf: shortIf),
             ifToken,
@@ -711,94 +644,97 @@
         inner = lbl.statement;
       }
       return new tree.LabeledStatement(
-          makeList('', labels), 
+          makeList('', labels),
           makeStatement(inner, shortIf: shortIf));
     } else if (stmt is Rethrow) {
       return new tree.Rethrow(rethrowToken, semicolon);
     } else if (stmt is Return) {
       return new tree.Return(
-          returnToken, 
-          semicolon, 
+          returnToken,
+          semicolon,
           stmt.expression == null ? null : makeExpression(stmt.expression));
     } else if (stmt is Switch) {
       return new tree.SwitchStatement(
-          parenthesize(makeExpression(stmt.expression)), 
-          braceList('', stmt.cases.map(makeSwitchCase)), 
+          parenthesize(makeExpression(stmt.expression)),
+          braceList('', stmt.cases.map(makeSwitchCase)),
           switchToken);
     } else if (stmt is Try) {
       return new tree.TryStatement(
-          makeBlock(stmt.tryBlock), 
-          braceList('', stmt.catchBlocks.map(makeCatchBlock)), 
-          stmt.finallyBlock == null ? null : makeBlock(stmt.finallyBlock), 
-          tryToken, 
+          makeBlock(stmt.tryBlock),
+          braceList('', stmt.catchBlocks.map(makeCatchBlock)),
+          stmt.finallyBlock == null ? null : makeBlock(stmt.finallyBlock),
+          tryToken,
           finallyToken);
     } else if (stmt is VariableDeclarations) {
       return makeVariableDeclarations(stmt, useVar: true, endToken: semicolon);
     } else if (stmt is While) {
       return new tree.While(
-          parenthesize(makeExpression(stmt.condition)), 
-          makeStatement(stmt.body, shortIf: shortIf), 
+          parenthesize(makeExpression(stmt.condition)),
+          makeStatement(stmt.body, shortIf: shortIf),
           whileToken);
     } else {
-      throw "Unrecognized statement: ${stmt.runtimeType}";
+      throw "Unrecognized statement: ${stmt}";
     }
   }
-  
+
   tree.Node makeVariableDeclaration(VariableDeclaration vd) {
-    if (vd.initializer == null)
-      return makeIdentifier(vd.name);
-    else {
-      return new tree.SendSet(
+    tree.Node id = makeIdentifier(vd.name);
+    setElement(id, vd.element, vd);
+    if (vd.initializer == null) {
+      return id;
+    }
+    tree.Node send = new tree.SendSet(
           null,
-          makeIdentifier(vd.name),
+          id,
           new tree.Operator(eq),
           singleton(makeExpression(vd.initializer)));
-    }
+    setElement(send, vd.element, vd);
+    return send;
   }
-  
-  /// If [useVar] is true, the variable definition will use `var` as modifier 
+
+  /// If [useVar] is true, the variable definition will use `var` as modifier
   /// if no other modifiers are present.
   /// [endToken] will be used to terminate the declaration list.
-  tree.Node makeVariableDeclarations(VariableDeclarations decl, 
+  tree.Node makeVariableDeclarations(VariableDeclarations decl,
                                       { bool useVar: false,
                                         Token endToken: null }) {
     return new tree.VariableDefinitions(
-        decl.type == null ? null : makeType(decl.type), 
-        makeVarModifiers(isConst: decl.isConst, 
+        decl.type == null ? null : makeType(decl.type),
+        makeVarModifiers(isConst: decl.isConst,
                           isFinal: decl.isFinal,
-                          useVar: useVar && decl.type == null), 
-        makeList(',', 
+                          useVar: useVar && decl.type == null),
+        makeList(',',
             decl.declarations.map(makeVariableDeclaration),
             close: endToken));
   }
-  
+
   tree.CatchBlock makeCatchBlock(CatchBlock block) {
     List<tree.VariableDefinitions> formals = [];
     if (block.exceptionVar != null) {
       formals.add(new tree.VariableDefinitions(
-          null, 
-          makeEmptyModifiers(), 
+          null,
+          makeEmptyModifiers(),
           singleton(makeIdentifier(block.exceptionVar))));
     }
     if (block.stackVar != null) {
       formals.add(new tree.VariableDefinitions(
-          null, 
-          makeEmptyModifiers(), 
+          null,
+          makeEmptyModifiers(),
           singleton(makeIdentifier(block.stackVar))));
     }
     return new tree.CatchBlock(
-        block.onType == null ? null : makeType(block.onType), 
-        block.exceptionVar == null ? null : argList(formals), 
-        makeBlock(block.body), 
-        block.onType == null ? null : onToken, 
+        block.onType == null ? null : makeType(block.onType),
+        block.exceptionVar == null ? null : argList(formals),
+        makeBlock(block.body),
+        block.onType == null ? null : onToken,
         block.exceptionVar == null ? null : catchToken);
   }
-  
+
   tree.SwitchCase makeSwitchCase(SwitchCase caze) {
     if (caze.isDefaultCase) {
       return new tree.SwitchCase(
-          blankList(), 
-          defaultToken, 
+          blankList(),
+          defaultToken,
           makeList('', caze.statements.map(makeStatement)),
           null); // startToken unused by unparser
     } else {
@@ -809,11 +745,11 @@
           null); // startToken unused by unparser
     }
   }
-  
+
   tree.CaseMatch makeCaseMatch(Expression exp) {
     return new tree.CaseMatch(caseToken, makeExpression(exp), colon);
   }
-  
+
   tree.TypeAnnotation makeType(TypeAnnotation type) {
     tree.NodeList typeArgs;
     if (type.typeArguments.length > 0) {
@@ -821,14 +757,14 @@
     } else {
       typeArgs = null;
     }
-    tree.TypeAnnotation result = 
+    tree.TypeAnnotation result =
         new tree.TypeAnnotation(makeIdentifier(type.name), typeArgs);
-    setType(result, type.dartType);
+    setType(result, type.dartType, type);
     return result;
   }
-  
+
   tree.NodeList makeParameters(Parameters params) {
-    List<tree.Node> nodes = 
+    List<tree.Node> nodes =
         params.requiredParameters.map(makeParameter).toList();
     if (params.hasOptionalParameters) {
       Token assign = params.hasNamedParameters ? colon : eq;
@@ -839,17 +775,17 @@
     }
     return argList(nodes);
   }
-  
+
   /// [assignOperator] is used for writing the default value.
   tree.Node makeParameter(Parameter param, [Token assignOperator]) {
     if (param.isFunction) {
       tree.Node definition = new tree.FunctionExpression(
-          makeIdentifier(param.name), 
-          makeParameters(param.parameters), 
-          null, // body 
-          param.type == null ? null : makeType(param.type), 
-          makeEmptyModifiers(), // TODO: Function parameter modifiers? 
-          null, // initializers 
+          makeIdentifier(param.name),
+          makeParameters(param.parameters),
+          null, // body
+          param.type == null ? null : makeType(param.type),
+          makeEmptyModifiers(), // TODO: Function parameter modifiers?
+          null, // initializers
           null); // get/set
       if (param.defaultValue != null) {
         return new tree.SendSet(
@@ -864,25 +800,25 @@
       tree.Node definition;
       if (param.defaultValue != null) {
         definition = new tree.SendSet(
-            null, 
-            makeIdentifier(param.name), 
-            new tree.Operator(assignOperator), 
+            null,
+            makeIdentifier(param.name),
+            new tree.Operator(assignOperator),
             singleton(makeExpression(param.defaultValue)));
       } else {
         definition = makeIdentifier(param.name);
       }
-      setElement(definition, param.element);
+      setElement(definition, param.element, param);
       return new tree.VariableDefinitions(
-          param.type == null ? null : makeType(param.type), 
-          makeEmptyModifiers(), // TODO: Parameter modifiers? 
+          param.type == null ? null : makeType(param.type),
+          makeEmptyModifiers(), // TODO: Parameter modifiers?
           singleton(definition));
     }
   }
-  
+
   tree.Modifiers makeEmptyModifiers() {
     return new tree.Modifiers(blankList());
   }
-  
+
   tree.Modifiers makeVarModifiers({bool isConst: false,
                                bool isFinal: false,
                                bool useVar: false}) {
@@ -898,9 +834,83 @@
     }
     return new tree.Modifiers(makeList('', nodes));
   }
-  
+
   tree.Node parenthesize(tree.Node node) {
     return new tree.ParenthesizedExpression(node, openParen);
   }
-  
+
+  tree.Node unparseStringLiteral(Expression exp) {
+    StringLiteralOutput output = Unparser.analyzeStringLiteral(exp);
+    List parts = output.parts;
+    tree.Node printStringChunk(StringChunk chunk) {
+      bool raw = chunk.quoting.raw;
+      int quoteCode = chunk.quoting.quote;
+
+      List<tree.StringInterpolationPart> literalParts = [];
+      tree.LiteralString firstLiteral;
+      tree.Node currentInterpolation;
+
+      // sb contains the current unfinished LiteralString
+      StringBuffer sb = new StringBuffer();
+      if (raw) {
+        sb.write('r');
+      }
+      for (int i = 0; i < chunk.quoting.leftQuoteCharCount; i++) {
+        sb.write(chunk.quoting.quoteChar);
+      }
+
+      // Print every character and string interpolation
+      int startIndex = chunk.previous != null ? chunk.previous.endIndex : 0;
+      for (int i = startIndex; i < chunk.endIndex; i++) {
+        var part = parts[i];
+        if (part is Expression) {
+          // Finish the previous string interpolation, if there is one.
+          tree.LiteralString lit = makeVerbatimStringLiteral(sb.toString());
+          if (currentInterpolation != null) {
+            literalParts.add(new tree.StringInterpolationPart(
+                currentInterpolation,
+                lit));
+          } else {
+            firstLiteral = lit;
+          }
+          sb.clear();
+          currentInterpolation = makeExpression(part);
+        } else {
+          int char = part;
+          sb.write(Unparser.getEscapedCharacter(char, quoteCode, raw));
+        }
+      }
+
+      // Print ending quotes
+      for (int i = 0; i < chunk.quoting.rightQuoteLength; i++) {
+        sb.write(chunk.quoting.quoteChar);
+      }
+
+      // Finish the previous string interpolation, if there is one.
+      // Then wrap everything in a StringInterpolation, if relevant.
+      tree.LiteralString lit = makeVerbatimStringLiteral(sb.toString());
+      tree.Node node;
+      if (firstLiteral == null) {
+        node = lit;
+      } else {
+        literalParts.add(new tree.StringInterpolationPart(
+            currentInterpolation,
+            lit));
+        node = new tree.StringInterpolation(
+            firstLiteral,
+            makeList('', literalParts));
+      }
+
+      // Juxtapose with the previous string chunks, if any.
+      if (chunk.previous != null) {
+        return new tree.StringJuxtaposition(
+            printStringChunk(chunk.previous),
+            node);
+      } else {
+        return node;
+      }
+    }
+    return printStringChunk(output.chunk);
+  }
+
 }
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
index 2aade10..d7951c5 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -55,7 +55,7 @@
 
   visitSuperSend(Send node) {
     Element element = elements[node];
-    if (element != null && element.isConstructor()) {
+    if (element != null && element.isConstructor) {
       collector.makeRedirectingConstructorPlaceholder(node.selector, element);
     } else {
       collector.tryMakeMemberPlaceholder(node.selector);
@@ -64,7 +64,7 @@
 
   visitDynamicSend(Send node) {
     final element = elements[node];
-    if (element == null || !element.isErroneous()) {
+    if (element == null || !element.isErroneous) {
       collector.tryMakeMemberPlaceholder(node.selector);
     }
   }
@@ -81,16 +81,16 @@
     // element == null means dynamic property access.
     if (element == null) {
       collector.tryMakeMemberPlaceholder(node.selector);
-    } else if (element.isErroneous()) {
+    } else if (element.isErroneous) {
       return;
-    } else if (element.isPrefix()) {
+    } else if (element.isPrefix) {
       // Node is prefix part in case of source 'lib.somesetter = 5;'
       collector.makeNullPlaceholder(node);
     } else if (Elements.isStaticOrTopLevel(element)) {
       // Unqualified or prefixed top level or static.
       collector.makeElementPlaceholder(node.selector, element);
-    } else if (!element.isTopLevel()) {
-      if (element.isInstanceMember()) {
+    } else if (!element.isTopLevel) {
+      if (element.isInstanceMember) {
         collector.tryMakeMemberPlaceholder(node.selector);
       } else {
         // May get FunctionExpression here in selector
@@ -114,10 +114,10 @@
 
     if (Elements.isUnresolved(element)
         || identical(element, compiler.assertMethod)
-        || element.isDeferredLoaderGetter()) {
+        || element.isDeferredLoaderGetter) {
       return;
     }
-    if (element.isConstructor() || element.isFactoryConstructor()) {
+    if (element.isConstructor || element.isFactoryConstructor) {
       // Rename named constructor in redirection position:
       // class C { C.named(); C.redirecting() : this.named(); }
       if (node.receiver is Identifier
@@ -130,8 +130,8 @@
     collector.makeElementPlaceholder(node.selector, element);
     // Another ugly case: <lib prefix>.<top level> is represented as
     // receiver: lib prefix, selector: top level.
-    if (element.isTopLevel() && node.receiver != null) {
-      assert(elements[node.receiver].isPrefix());
+    if (element.isTopLevel && node.receiver != null) {
+      assert(elements[node.receiver].isPrefix);
       // Hack: putting null into map overrides receiver of original node.
       collector.makeNullPlaceholder(node.receiver);
     }
@@ -183,15 +183,16 @@
 
   void collectFunctionDeclarationPlaceholders(
       FunctionElement element, FunctionExpression node) {
-    if (element.isGenerativeConstructor() || element.isFactoryConstructor()) {
-      DartType type = element.getEnclosingClass().thisType.asRaw();
+    if (element.isConstructor) {
+      ConstructorElement constructor = element;
+      DartType type = element.enclosingClass.thisType.asRaw();
       makeConstructorPlaceholder(node.name, element, type);
       Return bodyAsReturn = node.body.asReturn();
       if (bodyAsReturn != null && bodyAsReturn.isRedirectingFactoryBody) {
         // Factory redirection.
-        FunctionElement redirectTarget = element.defaultImplementation;
+        FunctionElement redirectTarget = constructor.immediateRedirectionTarget;
         assert(redirectTarget != null && redirectTarget != element);
-        type = redirectTarget.getEnclosingClass().thisType.asRaw();
+        type = redirectTarget.enclosingClass.thisType.asRaw();
         makeConstructorPlaceholder(
             bodyAsReturn.expression, redirectTarget, type);
       }
@@ -201,7 +202,7 @@
       // just to escape conflicts and that should be enough as we shouldn't
       // be able to resolve private identifiers for other libraries.
       makeElementPlaceholder(node.name, element);
-    } else if (element.isMember()) {
+    } else if (element.isMember) {
       if (node.name is Identifier) {
         tryMakeMemberPlaceholder(node.name);
       } else {
@@ -249,7 +250,7 @@
   bool isTypedefParameter(Element element) {
     return element != null &&
         element.enclosingElement != null &&
-        element.enclosingElement.isTypedef();
+        element.enclosingElement.isTypedef;
   }
 
   void tryMakeLocalPlaceholder(Element element, Identifier node) {
@@ -266,7 +267,7 @@
     // TODO(smok): Maybe we should rename privates as well, their privacy
     // should not matter if they are local vars.
     if (isPrivateName(node.source)) return;
-    if (element.isParameter() && !isTypedefParameter(element) &&
+    if (element.isParameter && !isTypedefParameter(element) &&
         isNamedOptionalParameter()) {
       currentFunctionScope.registerParameter(node);
     } else if (Elements.isLocal(element) && !isTypedefParameter(element)) {
@@ -309,7 +310,7 @@
     // and/or catch syntax changes.
     if (node.type == null) return;
     Element definitionElement = treeElements[node.definitions.nodes.head];
-    bool requiresVar = !node.modifiers.isFinalOrConst();
+    bool requiresVar = !node.modifiers.isFinalOrConst;
     declarationTypePlaceholders.add(
         new DeclarationTypePlaceholder(node.type, requiresVar));
   }
@@ -323,8 +324,8 @@
     assert(node != null);
     assert(element != null);
     if (identical(element, entryFunction)) return;
-    if (identical(element.getLibrary(), coreLibrary)) return;
-    if (element.getLibrary().isPlatformLibrary && !element.isTopLevel()) {
+    if (identical(element.library, coreLibrary)) return;
+    if (element.library.isPlatformLibrary && !element.isTopLevel) {
       return;
     }
     if (element == compiler.dynamicClass) {
@@ -336,7 +337,7 @@
   void makePrivateIdentifier(Identifier node) {
     assert(node != null);
     privateNodes.putIfAbsent(
-        currentElement.getLibrary(), () => new Set<Identifier>()).add(node);
+        currentElement.library, () => new Set<Identifier>()).add(node);
   }
 
   void makeUnresolvedPlaceholder(Node node) {
@@ -431,13 +432,13 @@
     }
     if (element == null) {
       if (send.receiver != null) tryMakeMemberPlaceholder(send.selector);
-    } else if (!element.isErroneous()) {
+    } else if (!element.isErroneous) {
       if (Elements.isStaticOrTopLevel(element)) {
         // TODO(smok): Worth investigating why sometimes we get getter/setter
         // here and sometimes abstract field.
-        assert(element.isClass() || element is VariableElement ||
-               element.isAccessor() || element.isAbstractField() ||
-               element.isFunction() || element.isTypedef() ||
+        assert(element.isClass || element is VariableElement ||
+               element.isAccessor || element.isAbstractField ||
+               element.isFunction || element.isTypedef ||
                element is TypeVariableElement);
         makeElementPlaceholder(send.selector, element);
       } else {
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
index 7ab927d..6ff101a 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
@@ -106,7 +106,7 @@
 
   String renameConstructor(Element element, ConstructorPlaceholder placeholder,
       Function renameString, Function renameElement) {
-    assert(element.isConstructor());
+    assert(element.isConstructor);
     StringBuffer result = new StringBuffer();
     String name = element.name;
     if (element.name != '') {
@@ -116,8 +116,8 @@
         result.write(renameType(placeholder.type, renameElement));
         result.write('.');
       }
-      if (!element.getLibrary().isPlatformLibrary) {
-        name = renameString(element.getLibrary(), name);
+      if (!element.library.isPlatformLibrary) {
+        name = renameString(element.library, name);
       }
       result.write(name);
     } else {
@@ -133,12 +133,12 @@
            element is TypeVariableElement);
     // TODO(smok): We may want to reuse class static field and method names.
     String originalName = element.name;
-    LibraryElement library = element.getLibrary();
-    if (identical(element.getLibrary(), compiler.coreLibrary)) {
+    LibraryElement library = element.library;
+    if (identical(element.library, compiler.coreLibrary)) {
       return originalName;
     }
     if (library.isPlatformLibrary) {
-      assert(element.isTopLevel());
+      assert(element.isTopLevel);
       if (reexportingLibraries.containsKey(element)) {
         library = reexportingLibraries[element];
       }
@@ -258,8 +258,8 @@
         (functionElement, functionScope) {
       Set<LocalPlaceholder> placeholders = functionScope.localPlaceholders;
       Set<String> memberIdentifiers = new Set<String>();
-      if (functionElement.getEnclosingClass() != null) {
-        functionElement.getEnclosingClass().forEachMember(
+      if (functionElement.enclosingClass != null) {
+        functionElement.enclosingClass.forEachMember(
             (enclosingClass, member) {
               memberIdentifiers.add(member.name);
             });
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 cfbf6fa..c636063 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
@@ -1,34 +1,131 @@
+// 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 dart_backend.tracer;
 
 import 'dart:async' show EventSink;
 import '../tracer.dart';
 import 'dart_tree.dart';
 
+class Block {
+  int index;
+  final List<Statement> statements = <Statement>[];
+  final List<Block> predecessors = <Block>[];
+  final List<Block> successors = <Block>[];
+
+  String get name => 'B$index';
+
+  void addEdgeTo(Block successor) {
+    successors.add(successor);
+    successor.predecessors.add(this);
+  }
+}
+
+class BlockCollector extends Visitor {
+  // Accumulate a list of blocks.  The current block is the last block in
+  // the list.
+  final List<Block> blocks = [new Block()..index = 0];
+
+  // Map tree [Label]s (break targets) and [Statement]s (if targets) to
+  // blocks.
+  final Map<Label, Block> breakTargets = <Label, Block>{};
+  final Map<Statement, Block> ifTargets = <Statement, Block>{};
+
+  void _addStatement(Statement statement) {
+    blocks.last.statements.add(statement);
+  }
+
+  void _addBlock(Block block) {
+    block.index = blocks.length;
+    blocks.add(block);
+  }
+
+  void collect(FunctionDefinition function) {
+    visitStatement(function.body);
+  }
+
+  visitVariable(Variable node) {}
+  visitInvokeStatic(InvokeStatic node) {}
+  visitInvokeMethod(InvokeMethod node) {}
+  visitInvokeConstructor(InvokeConstructor node) {}
+  visitConcatenateStrings(ConcatenateStrings node) {}
+  visitConstant(Constant node) {}
+  visitConditional(Conditional node) {}
+  visitLogicalOperator(LogicalOperator node) {}
+  visitNot(Not node) {}
+
+  visitLabeledStatement(LabeledStatement node) {
+    Block target = new Block();
+    breakTargets[node.label] = target;
+    visitStatement(node.body);
+    _addBlock(target);
+    visitStatement(node.next);
+  }
+
+  visitAssign(Assign node) {
+    _addStatement(node);
+    visitStatement(node.next);
+  }
+
+  visitReturn(Return node) {
+    _addStatement(node);
+  }
+
+  visitBreak(Break node) {
+    _addStatement(node);
+    blocks.last.addEdgeTo(breakTargets[node.target]);
+  }
+
+  visitIf(If node) {
+    _addStatement(node);
+    Block thenTarget = new Block();
+    Block elseTarget = new Block();
+    ifTargets[node.thenStatement] = thenTarget;
+    ifTargets[node.elseStatement] = elseTarget;
+    blocks.last.addEdgeTo(thenTarget);
+    blocks.last.addEdgeTo(elseTarget);
+    _addBlock(thenTarget);
+    visitStatement(node.thenStatement);
+    _addBlock(elseTarget);
+    visitStatement(node.elseStatement);
+  }
+
+  visitExpressionStatement(ExpressionStatement node) {
+    _addStatement(node);
+    visitStatement(node.next);
+  }
+}
+
 class TreeTracer extends TracerUtil with Visitor {
   final EventSink<String> output;
 
   TreeTracer(this.output);
 
   Names names;
+  BlockCollector collector;
   int statementCounter;
 
   void traceGraph(String name, FunctionDefinition function) {
     names = new Names();
     statementCounter = 0;
+    collector = new BlockCollector();
+    collector.collect(function);
     tag("cfg", () {
       printProperty("name", name);
-      printBlock(function.body);
+      int blockCounter = 0;
+      collector.blocks.forEach(printBlock);
     });
     names = null;
   }
 
-  void printBlock(Statement e) {
+  void printBlock(Block block) {
     tag("block", () {
-      printProperty("name", "B0"); // Update when proper blocks exist
+      printProperty("name", block.name);
       printProperty("from_bci", -1);
       printProperty("to_bci", -1);
-      printProperty("predecessors", ""); // Update when proper blocks exist
-      printProperty("successors", ""); // Update when proper blocks exist
+      printProperty("predecessors", block.predecessors.map((b) => b.name));
+      printProperty("successors", block.successors.map((b) => b.name));
       printEmptyProperty("xhandlers");
       printEmptyProperty("flags");
       tag("states", () {
@@ -38,7 +135,7 @@
         });
       });
       tag("HIR", () {
-        e.accept(this);
+        block.statements.forEach(visitStatement);
       });
     });
   }
@@ -52,29 +149,50 @@
     addIndent();
     add("$bci $uses $name $contents <|@\n");
   }
-  
-  
-
-  visitFunctionDefinition(FunctionDefinition node) {
-  }
 
   visitVariable(Variable node) {
     printStatement(null, "dead-use ${names.varName(node)}");
   }
 
-  visitExpressionStatement(ExpressionStatement node) {
-    node.expression.accept(this);
-    node.next.accept(this);
+  visitInvokeStatic(InvokeStatic node) {
+    printStatement(null, expr(node));
   }
 
-  visitLetVal(LetVal node) {
+  visitConstant(Constant node) {
+    printStatement(null, "dead-use ${node.value}");
+  }
+
+  visitLabeledStatement(LabeledStatement node) {
+    // These do not get added to a block's list of statements.
+  }
+
+  visitAssign(Assign node) {
     String name = names.varName(node.variable);
     String rhs = expr(node.definition);
     printStatement(name, "let $name = $rhs");
-    node.body.accept(this);
   }
 
-  visitInvokeStatic(InvokeStatic node) {
+  visitInvokeMethod(InvokeMethod node) {
+    printStatement(null, expr(node));
+  }
+
+  visitInvokeConstructor(InvokeConstructor node) {
+    printStatement(null, expr(node));
+  }
+
+  visitConcatenateStrings(ConcatenateStrings node) {
+    printStatement(null, expr(node));
+  }
+
+  visitConditional(Conditional node) {
+    printStatement(null, expr(node));
+  }
+
+  visitLogicalOperator(LogicalOperator node) {
+    printStatement(null, expr(node));
+  }
+
+  visitNot(Not node) {
     printStatement(null, expr(node));
   }
 
@@ -82,55 +200,125 @@
     printStatement(null, "return ${expr(node.value)}");
   }
 
-  visitConstant(Constant node) {
-    printStatement(null, "dead-use ${node.value}");
+  visitBreak(Break node) {
+    printStatement(null, "break ${collector.breakTargets[node.target].name}");
   }
 
-  visitNode(Node node) {}
-  visitExpression(Expression node) {}
+  visitIf(If node) {
+    String condition = expr(node.condition);
+    String thenTarget = collector.ifTargets[node.thenStatement].name;
+    String elseTarget = collector.ifTargets[node.elseStatement].name;
+    printStatement(null, "if $condition then $thenTarget else $elseTarget");
+  }
+
+  visitExpressionStatement(ExpressionStatement node) {
+    visitExpression(node.expression);
+  }
 
   String expr(Expression e) {
-    return e.accept(new ExpressionVisitor(names));
+    return e.accept(new SubexpressionVisitor(names));
   }
 }
 
-class ExpressionVisitor extends Visitor<String, String> {
+class SubexpressionVisitor extends Visitor<String, String> {
   Names names;
 
-  ExpressionVisitor(this.names);
-  
+  SubexpressionVisitor(this.names);
+
   String visitVariable(Variable node) {
     return names.varName(node);
   }
 
-  String visitLetVal(LetVal node) {
-    String name = names.varName(node.variable);
-    String def = node.definition.accept(this);
-    String body = node.body.accept(this);
-    return "(let $name = $def in $body)";
+  String formatArguments(Invoke node) {
+    List<String> args = new List<String>();
+    int positionalArgumentCount = node.selector.positionalArgumentCount;
+    for (int i = 0; i < positionalArgumentCount; ++i) {
+      args.add(node.arguments[i].accept(this));
+    }
+    for (int i = 0; i < node.selector.namedArgumentCount; ++i) {
+      String name = node.selector.namedArguments[i];
+      String arg = node.arguments[positionalArgumentCount + i].accept(this);
+      args.add("$name: $arg");
+    }
+    return args.join(', ');
   }
 
   String visitInvokeStatic(InvokeStatic node) {
     String head = node.target.name;
-    String args = node.arguments.map((e) => e.accept(this)).join(', ');
+    String args = formatArguments(node);
     return "$head($args)";
   }
 
-  String visitReturn(Return node) {
-    return "return ${node.value.accept(this)}";
+  String visitInvokeMethod(InvokeMethod node) {
+    String receiver = node.receiver.accept(this);
+    String name = node.selector.name;
+    String args = formatArguments(node);
+    return "$receiver.$name($args)";
+  }
+
+  String visitInvokeConstructor(InvokeConstructor node) {
+    String callName;
+    if (node.target.name.isEmpty) {
+      callName = '${node.type}';
+    } else {
+      callName = '${node.type}.${node.target.name}';
+    }
+    String args = formatArguments(node);
+    return "new $callName($args)";
+  }
+
+  String visitConcatenateStrings(ConcatenateStrings node) {
+    String args = node.arguments.map(visitExpression).join(', ');
+    return "concat [$args]";
   }
 
   String visitConstant(Constant node) {
     return "${node.value}";
   }
-  
+
+  bool usesInfixNotation(Expression node) {
+    return node is Conditional || node is LogicalOperator;
+  }
+
+  String visitConditional(Conditional node) {
+    String condition = visitExpression(node.condition);
+    String thenExpr = visitExpression(node.thenExpression);
+    String elseExpr = visitExpression(node.elseExpression);
+    return "$condition ? $thenExpr : $elseExpr";
+  }
+
+  String visitLogicalOperator(LogicalOperator node) {
+    String left = visitExpression(node.left);
+    String right = visitExpression(node.right);
+    if (usesInfixNotation(node.left)) {
+      left = "($left)";
+    }
+    if (usesInfixNotation(node.right)) {
+      right = "($right)";
+    }
+    return "$left ${node.operator} $right";
+  }
+
+  String visitNot(Not node) {
+    String operand = visitExpression(node.operand);
+    if (usesInfixNotation(node.operand)) {
+      operand = '($operand)';
+    }
+    return '!$operand';
+  }
+
+  // Note: There should not be statements in the context of expressions.
+  String visitStatement(Statement node) {
+    return "$node statement in expression context";
+  }
+
+  String visitLabeledStatement(LabeledStatement node) => visitStatement(node);
+  String visitAssign(Assign node) => visitStatement(node);
+  String visitReturn(Return node) => visitStatement(node);
+  String visitBreak(Break node) => visitStatement(node);
+  String visitIf(If node) => visitStatement(node);
   String visitExpressionStatement(ExpressionStatement node) {
-    // Note: There should not be statements in the context of expressions.
-    // However, generating a trace that shows where something went wrong is more
-    // useful than raising an exception.
-    String expr = node.expression.accept(this);
-    String body = node.next.accept(this);
-    return "{$expr; $body}";
+    return visitStatement(node);
   }
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/dart_types.dart b/sdk/lib/_internal/compiler/implementation/dart_types.dart
index 17794f9..2c30ecb 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_types.dart
@@ -264,13 +264,13 @@
 }
 
 class VoidType extends DartType {
-  const VoidType(this.element);
+  const VoidType();
 
   TypeKind get kind => TypeKind.VOID;
 
-  String get name => element.name;
+  String get name => 'void';
 
-  final Element element;
+  Element get element => null;
 
   DartType subst(Link<DartType> arguments, Link<DartType> parameters) {
     // Void cannot be substituted.
@@ -285,10 +285,6 @@
 
   bool get isVoid => true;
 
-  int get hashCode => 1729;
-
-  bool operator ==(other) => other is VoidType;
-
   String toString() => name;
 }
 
@@ -485,14 +481,12 @@
   DartType asInstanceOf(ClassElement other) {
     other = other.declaration;
     if (element == other) return this;
-    for (InterfaceType supertype in element.allSupertypes) {
-      ClassElement superclass = supertype.element;
-      if (superclass == other) {
-        Link<DartType> arguments = Types.substTypes(supertype.typeArguments,
-                                                    typeArguments,
-                                                    element.typeVariables);
-        return new InterfaceType(superclass, arguments);
-      }
+    InterfaceType supertype = element.asInstanceOf(other);
+    if (supertype != null) {
+      Link<DartType> arguments = Types.substTypes(supertype.typeArguments,
+                                                  typeArguments,
+                                                  element.typeVariables);
+      return new InterfaceType(supertype.element, arguments);
     }
     return null;
   }
@@ -569,7 +563,7 @@
 }
 
 class FunctionType extends DartType {
-  final Element element;
+  final FunctionTypedElement element;
   final DartType returnType;
   final Link<DartType> parameterTypes;
   final Link<DartType> optionalParameterTypes;
@@ -585,18 +579,46 @@
    */
   final Link<DartType> namedParameterTypes;
 
-  FunctionType(Element this.element,
-               DartType this.returnType,
-               [this.parameterTypes = const Link<DartType>(),
-                this.optionalParameterTypes = const Link<DartType>(),
-                this.namedParameters = const Link<String>(),
-                this.namedParameterTypes = const Link<DartType>()]) {
+  factory FunctionType(
+      FunctionTypedElement element,
+      DartType returnType,
+      [Link<DartType> parameterTypes = const Link<DartType>(),
+       Link<DartType> optionalParameterTypes = const Link<DartType>(),
+       Link<String> namedParameters = const Link<String>(),
+       Link<DartType> namedParameterTypes = const Link<DartType>()]) {
+    assert(invariant(CURRENT_ELEMENT_SPANNABLE, element != null));
     assert(invariant(element, element.isDeclaration));
+    return new FunctionType.internal(element,
+        returnType, parameterTypes, optionalParameterTypes,
+        namedParameters, namedParameterTypes);
+  }
+
+  factory FunctionType.synthesized(
+      DartType returnType,
+      [Link<DartType> parameterTypes = const Link<DartType>(),
+       Link<DartType> optionalParameterTypes = const Link<DartType>(),
+       Link<String> namedParameters = const Link<String>(),
+       Link<DartType> namedParameterTypes = const Link<DartType>()]) {
+    return new FunctionType.internal(null,
+        returnType, parameterTypes, optionalParameterTypes,
+        namedParameters, namedParameterTypes);
+  }
+
+  FunctionType.internal(FunctionTypedElement this.element,
+                        DartType this.returnType,
+                        [this.parameterTypes = const Link<DartType>(),
+                         this.optionalParameterTypes = const Link<DartType>(),
+                         this.namedParameters = const Link<String>(),
+                         this.namedParameterTypes = const Link<DartType>()]) {
+    assert(invariant(CURRENT_ELEMENT_SPANNABLE,
+        element == null || element.isDeclaration));
     // Assert that optional and named parameters are not used at the same time.
     assert(optionalParameterTypes.isEmpty || namedParameterTypes.isEmpty);
     assert(namedParameters.slowLength() == namedParameterTypes.slowLength());
   }
 
+
+
   TypeKind get kind => TypeKind.FUNCTION;
 
   DartType getNamedParameterType(String name) {
@@ -634,12 +656,12 @@
     }
     if (changed) {
       // Create a new type only if necessary.
-      return new FunctionType(element,
-                              newReturnType,
-                              newParameterTypes,
-                              newOptionalParameterTypes,
-                              namedParameters,
-                              newNamedParameterTypes);
+      return new FunctionType.internal(element,
+                                       newReturnType,
+                                       newParameterTypes,
+                                       newOptionalParameterTypes,
+                                       namedParameters,
+                                       newNamedParameterTypes);
     }
     return this;
   }
@@ -891,11 +913,9 @@
 abstract class AbstractTypeRelation extends DartTypeVisitor<bool, DartType> {
   final Compiler compiler;
   final DynamicType dynamicType;
-  final VoidType voidType;
 
   AbstractTypeRelation(Compiler this.compiler,
-                       DynamicType this.dynamicType,
-                       VoidType this.voidType);
+                       DynamicType this.dynamicType);
 
   bool visitType(DartType t, DartType s) {
     throw 'internal error: unknown type kind ${t.kind}';
@@ -1043,12 +1063,12 @@
   bool visitTypeVariableType(TypeVariableType t, DartType s) {
     // Identity check is handled in [isSubtype].
     DartType bound = t.element.bound;
-    if (bound.element.isTypeVariable()) {
+    if (bound.element.isTypeVariable) {
       // The bound is potentially cyclic so we need to be extra careful.
       Link<TypeVariableElement> seenTypeVariables =
           const Link<TypeVariableElement>();
       seenTypeVariables = seenTypeVariables.prepend(t.element);
-      while (bound.element.isTypeVariable()) {
+      while (bound.element.isTypeVariable) {
         TypeVariableElement element = bound.element;
         if (identical(bound.element, s.element)) {
           // [t] extends [s].
@@ -1071,9 +1091,8 @@
 
 class MoreSpecificVisitor extends AbstractTypeRelation {
   MoreSpecificVisitor(Compiler compiler,
-                      DynamicType dynamicType,
-                      VoidType voidType)
-      : super(compiler, dynamicType, voidType);
+                      DynamicType dynamicType)
+      : super(compiler, dynamicType);
 
   bool isMoreSpecific(DartType t, DartType s) {
     if (identical(t, s) || s.treatAsDynamic ||
@@ -1119,9 +1138,8 @@
 class SubtypeVisitor extends MoreSpecificVisitor {
 
   SubtypeVisitor(Compiler compiler,
-                 DynamicType dynamicType,
-                 VoidType voidType)
-      : super(compiler, dynamicType, voidType);
+                 DynamicType dynamicType)
+      : super(compiler, dynamicType);
 
   bool isSubtype(DartType t, DartType s) {
     return t.treatAsDynamic || isMoreSpecific(t, s);
@@ -1136,7 +1154,7 @@
   }
 
   bool invalidFunctionReturnTypes(DartType t, DartType s) {
-    return !identical(s, voidType) && !isAssignable(t, s);
+    return !s.isVoid && !isAssignable(t, s);
   }
 
   bool invalidFunctionParameterTypes(DartType t, DartType s) {
@@ -1174,34 +1192,29 @@
 
 class Types {
   final Compiler compiler;
-  // TODO(karlklose): should we have a class Void?
-  final VoidType voidType;
   final DynamicType dynamicType;
   final MoreSpecificVisitor moreSpecificVisitor;
   final SubtypeVisitor subtypeVisitor;
   final PotentialSubtypeVisitor potentialSubtypeVisitor;
 
   factory Types(Compiler compiler, BaseClassElementX dynamicElement) {
-    LibraryElement library = new LibraryElementX(new Script(null, null, null));
-    VoidType voidType = new VoidType(new VoidElementX(library));
     DynamicType dynamicType = new DynamicType(dynamicElement);
     dynamicElement.rawTypeCache = dynamicElement.thisTypeCache = dynamicType;
-    return new Types.internal(compiler, voidType, dynamicType);
+    return new Types.internal(compiler, dynamicType);
   }
 
-  Types.internal(Compiler compiler, VoidType voidType, DynamicType dynamicType)
+  Types.internal(Compiler compiler, DynamicType dynamicType)
       : this.compiler = compiler,
-        this.voidType = voidType,
         this.dynamicType = dynamicType,
         this.moreSpecificVisitor =
-          new MoreSpecificVisitor(compiler, dynamicType, voidType),
+          new MoreSpecificVisitor(compiler, dynamicType),
         this.subtypeVisitor =
-          new SubtypeVisitor(compiler, dynamicType, voidType),
+          new SubtypeVisitor(compiler, dynamicType),
         this.potentialSubtypeVisitor =
-          new PotentialSubtypeVisitor(compiler, dynamicType, voidType);
+          new PotentialSubtypeVisitor(compiler, dynamicType);
 
   Types copy(Compiler compiler) {
-    return new Types.internal(compiler, voidType, dynamicType);
+    return new Types.internal(compiler, dynamicType);
   }
 
   /** Returns true if [t] is more specific than [s]. */
@@ -1539,7 +1552,7 @@
         bNamedParameterTypes = bNamedParameterTypes.tail;
       }
     }
-    return new FunctionType(compiler.functionClass,
+    return new FunctionType.synthesized(
         returnType,
         parameterTypes, optionalParameterTypes,
         namedParameters.toLink(), namedParameterTypes.toLink());
@@ -1579,7 +1592,7 @@
     b = b.unalias(compiler);
 
     if (a.treatAsDynamic || b.treatAsDynamic) return dynamicType;
-    if (a.isVoid || b.isVoid) return voidType;
+    if (a.isVoid || b.isVoid) return const VoidType();
 
     if (a.kind == TypeKind.FUNCTION && b.kind == TypeKind.FUNCTION) {
       return computeLeastUpperBoundFunctionTypes(a, b);
@@ -1606,9 +1619,8 @@
  */
 class PotentialSubtypeVisitor extends SubtypeVisitor {
   PotentialSubtypeVisitor(Compiler compiler,
-                          DynamicType dynamicType,
-                          VoidType voidType)
-      : super(compiler, dynamicType, voidType);
+                          DynamicType dynamicType)
+      : super(compiler, dynamicType);
 
 
   bool isSubtype(DartType t, DartType s) {
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index 01552e1..ba055a7 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -11,9 +11,9 @@
     Constant,
     ConstructedConstant,
     MessageKind,
+    DeferredConstant,
     StringConstant,
-    invariant,
-    Backend;
+    invariant;
 
 import 'dart_backend/dart_backend.dart' show
     DartBackend;
@@ -31,7 +31,9 @@
     MetadataAnnotation,
     ScopeContainerElement,
     PrefixElement,
-    ClosureContainer;
+    ClosureContainer,
+    VoidElement,
+    TypedefElement;
 
 import 'util/util.dart' show
     Link;
@@ -44,18 +46,15 @@
     Node,
     NewExpression,
     Import,
+    LibraryDependency,
     LiteralString,
     LiteralDartString;
 
 import 'tree/tree.dart' as ast;
 
 import 'resolution/resolution.dart' show
-    TreeElements;
-
-import 'mirrors_used.dart' show
-    MirrorUsageAnalyzer,
-    MirrorUsageAnalyzerTask,
-    MirrorUsage;
+    TreeElements,
+    AnalyzableElement;
 
 /// A "hunk" of the program that will be loaded whenever one of its [imports]
 /// are loaded.
@@ -191,6 +190,13 @@
     return outputUnitForElement(e1) == outputUnitForElement(e2);
   }
 
+  void registerConstantDeferredUse(DeferredConstant constant,
+                                   PrefixElement prefix) {
+    OutputUnit outputUnit = new OutputUnit();
+    outputUnit.imports.add(prefix.deferredImport);
+    _constantToOutputUnit[constant] = outputUnit;
+  }
+
   /// Mark that [import] is part of the [OutputputUnit] for [element].
   ///
   /// [element] can be either a [Constant] or an [Element].
@@ -244,7 +250,7 @@
         // information. Therefore it is neccessary to check if there is a prefix
         // here.
         Element maybePrefix = library.find(import.prefix.toString());
-        if (maybePrefix != null && maybePrefix.isPrefix()) {
+        if (maybePrefix != null && maybePrefix.isPrefix) {
           PrefixElement prefix = maybePrefix;
           prefix.markAsDeferred(import);
         }
@@ -268,103 +274,98 @@
 
   /// Returns a [Link] of every [Import] that imports [element] into [library].
   Link<Import> _getImports(Element element, LibraryElement library) {
-    if (element.isMember()) {
-      element = element.getEnclosingClass();
+    if (element.isMember) {
+      element = element.enclosingClass;
     }
-    if (element.isAccessor()) {
+    if (element.isAccessor) {
       element = (element as FunctionElement).abstractField;
     }
     return library.getImportsFor(element);
   }
 
-  /// Replaces the imports of [outputUnit] with those in
-  /// [replacementImports]. Because mainOutputUnit has a special handling we
-  /// create a new outputUnit instead, and update the mapping from the
-  /// dependency to its outputUnit.
-  void _replaceOutputUnitImports(dynamic dependency,
-                                 OutputUnit outputUnit,
-                                 Iterable<Import> replacementImports) {
-    Map<dynamic, OutputUnit> dependencyToOutputUnit = dependency is Element
-        ? _elementToOutputUnit
-        : _constantToOutputUnit;
-    assert(outputUnit == dependencyToOutputUnit[dependency]);
-    if (outputUnit == mainOutputUnit) {
-      outputUnit = new OutputUnit();
-      dependencyToOutputUnit[dependency] = outputUnit;
-    } else {
-      outputUnit.imports.clear();
-    }
-    outputUnit.imports.addAll(replacementImports);
-  }
-
-  /// Collects all direct dependencies of [element].
-  ///
-  /// The collected dependent elements and constants are are added to
-  /// [elementDependencies] and [constantDependencies] respectively.
-  void _collectDependencies(Element element,
-                            Set<Element> elementDependencies,
-                            Set<Constant> constantDependencies) {
-    TreeElements elements =
-        compiler.enqueuer.resolution.getCachedElements(element);
-    if (elements == null) return;
-    for (Element dependency in elements.allElements) {
-      if (Elements.isLocal(dependency) && !dependency.isFunction()) continue;
-      if (Elements.isUnresolved(dependency)) continue;
-      if (dependency.isStatement()) continue;
-      elementDependencies.add(dependency);
-    }
-    elements.forEachConstantNode((Node n, _) {
-      // Explicitly depend on the backend constants.
-      constantDependencies.add(
-          backend.constants.getConstantForNode(n, elements));
-    });
-    elementDependencies.addAll(elements.otherDependencies);
-  }
-
   /// Finds all elements and constants that [element] depends directly on.
   /// (not the transitive closure.)
   ///
   /// Adds the results to [elements] and [constants].
-  void _collectAllElementsAndConstantsResolvedFrom(Element element,
+  void _collectAllElementsAndConstantsResolvedFrom(
+      Element element,
       Set<Element> elements,
       Set<Constant> constants) {
+
+    /// Recursively add the constant and its dependencies to [constants].
+    void addConstants(Constant constant) {
+      if (constants.contains(constant)) return;
+      constants.add(constant);
+      if (constant is ConstructedConstant) {
+        elements.add(constant.type.element);
+      }
+      constant.getDependencies().forEach(addConstants);
+    }
+
+    /// Collects all direct dependencies of [element].
+    ///
+    /// The collected dependent elements and constants are are added to
+    /// [elements] and [constants] respectively.
+    void collectDependencies(Element element) {
+      TreeElements treeElements = element is TypedefElement
+          ? element.treeElements
+          : compiler.enqueuer.resolution.getCachedElements(element);
+
+      // TODO(sigurdm): We want to be more specific about this - need a better
+      // way to query "liveness".
+      if (treeElements == null) return;
+
+      for (Element dependency in treeElements.allElements) {
+        if (Elements.isLocal(dependency) && !dependency.isFunction) continue;
+        if (dependency.isErroneous) continue;
+        if (dependency.isStatement) continue;
+        if (dependency.isTypeVariable) continue;
+
+        elements.add(dependency);
+      }
+      treeElements.forEachConstantNode((Node node, _) {
+        // Explicitly depend on the backend constants.
+        addConstants(
+            backend.constants.getConstantForNode(node, treeElements));
+      });
+      elements.addAll(treeElements.otherDependencies);
+    }
+
     // TODO(sigurdm): How is metadata on a patch-class handled?
     for (MetadataAnnotation metadata in element.metadata) {
       Constant constant = backend.constants.getConstantForMetadata(metadata);
       if (constant != null) {
-        constants.add(constant);
-        elements.add(constant.computeType(compiler).element);
+        addConstants(constant);
       }
     }
-    if (element.isClass()) {
-      // If we see a class, add everything its instance members refer
+    if (element.isClass) {
+      // If we see a class, add everything its live instance members refer
       // to.  Static members are not relevant.
+      void addLiveInstanceMember(Element element) {
+        if (!compiler.enqueuer.resolution.isLive(element)) return;
+        if (!element.isInstanceMember) return;
+        collectDependencies(element.implementation);
+      }
       ClassElement cls = element.declaration;
-      cls.forEachLocalMember((Element e) {
-        if (!e.isInstanceMember()) return;
-        _collectDependencies(e.implementation, elements, constants);
-      });
+      cls.forEachLocalMember(addLiveInstanceMember);
       if (cls.implementation != cls) {
         // TODO(ahe): Why doesn't ClassElement.forEachLocalMember do this?
-        cls.implementation.forEachLocalMember((Element e) {
-          if (!e.isInstanceMember()) return;
-          _collectDependencies(e.implementation, elements, constants);
-        });
+        cls.implementation.forEachLocalMember(addLiveInstanceMember);
       }
       for (var type in cls.implementation.allSupertypes) {
         elements.add(type.element.implementation);
       }
       elements.add(cls.implementation);
     } else if (Elements.isStaticOrTopLevel(element) ||
-               element.isConstructor()) {
-      _collectDependencies(element, elements, constants);
+               element.isConstructor) {
+      collectDependencies(element);
     }
-    if (element.isGenerativeConstructor()) {
+    if (element.isGenerativeConstructor) {
       // When instantiating a class, we record a reference to the
       // constructor, not the class itself.  We must add all the
       // instance members of the constructor's class.
       ClassElement implementation =
-          element.getEnclosingClass().implementation;
+          element.enclosingClass.implementation;
       _collectAllElementsAndConstantsResolvedFrom(
           implementation, elements, constants);
     }
@@ -381,18 +382,28 @@
     void traverseLibrary(LibraryElement library) {
       if (result.contains(library)) return;
       result.add(library);
-      // TODO(sigurdm): Make helper getLibraryImportTags when tags is changed to
-      // be a List instead of a Link.
-      for (LibraryTag tag in library.tags) {
-        if (tag is! Import) continue;
-        Import import = tag;
-        if (!_isImportDeferred(import)) {
-          LibraryElement importedLibrary = library.getLibraryFromTag(tag);
-          traverseLibrary(importedLibrary);
+
+      iterateTags(LibraryElement library) {
+        // TODO(sigurdm): Make helper getLibraryDependencyTags when tags is
+        // changed to be a List instead of a Link.
+        for (LibraryTag tag in library.tags) {
+          if (tag is! LibraryDependency) continue;
+          LibraryDependency libraryDependency = tag;
+          if (!(libraryDependency is Import
+              && _isImportDeferred(libraryDependency))) {
+            LibraryElement importedLibrary = library.getLibraryFromTag(tag);
+            traverseLibrary(importedLibrary);
+          }
         }
       }
+
+      iterateTags(library);
+      if (library.isPatched) {
+        iterateTags(library.implementation);
+      }
     }
     traverseLibrary(root);
+    result.add(compiler.coreLibrary);
     return result;
   }
 
@@ -419,7 +430,7 @@
     _collectAllElementsAndConstantsResolvedFrom(
         element, dependentElements, constants);
 
-    LibraryElement library = element.getLibrary();
+    LibraryElement library = element.library;
     for (Element dependency in dependentElements) {
       if (_isExplicitlyDeferred(dependency, library)) {
         for (Import deferredImport in _getImports(dependency, library)) {
@@ -435,158 +446,51 @@
   ///
   /// The elements are added with [_mapDependencies].
   void _addMirrorElements() {
-    MirrorUsageAnalyzerTask mirrorTask = compiler.mirrorUsageAnalyzerTask;
-    // For each import we record all mirrors-used elements from all the
-    // libraries reached directly from that import.
-    for (Import deferredImport in _allDeferredImports.keys) {
-      LibraryElement deferredLibrary = _allDeferredImports[deferredImport];
-      for (LibraryElement library in
-          _nonDeferredReachableLibraries(deferredLibrary)) {
-        // TODO(sigurdm): The metadata should go to the right output unit.
-        // For now they all go to the main output unit.
-        for (MetadataAnnotation metadata in library.metadata) {
+    void mapDependenciesIfResolved(Element element, Import deferredImport) {
+      // If an element is the target of a MirrorsUsed annotation but never used
+      // It will not be resolved, and we should not call isNeededForReflection.
+      // TODO(sigurdm): Unresolved elements should just answer false when
+      // asked isNeededForReflection. Instead an internal error is triggered.
+      // So we have to filter them out here.
+      if (element is AnalyzableElement && !element.hasTreeElements) return;
+      if (compiler.backend.isNeededForReflection(element)) {
+        _mapDependencies(element, deferredImport);
+      }
+    }
+
+    // For each deferred import we analyze all elements reachable from the
+    // imported library through non-deferred imports.
+    handleLibrary(LibraryElement library, Import deferredImport) {
+      library.implementation.forEachLocalMember((Element element) {
+        mapDependenciesIfResolved(element, deferredImport);
+      });
+
+      for (MetadataAnnotation metadata in library.metadata) {
+        Constant constant =
+            backend.constants.getConstantForMetadata(metadata);
+        if (constant != null) {
+          _mapDependencies(constant.computeType(compiler).element,
+              deferredImport);
+        }
+      }
+      for (LibraryTag tag in library.tags) {
+        for (MetadataAnnotation metadata in tag.metadata) {
           Constant constant =
               backend.constants.getConstantForMetadata(metadata);
           if (constant != null) {
             _mapDependencies(constant.computeType(compiler).element,
-                _fakeMainImport);
-          }
-        }
-        for (LibraryTag tag in library.tags) {
-          for (MetadataAnnotation metadata in tag.metadata) {
-            Constant constant =
-                backend.constants.getConstantForMetadata(metadata);
-            if (constant != null) {
-              _mapDependencies(constant.computeType(compiler).element,
-                  _fakeMainImport);
-            }
-          }
-        }
-
-        if (mirrorTask.librariesWithUsage.contains(library)) {
-
-          Map<LibraryElement, List<MirrorUsage>> mirrorsResult =
-              mirrorTask.analyzer.collectMirrorsUsedAnnotation();
-
-          // If there is a MirrorsUsed annotation we add only the needed
-          // things to the output units for the library.
-          List<MirrorUsage> mirrorUsages = mirrorsResult[library];
-          if (mirrorUsages == null) continue;
-
-          void mapDependenciesIfResolved(Element element) {
-            // If there is a target for this class, but no use of mirrors the
-            // class will not be resolved. We just skip it.
-            if (element is ClassElement &&!element.isResolved) {
-              return;
-            }
-            _mapDependencies(element, deferredImport);
-          }
-
-          for (MirrorUsage usage in mirrorUsages) {
-            if (usage.targets != null) {
-              for (Element dependency in usage.targets) {
-                if (dependency.isLibrary()) {
-                  LibraryElement library = dependency;
-                  library.forEachLocalMember(mapDependenciesIfResolved);
-                } else {
-                  mapDependenciesIfResolved(dependency);
-                }
-              }
-            }
-            if (usage.metaTargets != null) {
-              for (Element dependency in usage.metaTargets) {
-                _mapDependencies(dependency, deferredImport);
-              }
-            }
-          }
-        } else {
-          // If there is no MirrorsUsed annotation we add _everything_ to
-          // the output units for the library.
-
-          // TODO(sigurdm): This is too expensive.
-          // Plan: If mirrors are used without MirrorsUsed, create an
-          // "EverythingElse" library that contains all elements that are
-          // not referred by main or deferred libraries that don't contain
-          // mirrors (without MirrorsUsed).
-          //
-          // So basically we want:
-          //   mainImport
-          //   deferredA
-          //   deferredB
-          //   deferredCwithMirrorsUsed
-          //   deferredEverythingElse
-          //
-          // Where deferredEverythingElse will be loaded for *all* libraries
-          // that contain a mirror usage without MirrorsUsed.
-          //   When loading the deferredEverythingElse also load all other
-          //   deferred libraries at the same time.
-          bool usesMirrors = false;
-          for (LibraryTag tag in library.tags) {
-            if (tag is! Import) continue;
-            if (library.getLibraryFromTag(tag) == compiler.mirrorsLibrary) {
-              usesMirrors = true;
-              break;
-            }
-          }
-          if (usesMirrors) {
-            // Add all resolved elements to the output unit.
-            for (Element element in
-                compiler.enqueuer.resolution.resolvedElements.keys) {
-              _mapDependencies(element, deferredImport);
-            }
-            for (Element element in
-                compiler.mirrorDependencies.otherDependencies) {
-              _mapDependencies(element, deferredImport);
-            }
+                deferredImport);
           }
         }
       }
     }
-  }
 
-  /// Goes through [allConstants] and adjusts their outputUnits.
-  void _adjustConstantsOutputUnit(Set<Constant> allConstants) {
-    // A constant has three dependencies:
-    // 1- the libraries it is used in.
-    // 2- its class.
-    // 3- its arguments.
-    // The constant should only be loaded if all three dependencies are
-    // loaded.
-    // TODO(floitsch): only load constants when all three dependencies are
-    // satisfied.
-    //
-    // So far we only looked at where the constants were used. For now, we
-    // use a simplified approach to fix this (partially): if the current
-    // library is not deferred, only look at the class (2). Otherwise store
-    // the constant in the current (deferred) library.
-    for (Constant constant in allConstants) {
-      // If the constant is not a "constructed" constant, it can stay where
-      // it is.
-      if (!constant.isConstructedObject) continue;
-      OutputUnit constantUnit = _constantToOutputUnit[constant];
-      Setlet<Import> constantImports = constantUnit.imports;
-      ConstructedConstant constructed = constant;
-      Element classElement = constructed.type.element;
-      OutputUnit classUnit = _elementToOutputUnit[classElement];
-      // This happens with classes that are only used as annotations.
-      // TODO(sigurdm): Find out if we can use a specific check for this.
-      if (classUnit == null) continue;
-      Setlet<Import> classImports = classUnit.imports;
-      // The class exists in the main-unit. Just leave the constant where it
-      // is. We know that the constructor will be available.
-      if (classImports.length == 1 && classImports.single == _fakeMainImport) {
-        continue;
+    for (Import deferredImport in _allDeferredImports.keys) {
+      LibraryElement deferredLibrary = _allDeferredImports[deferredImport];
+      for (LibraryElement library in
+          _nonDeferredReachableLibraries(deferredLibrary)) {
+        handleLibrary(library, deferredImport);
       }
-      // The class is loaded for all imports in the classImport-set.
-      // If the constant's imports are included in the class' set, we can
-      // keep the constant unit as is.
-      // If the constant is used otherwise, we need to make sure that the
-      // class is available before constructing the constant.
-      if (classImports.containsAll(constantImports)) continue;
-      // We could now just copy the OutputUnit from the class to the output
-      // unit of the constant, but we prefer separate instances.
-      // Replace the imports of the constant to match the ones of the class.
-      _replaceOutputUnitImports(constant, constantUnit, classImports);
     }
   }
 
@@ -697,7 +601,7 @@
       return;
     }
     if (main == null) return;
-    LibraryElement mainLibrary = main.getLibrary();
+    LibraryElement mainLibrary = main.library;
     _importedDeferredBy = new Map<Import, Set<Element>>();
     _constantsDeferredBy = new Map<Import, Set<Constant>>();
     _importedDeferredBy[_fakeMainImport] = _mainElements;
@@ -737,8 +641,6 @@
       _importedDeferredBy = null;
       _constantsDeferredBy = null;
 
-      _adjustConstantsOutputUnit(allConstants);
-
       // Find all the output units we have used.
       // Also generate a unique name for each OutputUnit.
       for (OutputUnit outputUnit in _elementToOutputUnit.values) {
@@ -855,7 +757,7 @@
     Element element = elements[send];
     // The DeferredLoaderGetter is not deferred, therefore we do not return the
     // prefix.
-    if (element != null && element.isDeferredLoaderGetter()) return null;
+    if (element != null && element.isDeferredLoaderGetter) return null;
 
     ast.Node firstNode(ast.Node node) {
       if (node is! ast.Send) {
@@ -875,7 +777,7 @@
     ast.Node identifier = first.asIdentifier();
     if (identifier == null) return null;
     Element maybePrefix = elements[identifier];
-    if (maybePrefix != null && maybePrefix.isPrefix()) {
+    if (maybePrefix != null && maybePrefix.isPrefix) {
       PrefixElement prefixElement = maybePrefix;
       if (prefixElement.isDeferred) {
         return prefixElement;
diff --git a/sdk/lib/_internal/compiler/implementation/dump_info.dart b/sdk/lib/_internal/compiler/implementation/dump_info.dart
index 988dbb9..84dbb51 100644
--- a/sdk/lib/_internal/compiler/implementation/dump_info.dart
+++ b/sdk/lib/_internal/compiler/implementation/dump_info.dart
@@ -13,6 +13,7 @@
     CodeBuffer;
 import 'dart_types.dart' show DartType;
 import 'types/types.dart' show TypeMask;
+import 'util/util.dart' show modifiersToString;
 
 // TODO (sigurdm): A search function.
 // TODO (sigurdm): Output size of classes.
@@ -320,7 +321,9 @@
         type: "$type",
         name: element.name,
         size: size,
-        modifiers: "${element.modifiers}",
+        modifiers: modifiersToString(isStatic: element.isStatic,
+                                     isFinal: element.isFinal,
+                                     isConst: element.isConst),
         contents: contents);
   }
 
@@ -328,7 +331,7 @@
     // If the element is not resolved it is not used in the program, and we omit
     // it from the output.
     if (!element.isResolved) return null;
-    String modifiersString = "${element.modifiers}";
+    String modifiersString = modifiersToString(isAbstract: element.isAbstract);
     String supersString = element.allSupertypes == null ? "" :
         "implements ${element.allSupertypes}";
     List contents = [];
@@ -360,17 +363,21 @@
     CodeBuffer emittedCode = compiler.backend.codeOf(element);
     int size = 0;
     String nameString = element.name;
-    String modifiersString = "${element.modifiers}";
+    String modifiersString = modifiersToString(
+        isStatic: element.isStatic,
+        isConst: element.isConst,
+        isFactory: element.isFactoryConstructor,
+        isExternal: element.isPatched);
     String kindString = "function";
-    if (currentElement.isClass()) {
+    if (currentElement.isClass) {
       kindString = "method";
-    } else if (currentElement.isField() ||
-               currentElement.isFunction() ||
-               currentElement.isConstructor()) {
+    } else if (currentElement.isField ||
+               currentElement.isFunction ||
+               currentElement.isConstructor) {
       kindString = "closure";
       nameString = "<unnamed>";
     }
-    if (element.isConstructor()) {
+    if (element.isConstructor) {
       nameString = element.name == ""
           ? "${element.enclosingElement.name}"
           : "${element.enclosingElement.name}.${element.name}";
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 2fd142a..256d0b5 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -118,8 +118,6 @@
       const ElementKind('statement', ElementCategory.NONE);
   static const ElementKind LABEL =
       const ElementKind('label', ElementCategory.NONE);
-  static const ElementKind VOID =
-      const ElementKind('void', ElementCategory.NONE);
 
   static const ElementKind AMBIGUOUS =
       const ElementKind('ambiguous', ElementCategory.NONE);
@@ -178,12 +176,9 @@
 abstract class Element implements Spannable {
   String get name;
   ElementKind get kind;
-  Modifiers get modifiers;
   Element get enclosingElement;
   Link<MetadataAnnotation> get metadata;
 
-  Node parseNode(DiagnosticListener listener);
-
   /// Do not use [computeType] outside of the resolver; instead retrieve the
   /// type from the corresponding field:
   /// - `type` for fields, variables, type variable, and function elements.
@@ -194,33 +189,98 @@
   /// This method will go away!
   @deprecated DartType computeType(Compiler compiler);
 
-  bool isFunction();
-  bool isConstructor();
-  bool isClosure();
-  bool isMember();
-  bool isInstanceMember();
+  /// `true` if this element is a library.
+  bool get isLibrary => kind == ElementKind.LIBRARY;
 
-  bool isFactoryConstructor();
-  bool isGenerativeConstructor();
-  bool isGenerativeConstructorBody();
-  bool isCompilationUnit();
-  bool isClass();
-  bool isPrefix();
-  bool isVariable();
-  bool isParameter();
-  bool isStatement();
-  bool isTypedef();
-  bool isTypeVariable();
-  bool isField();
-  bool isFieldParameter();
-  bool isAbstractField();
-  bool isGetter();
-  bool isSetter();
-  bool isAccessor();
-  bool isLibrary();
-  bool isErroneous();
-  bool isAmbiguous();
-  bool isWarnOnUse();
+  /// `true` if this element is a compilation unit.
+  bool get isCompilationUnit => kind == ElementKind.COMPILATION_UNIT;
+
+  /// `true` if this element is defines the scope of prefix used by one or
+  /// more import declarations.
+  bool get isPrefix => kind == ElementKind.PREFIX;
+
+  /// `true` if this element is a class declaration or a mixin application.
+  bool get isClass => kind == ElementKind.CLASS;
+
+  /// `true` if this element is a type variable declaration.
+  bool get isTypeVariable => kind == ElementKind.TYPE_VARIABLE;
+
+  /// `true` if this element is a typedef declaration.
+  bool get isTypedef => kind == ElementKind.TYPEDEF;
+
+  /// `true` if this element is a top level function, static or instance
+  /// method, local function or closure defined by a function expression.
+  ///
+  /// This property is `true` for operator methods and factory constructors but
+  /// `false` for getter and setter methods, and generative constructors.
+  ///
+  /// See also [isConstructor], [isGenerativeConstructor], and
+  /// [isFactoryConstructor] for constructor properties, and [isAccessor],
+  /// [isGetter] and [isSetter] for getter/setter properties.
+  bool get isFunction => kind == ElementKind.FUNCTION;
+
+  /// `true` if this element is an operator method.
+  bool get isOperator;
+
+  /// `true` if this element is an accessor, that is either an explicit
+  /// getter or an explicit setter.
+  bool get isAccessor => isGetter || isSetter;
+
+  /// `true` if this element is an explicit getter method.
+  bool get isGetter => kind == ElementKind.GETTER;
+
+  /// `true` if this element is an explicit setter method.
+  bool get isSetter => kind == ElementKind.SETTER;
+
+  /// `true` if this element is a generative or factory constructor.
+  bool get isConstructor => isGenerativeConstructor ||  isFactoryConstructor;
+
+  /// `true` if this element is a generative constructor, potentially
+  /// redirecting.
+  bool get isGenerativeConstructor =>
+      kind == ElementKind.GENERATIVE_CONSTRUCTOR;
+
+  /// `true` if this element is the body of a generative constructor.
+  ///
+  /// This is a synthetic element kind used only be the JavaScript backend.
+  bool get isGenerativeConstructorBody =>
+      kind == ElementKind.GENERATIVE_CONSTRUCTOR_BODY;
+
+  /// `true` if this element is a factory constructor,
+  /// potentially redirecting.
+  bool get isFactoryConstructor;
+
+  /// `true` if this element is a local variable.
+  bool get isVariable => kind == ElementKind.VARIABLE;
+
+  /// `true` if this element is a top level variable, static or instance field.
+  bool get isField => kind == ElementKind.FIELD;
+
+  /// `true` if this element is the abstract field implicitly defined by an
+  /// explicit getter and/or setter.
+  bool get isAbstractField => kind == ElementKind.ABSTRACT_FIELD;
+
+  /// `true` if this element is formal parameter either from a constructor,
+  /// method, or typedef declaration or from an inlined function typed
+  /// parameter.
+  ///
+  /// This property is `false` if this element is an initializing formal.
+  /// See [isFieldParameter].
+  bool get isParameter => kind == ElementKind.PARAMETER;
+
+  /// `true` if this element is an initializing formal of constructor, that
+  /// is a formal of the form `this.foo`.
+  bool get isFieldParameter => kind == ElementKind.FIELD_PARAMETER;
+
+  bool get isStatement;
+
+  bool get isErroneous;
+  bool get isAmbiguous;
+  bool get isWarnOnUse;
+
+  bool get isClosure;
+  bool get isMember;
+  bool get isInstanceMember;
 
   /// Returns true if this [Element] is a top level element.
   /// That is, if it is not defined within the scope of a class.
@@ -228,22 +288,37 @@
   /// This means whether the enclosing element is a compilation unit.
   /// With the exception of [ClosureClassElement] that is considered top level
   /// as all other classes.
-  bool isTopLevel();
-  bool isAssignable();
-  bool isNative();
-  bool isDeferredLoaderGetter();
+  bool get isTopLevel;
+  bool get isAssignable;
+  bool get isNative;
+  bool get isDeferredLoaderGetter;
 
-  bool impliesType();
+  /// `true` if this element is a constructor, top level or local variable,
+  /// or static field that is declared `const`.
+  bool get isConst;
 
-  Token position();
+  /// `true` if this element is a top level or local variable, static or
+  /// instance field, or parameter that is declared `final`.
+  bool get isFinal;
 
-  CompilationUnitElement getCompilationUnit();
-  LibraryElement getLibrary();
-  LibraryElement getImplementationLibrary();
-  ClassElement getEnclosingClass();
-  Element getEnclosingClassOrCompilationUnit();
-  Element getEnclosingMember();
-  Element getOutermostEnclosingMemberOrTopLevel();
+  /// `true` if this element is a method, getter, setter or field that
+  /// is declared `static`.
+  bool get isStatic;
+
+  bool get impliesType;
+
+  Token get position;
+
+  CompilationUnitElement get compilationUnit;
+  LibraryElement get library;
+  LibraryElement get implementationLibrary;
+  ClassElement get enclosingClass;
+  Element get enclosingClassOrCompilationUnit;
+  Element get enclosingMember;
+  Element get outermostEnclosingMemberOrTopLevel;
+
+  /// The enclosing class that defines the type environment for this element.
+  ClassElement get contextClass;
 
   FunctionElement asFunctionElement();
 
@@ -297,8 +372,8 @@
   bool get isForwardingConstructor;
   bool get isMixinApplication;
 
-  bool hasFixedBackendName();
-  String fixedBackendName();
+  bool get hasFixedBackendName;
+  String get fixedBackendName;
 
   bool get isAbstract;
   bool isForeign(Compiler compiler);
@@ -323,15 +398,15 @@
 
 class Elements {
   static bool isUnresolved(Element e) {
-    return e == null || e.isErroneous();
+    return e == null || e.isErroneous;
   }
-  static bool isErroneousElement(Element e) => e != null && e.isErroneous();
+  static bool isErroneousElement(Element e) => e != null && e.isErroneous;
 
   /// Unwraps [element] reporting any warnings attached to it, if any.
   static Element unwrap(Element element,
                         DiagnosticListener listener,
                         Spannable spannable) {
-    if (element != null && element.isWarnOnUse()) {
+    if (element != null && element.isWarnOnUse) {
       WarnOnUseElement wrappedElement = element;
       element = wrappedElement.unwrap(listener, spannable);
     }
@@ -345,7 +420,7 @@
 
   static bool isLocal(Element element) {
     return !Elements.isUnresolved(element)
-            && !element.isInstanceMember()
+            && !element.isInstanceMember
             && !isStaticOrTopLevelField(element)
             && !isStaticOrTopLevelFunction(element)
             && (identical(element.kind, ElementKind.VARIABLE) ||
@@ -355,7 +430,7 @@
 
   static bool isInstanceField(Element element) {
     return !Elements.isUnresolved(element)
-           && element.isInstanceMember()
+           && element.isInstanceMember
            && (identical(element.kind, ElementKind.FIELD)
                || identical(element.kind, ElementKind.GETTER)
                || identical(element.kind, ElementKind.SETTER));
@@ -365,13 +440,13 @@
     // TODO(ager): This should not be necessary when patch support has
     // been reworked.
     if (!Elements.isUnresolved(element)
-        && element.modifiers.isStatic()) {
+        && element.isStatic) {
       return true;
     }
     return !Elements.isUnresolved(element)
-           && !element.isAmbiguous()
-           && !element.isInstanceMember()
-           && !element.isPrefix()
+           && !element.isAmbiguous
+           && !element.isInstanceMember
+           && !element.isPrefix
            && element.enclosingElement != null
            && (element.enclosingElement.kind == ElementKind.CLASS ||
                element.enclosingElement.kind == ElementKind.COMPILATION_UNIT ||
@@ -381,15 +456,15 @@
 
   static bool isInStaticContext(Element element) {
     if (isUnresolved(element)) return true;
-    if (element.enclosingElement.isClosure()) {
+    if (element.enclosingElement.isClosure) {
       var closureClass = element.enclosingElement;
       element = closureClass.methodElement;
     }
-    Element outer = element.getOutermostEnclosingMemberOrTopLevel();
+    Element outer = element.outermostEnclosingMemberOrTopLevel;
     if (isUnresolved(outer)) return true;
-    if (outer.isTopLevel()) return true;
-    if (outer.isGenerativeConstructor()) return false;
-    if (outer.isInstanceMember()) return false;
+    if (outer.isTopLevel) return true;
+    if (outer.isGenerativeConstructor) return false;
+    if (outer.isInstanceMember) return false;
     return true;
   }
 
@@ -407,13 +482,13 @@
 
   static bool isInstanceMethod(Element element) {
     return !Elements.isUnresolved(element)
-           && element.isInstanceMember()
+           && element.isInstanceMember
            && (identical(element.kind, ElementKind.FUNCTION));
   }
 
   static bool isNativeOrExtendsNative(ClassElement element) {
     if (element == null) return false;
-    if (element.isNative()) return true;
+    if (element.isNative) return true;
     assert(element.resolutionState == STATE_DONE);
     return isNativeOrExtendsNative(element.superclass);
   }
@@ -439,7 +514,7 @@
 
   static String reconstructConstructorNameSourceString(Element element) {
     if (element.name == '') {
-      return element.getEnclosingClass().name;
+      return element.enclosingClass.name;
     } else {
       return reconstructConstructorName(element);
     }
@@ -447,7 +522,7 @@
 
   // TODO(johnniwinther): Remove this method.
   static String reconstructConstructorName(Element element) {
-    String className = element.getEnclosingClass().name;
+    String className = element.enclosingClass.name;
     if (element.name == '') {
       return className;
     } else {
@@ -455,10 +530,15 @@
     }
   }
 
+  /// Returns `true` if [name] is the name of an operator method.
+  static bool isOperatorName(String name) {
+    return name == 'unary-' || isUserDefinableOperator(name);
+  }
+
   /**
-   * Map an operator-name to a valid Dart identifier.
+   * Map an operator-name to a valid JavaScript identifier.
    *
-   * For non-operator names, this metod just returns its input.
+   * For non-operator names, this method just returns its input.
    *
    * The results returned from this method are guaranteed to be valid
    * JavaScript identifers, except it may include reserved words for
@@ -570,12 +650,12 @@
   /// on the source code order.
   static int compareByPosition(Element a, Element b) {
     if (identical(a, b)) return 0;
-    int r = a.getLibrary().compareTo(b.getLibrary());
+    int r = a.library.compareTo(b.library);
     if (r != 0) return r;
-    r = a.getCompilationUnit().compareTo(b.getCompilationUnit());
+    r = a.compilationUnit.compareTo(b.compilationUnit);
     if (r != 0) return r;
-    Token positionA = a.position();
-    Token positionB = b.position();
+    Token positionA = a.position;
+    Token positionB = b.position;
     int offsetA = positionA == null ? -1 : positionA.charOffset;
     int offsetB = positionB == null ? -1 : positionB.charOffset;
     r = offsetA.compareTo(offsetB);
@@ -621,12 +701,12 @@
   static bool isConstructorOfTypedArraySubclass(Element element,
                                                 Compiler compiler) {
     if (compiler.typedDataLibrary == null) return false;
-    if (!element.isConstructor()) return false;
-    FunctionElement constructor = element;
-    constructor = constructor.redirectionTarget;
-    ClassElement cls = constructor.getEnclosingClass();
-    return cls.getLibrary() == compiler.typedDataLibrary
-        && cls.isNative()
+    if (!element.isConstructor) return false;
+    ConstructorElement constructor = element;
+    constructor = constructor.effectiveTarget;
+    ClassElement cls = constructor.enclosingClass;
+    return cls.library == compiler.typedDataLibrary
+        && cls.isNative
         && compiler.world.isSubtype(compiler.typedDataClass, cls)
         && compiler.world.isSubtype(compiler.listClass, cls)
         && constructor.name == '';
@@ -659,7 +739,7 @@
   }
 }
 
-abstract class ErroneousElement extends Element implements FunctionElement {
+abstract class ErroneousElement extends Element implements ConstructorElement {
   MessageKind get messageKind;
   Map get messageArguments;
   String get message;
@@ -791,30 +871,25 @@
 }
 
 abstract class TypedefElement extends Element
-    implements TypeDeclarationElement {
+    implements AstElement, TypeDeclarationElement, FunctionTypedElement {
   TypedefType get thisType;
   TypedefType get rawType;
   DartType get alias;
-  FunctionSignature get functionSignature;
-  Link<DartType> get typeVariables;
-
-  // TODO(kasperl): Try to get rid of these setters.
-  void set alias(DartType value);
-  void set functionSignature(FunctionSignature value);
 
   void checkCyclicReference(Compiler compiler);
 }
 
-abstract class VariableElement extends Element implements TypedElement {
+abstract class VariableElement extends Element
+    implements TypedElement, AstElement {
   Expression get initializer;
 }
 
 abstract class FieldElement extends VariableElement
     implements ClosureContainer {}
 
-abstract class ParameterElement extends VariableElement {
+abstract class ParameterElement extends VariableElement
+    implements FunctionTypedElement {
   VariableDefinitions get node;
-  FunctionSignature get functionSignature;
 }
 
 abstract class FieldParameterElement extends ParameterElement {
@@ -856,39 +931,61 @@
 }
 
 abstract class FunctionElement extends Element
-    implements TypedElement, ClosureContainer {
+    implements AstElement,
+               TypedElement,
+               FunctionTypedElement,
+               ClosureContainer {
   FunctionExpression get node;
-  DartType get type;
-  FunctionSignature get functionSignature;
-  FunctionElement get redirectionTarget;
-  FunctionElement get defaultImplementation;
 
   FunctionElement get patch;
   FunctionElement get origin;
 
-  bool get isRedirectingFactory;
-
   /// Used to retrieve a link to the abstract field element representing this
   /// element.
   AbstractFieldElement get abstractField;
 
-  /**
-   * Compute the type of the target of a constructor for an instantiation site
-   * with type [:newType:].
-   */
-  InterfaceType computeTargetType(InterfaceType newType);
-
-  // TODO(kasperl): These are bit fishy. Do we really need them?
-  void set defaultImplementation(FunctionElement value);
-
   /// Do not use [computeSignature] outside of the resolver; instead retrieve
   /// the signature through the [functionSignature] field.
   /// Trying to access a function signature that has not been computed in
   /// resolution is an error and calling [computeSignature] covers that error.
   /// This method will go away!
   @deprecated FunctionSignature computeSignature(Compiler compiler);
+}
 
-  FunctionExpression parseNode(DiagnosticListener listener);
+abstract class ConstructorElement extends FunctionElement {
+  /// The effective target of this constructor, that is the non-redirecting
+  /// constructor that is called on invocation of this constructor.
+  ///
+  /// Consider for instance this hierachy:
+  ///
+  ///     class C { factory C.c() = D.d; }
+  ///     class D { factory D.d() = E.e2; }
+  ///     class E { E.e1();
+  ///               E.e2() : this.e1(); }
+  ///
+  /// The effective target of both `C.c`, `D.d`, and `E.e2` is `E.e2`, and the
+  /// effective target of `E.e1` is `E.e1` itself.
+  ConstructorElement get effectiveTarget;
+
+  /// The immediate redirection target of a redirecting factory constructor.
+  ///
+  /// Consider for instance this hierachy:
+  ///
+  ///     class C { factory C() = D; }
+  ///     class D { factory D() = E; }
+  ///     class E { E(); }
+  ///
+  /// The immediate redirection target of `C` is `D` and the immediate
+  /// redirection target of `D` is `E`. `E` is not a redirecting factory
+  /// constructor so its immediate redirection target is `null`.
+  ConstructorElement get immediateRedirectionTarget;
+
+  /// Is `true` if this constructor is a redirecting factory constructor.
+  bool get isRedirectingFactory;
+
+  /// Compute the type of the effective target of this constructor for an
+  /// instantiation site with type [:newType:].
+  InterfaceType computeEffectiveTargetType(InterfaceType newType);
 }
 
 abstract class ConstructorBodyElement extends FunctionElement {
@@ -899,8 +996,34 @@
  * [TypeDeclarationElement] defines the common interface for class/interface
  * declarations and typedefs.
  */
-abstract class TypeDeclarationElement extends Element {
+abstract class TypeDeclarationElement extends Element implements AstElement {
+  /**
+   * The `this type` for this type declaration.
+   *
+   * The type of [:this:] is the generic type based on this element in which
+   * the type arguments are the declared type variables. For instance,
+   * [:List<E>:] for [:List:] and [:Map<K,V>:] for [:Map:].
+   *
+   * For a class declaration this is the type of [:this:].
+   */
   GenericType get thisType;
+
+  /**
+   * The raw type for this type declaration.
+   *
+   * The raw type is the generic type base on this element in which the type
+   * arguments are all [dynamic]. For instance [:List<dynamic>:] for [:List:]
+   * and [:Map<dynamic,dynamic>:] for [:Map:]. For non-generic classes [rawType]
+   * is the same as [thisType].
+   *
+   * The [rawType] field is a canonicalization of the raw type and should be
+   * used to distinguish explicit and implicit uses of the [dynamic]
+   * type arguments. For instance should [:List:] be the [rawType] of the
+   * [:List:] class element whereas [:List<dynamic>:] should be its own
+   * instantiation of [InterfaceType] with [:dynamic:] as type argument. Using
+   * this distinction, we can print the raw type with type arguments only when
+   * the input source has used explicit type arguments.
+   */
   GenericType get rawType;
 
   /**
@@ -922,12 +1045,21 @@
 
   InterfaceType get rawType;
   InterfaceType get thisType;
-
   ClassElement get superclass;
 
+  /// The direct supertype of this class.
   DartType get supertype;
+
+  /// Ordered set of all supertypes of this class including the class itself.
   OrderedTypeSet get allSupertypesAndSelf;
+
+  /// A list of all supertypes of this class excluding the class itself.
   Link<DartType> get allSupertypes;
+
+  /// Returns the this type of this class as an instance of [cls].
+  InterfaceType asInstanceOf(ClassElement cls);
+
+  /// A list of all direct superinterfaces of this class.
   Link<DartType> get interfaces;
 
   bool get hasConstructor;
@@ -1067,7 +1199,8 @@
 }
 
 /// The [Element] for a type variable declaration on a generic class or typedef.
-abstract class TypeVariableElement extends Element implements TypedElement {
+abstract class TypeVariableElement extends Element
+    implements AstElement, TypedElement {
   /// The [type] defined by the type variable.
   TypeVariableType get type;
 
@@ -1090,14 +1223,25 @@
   MetadataAnnotation ensureResolved(Compiler compiler);
 }
 
-// TODO(johnniwinther): Remove this element.
-abstract class VoidElement extends Element {}
-
 /// An [Element] that has a type.
 abstract class TypedElement extends Element {
   DartType get type;
 }
 
+/// An [Element] that can define a function type.
+abstract class FunctionTypedElement extends Element {
+  /// The function signature for the function type defined by this element,
+  /// if any.
+  FunctionSignature get functionSignature;
+}
+
+/// An [Element] that (potentially) has a node.
+///
+/// Synthesized elements may return `null` from [node].
+abstract class AstElement extends Element {
+  Node get node;
+}
+
 /// A [MemberSignature] is a member of an interface.
 ///
 /// A signature is either a method or a getter or setter, possibly implicitly
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 7fb55a0..acc035b 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -34,7 +34,7 @@
 
 import 'visitor.dart' show ElementVisitor;
 
-abstract class ElementX implements Element {
+abstract class ElementX extends Element {
   static int elementHashCode = 0;
 
   final String name;
@@ -44,18 +44,20 @@
   Link<MetadataAnnotation> metadata = const Link<MetadataAnnotation>();
 
   ElementX(this.name, this.kind, this.enclosingElement) {
-    assert(isErroneous() || getImplementationLibrary() != null);
+    assert(isErroneous || implementationLibrary != null);
   }
 
   Modifiers get modifiers => Modifiers.EMPTY;
 
   Node parseNode(DiagnosticListener listener) {
-    listener.internalError(this, 'Not implemented.');
+    listener.internalError(this,
+        'parseNode not implemented on $this.');
     return null;
   }
 
   DartType computeType(Compiler compiler) {
-    compiler.internalError(this, "$this.computeType.");
+    compiler.internalError(this,
+        "computeType not implemented on $this.");
     return null;
   }
 
@@ -69,47 +71,30 @@
     metadata = metadata.prepend(annotation);
   }
 
-
-  bool isFunction() => identical(kind, ElementKind.FUNCTION);
-  bool isConstructor() => isFactoryConstructor() || isGenerativeConstructor();
-  bool isClosure() => false;
-  bool isMember() {
+  bool get isClosure => false;
+  bool get isMember {
     // Check that this element is defined in the scope of a Class.
-    return enclosingElement != null && enclosingElement.isClass();
+    return enclosingElement != null && enclosingElement.isClass;
   }
-  bool isInstanceMember() => false;
-  bool isDeferredLoaderGetter() => false;
+  bool get isInstanceMember => false;
+  bool get isDeferredLoaderGetter => false;
 
-  bool isFactoryConstructor() => modifiers.isFactory();
-  bool isGenerativeConstructor() =>
-      identical(kind, ElementKind.GENERATIVE_CONSTRUCTOR);
-  bool isGenerativeConstructorBody() =>
-      identical(kind, ElementKind.GENERATIVE_CONSTRUCTOR_BODY);
-  bool isCompilationUnit() => identical(kind, ElementKind.COMPILATION_UNIT);
-  bool isClass() => identical(kind, ElementKind.CLASS);
-  bool isPrefix() => identical(kind, ElementKind.PREFIX);
-  bool isVariable() => identical(kind, ElementKind.VARIABLE);
-  bool isParameter() => identical(kind, ElementKind.PARAMETER);
-  bool isStatement() => identical(kind, ElementKind.STATEMENT);
-  bool isTypedef() => identical(kind, ElementKind.TYPEDEF);
-  bool isTypeVariable() => identical(kind, ElementKind.TYPE_VARIABLE);
-  bool isField() => identical(kind, ElementKind.FIELD);
-  bool isFieldParameter() => identical(kind, ElementKind.FIELD_PARAMETER);
-  bool isAbstractField() => identical(kind, ElementKind.ABSTRACT_FIELD);
-  bool isGetter() => identical(kind, ElementKind.GETTER);
-  bool isSetter() => identical(kind, ElementKind.SETTER);
-  bool isAccessor() => isGetter() || isSetter();
-  bool isLibrary() => identical(kind, ElementKind.LIBRARY);
-  bool impliesType() => (kind.category & ElementCategory.IMPLIES_TYPE) != 0;
+  bool get isFactoryConstructor => modifiers.isFactory;
+  bool get isConst => modifiers.isConst;
+  bool get isFinal => modifiers.isFinal;
+  bool get isStatic => modifiers.isStatic;
+  bool get isOperator => Elements.isOperatorName(name);
+  bool get isStatement => identical(kind, ElementKind.STATEMENT);
+  bool get impliesType => (kind.category & ElementCategory.IMPLIES_TYPE) != 0;
 
   /** See [ErroneousElement] for documentation. */
-  bool isErroneous() => false;
+  bool get isErroneous => false;
 
   /** See [AmbiguousElement] for documentation. */
-  bool isAmbiguous() => false;
+  bool get isAmbiguous => false;
 
   /** See [WarnOnUseElement] for documentation. */
-  bool isWarnOnUse() => false;
+  bool get isWarnOnUse => false;
 
   bool get isPatched => false;
 
@@ -141,20 +126,20 @@
   // elements are null) and is invalid for top level variable declarations for
   // which the enclosing element is a VariableDeclarations and not a compilation
   // unit.
-  bool isTopLevel() {
-    return enclosingElement != null && enclosingElement.isCompilationUnit();
+  bool get isTopLevel {
+    return enclosingElement != null && enclosingElement.isCompilationUnit;
   }
 
-  bool isAssignable() {
-    if (modifiers.isFinalOrConst()) return false;
-    if (isFunction() || isGenerativeConstructor()) return false;
+  bool get isAssignable {
+    if (isFinal || isConst) return false;
+    if (isFunction || isGenerativeConstructor) return false;
     return true;
   }
 
-  Token position() => null;
+  Token get position => null;
 
   Token findMyName(Token token) {
-    return findNameToken(token, isConstructor(), name, enclosingElement.name);
+    return findNameToken(token, isConstructor, name, enclosingElement.name);
   }
 
   static Token findNameToken(Token token, bool isConstructor, String name,
@@ -172,17 +157,17 @@
     return token;
   }
 
-  CompilationUnitElement getCompilationUnit() {
+  CompilationUnitElement get compilationUnit {
     Element element = this;
-    while (!element.isCompilationUnit()) {
+    while (!element.isCompilationUnit) {
       element = element.enclosingElement;
     }
     return element;
   }
 
-  LibraryElement getLibrary() => enclosingElement.getLibrary();
+  LibraryElement get library => enclosingElement.library;
 
-  LibraryElement getImplementationLibrary() {
+  LibraryElement get implementationLibrary {
     Element element = this;
     while (!identical(element.kind, ElementKind.LIBRARY)) {
       element = element.enclosingElement;
@@ -190,16 +175,16 @@
     return element;
   }
 
-  ClassElement getEnclosingClass() {
+  ClassElement get enclosingClass {
     for (Element e = this; e != null; e = e.enclosingElement) {
-      if (e.isClass()) return e;
+      if (e.isClass) return e;
     }
     return null;
   }
 
-  Element getEnclosingClassOrCompilationUnit() {
+  Element get enclosingClassOrCompilationUnit {
    for (Element e = this; e != null; e = e.enclosingElement) {
-      if (e.isClass() || e.isCompilationUnit()) return e;
+      if (e.isClass || e.isCompilationUnit) return e;
     }
     return null;
   }
@@ -208,23 +193,35 @@
    * Returns the member enclosing this element or the element itself if it is a
    * member. If no enclosing element is found, [:null:] is returned.
    */
-  Element getEnclosingMember() {
+  Element get enclosingMember {
     for (Element e = this; e != null; e = e.enclosingElement) {
-      if (e.isMember()) return e;
+      if (e.isMember) return e;
     }
     return null;
   }
 
-  Element getOutermostEnclosingMemberOrTopLevel() {
+  Element get outermostEnclosingMemberOrTopLevel {
     // TODO(lrn): Why is this called "Outermost"?
     for (Element e = this; e != null; e = e.enclosingElement) {
-      if (e.isMember() || e.isTopLevel()) {
+      if (e.isMember || e.isTopLevel) {
         return e;
       }
     }
     return null;
   }
 
+  ClassElement get contextClass {
+    ClassElement cls;
+    for (Element e = this; e != null; e = e.enclosingElement) {
+      if (e.isClass) {
+        // Record [e] instead of returning it directly. We need the last class
+        // in the chain since the first classes might be closure classes.
+        cls = e.declaration;
+      }
+    }
+    return cls;
+  }
+
   /**
    * Creates the scope for this element.
    */
@@ -234,7 +231,7 @@
     // TODO(johnniwinther): Test for nullness of name, or make non-nullness an
     // invariant for all element types?
     var nameText = name != null ? name : '?';
-    if (enclosingElement != null && !isTopLevel()) {
+    if (enclosingElement != null && !isTopLevel) {
       String holderName = enclosingElement.name != null
           ? enclosingElement.name
           : '${enclosingElement.kind}?';
@@ -246,9 +243,9 @@
 
   String _fixedBackendName = null;
   bool _isNative = false;
-  bool isNative() => _isNative;
-  bool hasFixedBackendName() => _fixedBackendName != null;
-  String fixedBackendName() => _fixedBackendName;
+  bool get isNative => _isNative;
+  bool get hasFixedBackendName => _fixedBackendName != null;
+  String get fixedBackendName => _fixedBackendName;
   // Marks this element as a native element.
   void setNative(String name) {
     _isNative = true;
@@ -260,8 +257,8 @@
 
   FunctionElement asFunctionElement() => null;
 
-  bool get isAbstract => modifiers.isAbstract();
-  bool isForeign(Compiler compiler) => getLibrary() == compiler.foreignLibrary;
+  bool get isAbstract => modifiers.isAbstract;
+  bool isForeign(Compiler compiler) => library == compiler.foreignLibrary;
 
   FunctionElement get targetConstructor => null;
 
@@ -295,7 +292,7 @@
                     String name, Element enclosing)
       : super(name, ElementKind.ERROR, enclosing);
 
-  isErroneous() => true;
+  bool get isErroneous => true;
 
   AbstractFieldElement abstractField;
 
@@ -310,21 +307,16 @@
   get functionSignature => unsupported();
   get patch => null;
   get origin => this;
-  get defaultImplementation => unsupported();
+  get immediateRedirectionTarget => unsupported();
   get nestedClosures => unsupported();
 
   bool get isRedirectingFactory => unsupported();
 
   computeSignature(compiler) => unsupported();
 
-  // TODO(kasperl): These seem unnecessary.
-  set defaultImplementation(value) => unsupported();
+  get effectiveTarget => this;
 
-  get redirectionTarget => this;
-
-  getLibrary() => enclosingElement.getLibrary();
-
-  computeTargetType(InterfaceType newType) => unsupported();
+  computeEffectiveTargetType(InterfaceType newType) => unsupported();
 
   String get message => '${messageKind.message(messageArguments)}';
 
@@ -370,7 +362,7 @@
       : this.wrappedElement = wrappedElement,
         super(wrappedElement.name, ElementKind.WARN_ON_USE, enclosingElement);
 
-  bool isWarnOnUse() => true;
+  bool get isWarnOnUse => true;
 
   Element unwrap(DiagnosticListener listener, Spannable usageSpannable) {
     var unwrapped = wrappedElement;
@@ -386,7 +378,7 @@
       listener.reportInfo(
           spannable, info.messageKind, info.messageArguments);
     }
-    if (unwrapped.isWarnOnUse()) {
+    if (unwrapped.isWarnOnUse) {
       unwrapped = unwrapped.unwrap(listener, usageSpannable);
     }
     return unwrapped;
@@ -429,12 +421,12 @@
         this.newElement = newElement,
         super(existingElement.name, ElementKind.AMBIGUOUS, enclosingElement);
 
-  bool isAmbiguous() => true;
+  bool get isAmbiguous => true;
 
   Setlet flatten() {
     Element element = this;
     var set = new Setlet();
-    while (element.isAmbiguous()) {
+    while (element.isAmbiguous) {
       AmbiguousElement ambiguous = element;
       set.add(ambiguous.newElement);
       element = ambiguous.existingElement;
@@ -447,7 +439,7 @@
     Setlet ambiguousElements = flatten();
     MessageKind code = (ambiguousElements.length == 1)
         ? MessageKind.AMBIGUOUS_REEXPORT : MessageKind.AMBIGUOUS_LOCATION;
-    LibraryElementX importer = context.getLibrary();
+    LibraryElementX importer = context.library;
     for (Element element in ambiguousElements) {
       var arguments = {'name': element.name};
       listener.reportInfo(element, code, arguments);
@@ -476,7 +468,7 @@
 
   void add(Element element, DiagnosticListener listener) {
     String name = element.name;
-    if (element.isAccessor()) {
+    if (element.isAccessor) {
       addAccessor(element, contents[name], listener);
     } else {
       Element existing = contents.putIfAbsent(name, () => element);
@@ -521,13 +513,13 @@
       } else {
         AbstractFieldElementX field = existing;
         accessor.abstractField = field;
-        if (accessor.isGetter()) {
+        if (accessor.isGetter) {
           if (field.getter != null && field.getter != accessor) {
             reportError(field.getter);
           }
           field.getter = accessor;
         } else {
-          assert(accessor.isSetter());
+          assert(accessor.isSetter);
           if (field.setter != null && field.setter != accessor) {
             reportError(field.setter);
           }
@@ -535,11 +527,11 @@
         }
       }
     } else {
-      Element container = accessor.getEnclosingClassOrCompilationUnit();
+      Element container = accessor.enclosingClassOrCompilationUnit;
       AbstractFieldElementX field =
           new AbstractFieldElementX(accessor.name, container);
       accessor.abstractField = field;
-      if (accessor.isGetter()) {
+      if (accessor.isGetter) {
         field.getter = accessor;
       } else {
         field.setter = accessor;
@@ -572,9 +564,9 @@
     localMembers = localMembers.prepend(element);
     // Provide the member to the library to build scope.
     if (enclosingElement.isPatch) {
-      getImplementationLibrary().addMember(element, listener);
+      implementationLibrary.addMember(element, listener);
     } else {
-      getLibrary().addMember(element, listener);
+      library.addMember(element, listener);
     }
   }
 
@@ -593,7 +585,7 @@
       return;
     }
     partTag = tag;
-    LibraryName libraryTag = getLibrary().libraryTag;
+    LibraryName libraryTag = library.libraryTag;
     String actualName = tag.name.toString();
     if (libraryTag != null) {
       String expectedName = libraryTag.name.toString();
@@ -603,7 +595,7 @@
             {'libraryName': expectedName});
       }
     } else {
-      listener.reportWarning(getLibrary(),
+      listener.reportWarning(library,
           MessageKind.MISSING_LIBRARY_NAME,
           {'libraryName': actualName});
       listener.reportInfo(tag.name,
@@ -661,13 +653,13 @@
                  Element element,
                  Import import,
                  DiagnosticListener listener) {
-    LibraryElementX library = enclosingElement.getLibrary();
+    LibraryElementX library = enclosingElement.library;
     Importers importers = library.importers;
 
     String name = element.name;
 
     // The loadLibrary function always shadows existing bindings to that name.
-    if (element.isDeferredLoaderGetter()) {
+    if (element.isDeferredLoaderGetter) {
       importScope.remove(name);
       // TODO(sigurdm): Print a hint.
     }
@@ -678,8 +670,8 @@
                                   MessageKind messageKind,
                                   Element hidingElement,
                                   Element hiddenElement) {
-      Uri hiddenUri = hiddenElement.getLibrary().canonicalUri;
-      Uri hidingUri = hidingElement.getLibrary().canonicalUri;
+      Uri hiddenUri = hiddenElement.library.canonicalUri;
+      Uri hidingUri = hidingElement.library.canonicalUri;
       Element element = new WarnOnUseElementX(
           new WrappedMessage(
               null, // Report on reference to [hidingElement].
@@ -697,13 +689,13 @@
     if (existing != element) {
       Import existingImport = importers.getImport(existing);
       Element newElement;
-      if (existing.getLibrary().isPlatformLibrary &&
-          !element.getLibrary().isPlatformLibrary) {
+      if (existing.library.isPlatformLibrary &&
+          !element.library.isPlatformLibrary) {
         // [existing] is implicitly hidden.
         registerWarnOnUseElement(
             import, MessageKind.HIDDEN_IMPORT, element, existing);
-      } else if (!existing.getLibrary().isPlatformLibrary &&
-                 element.getLibrary().isPlatformLibrary) {
+      } else if (!existing.library.isPlatformLibrary &&
+                 element.library.isPlatformLibrary) {
         // [element] is implicitly hidden.
         if (import == null) {
           // [element] is imported implicitly (probably through dart:core).
@@ -778,7 +770,7 @@
     throw new SpannableAssertionFailure(this, 'Cannot set metadata on Library');
   }
 
-  CompilationUnitElement getCompilationUnit() => entryCompilationUnit;
+  CompilationUnitElement get compilationUnit => entryCompilationUnit;
 
   void addCompilationUnit(CompilationUnitElement element) {
     compilationUnits = compilationUnits.prepend(element);
@@ -849,7 +841,7 @@
     slotForExports = builder.toLink();
   }
 
-  LibraryElement getLibrary() => isPatch ? origin : this;
+  LibraryElement get library => isPatch ? origin : this;
 
   /**
    * Look up a top-level element in this library. The element could
@@ -879,7 +871,7 @@
     // TODO(johnniwinther): How to handle injected elements in the patch
     // library?
     Element result = localScope.lookup(elementName);
-    if (result == null || result.getLibrary() != this) return null;
+    if (result == null || result.library != this) return null;
     return result;
   }
 
@@ -1000,7 +992,7 @@
 
   DartType computeType(Compiler compiler) => compiler.types.dynamicType;
 
-  Token position() => firstPosition;
+  Token get position => firstPosition;
 
   void addImport(Element element, Import import, DiagnosticListener listener) {
     importScope.addImport(this, element, import, listener);
@@ -1031,6 +1023,12 @@
   TypedefElementX(String name, Element enclosing)
       : super(name, ElementKind.TYPEDEF, enclosing);
 
+  Typedef get node {
+    assert(invariant(this, cachedNode != null,
+        message: "Node has not been computed for $this."));
+    return cachedNode;
+  }
+
   /**
    * Function signature for a typedef of a function type. The signature is
    * kept to provide full information about parameter names through the mirror
@@ -1123,6 +1121,12 @@
     variables.metadata = variables.metadata.prepend(annotation);
   }
 
+  VariableDefinitions get node {
+    assert(invariant(this, definitionsCache != null,
+        message: "Node has not been computed for $this."));
+    return definitionsCache;
+  }
+
   Expression get initializer {
     assert(invariant(this, definitionsCache != null,
         message: "Initializer has not been computed for $this."));
@@ -1133,6 +1137,13 @@
     if (definitionsCache != null) return definitionsCache;
 
     VariableDefinitions definitions = variables.parseNode(this, listener);
+    createDefinitions(definitions);
+    return definitionsCache;
+  }
+
+  void createDefinitions(VariableDefinitions definitions) {
+    assert(invariant(this, definitionsCache == null,
+        message: "VariableDefinitions has already been computed for $this."));
     Expression node;
     int count = 0;
     for (Link<Node> link = definitions.definitions.nodes;
@@ -1151,10 +1162,7 @@
       }
       count++;
     }
-    if (node == null) {
-      listener.internalError(definitions,
-                             "Could not find '$name'.");
-    }
+    invariant(definitions, node != null, message: "Could not find '$name'.");
     if (count == 1) {
       definitionsCache = definitions;
     } else {
@@ -1166,7 +1174,6 @@
               const Link<Node>().prepend(node),
               definitions.definitions.endToken));
     }
-    return definitionsCache;
   }
 
   DartType computeType(Compiler compiler) {
@@ -1184,15 +1191,25 @@
     return variables.type;
   }
 
-  bool isInstanceMember() => isMember() && !modifiers.isStatic();
+  bool get isInstanceMember => isMember && !isStatic;
 
-  // Note: cachedNode.getBeginToken() will not be correct in all
+  // Note: cachedNode.beginToken will not be correct in all
   // cases, for example, for function typed parameters.
-  Token position() => token;
+  Token get position => token;
 
   accept(ElementVisitor visitor) => visitor.visitVariableElement(this);
 }
 
+class LocalVariableElementX extends VariableElementX {
+  LocalVariableElementX(String name,
+                        Element enclosingElement,
+                        VariableList variables,
+                        Token token)
+      : super(name, ElementKind.VARIABLE, enclosingElement, variables, token) {
+    createDefinitions(variables.definitions);
+  }
+}
+
 class FieldElementX extends VariableElementX implements FieldElement {
   List<FunctionElement> nestedClosures = new List<FunctionElement>();
 
@@ -1254,7 +1271,7 @@
 
   Modifiers get modifiers => definitions.modifiers;
 
-  Token position() => identifier.getBeginToken();
+  Token get position => identifier.getBeginToken();
 
   Node parseNode(DiagnosticListener listener) => definitions;
 
@@ -1284,8 +1301,8 @@
 }
 
 class AbstractFieldElementX extends ElementX implements AbstractFieldElement {
-  FunctionElement getter;
-  FunctionElement setter;
+  FunctionElementX getter;
+  FunctionElementX setter;
 
   AbstractFieldElementX(String name, Element enclosing)
       : super(name, ElementKind.ABSTRACT_FIELD, enclosing);
@@ -1298,7 +1315,7 @@
     throw "internal error: AbstractFieldElement has no node";
   }
 
-  Token position() {
+  Token get position {
     // The getter and setter may be defined in two different
     // compilation units.  However, we know that one of them is
     // non-null and defined in the same compilation unit as the
@@ -1309,10 +1326,10 @@
     // We need to make sure that the position returned is relative to
     // the compilation unit of the abstract element.
     if (getter != null
-        && identical(getter.getCompilationUnit(), getCompilationUnit())) {
-      return getter.position();
+        && identical(getter.compilationUnit, compilationUnit)) {
+      return getter.position;
     } else {
-      return setter.position();
+      return setter.position;
     }
   }
 
@@ -1329,8 +1346,8 @@
     }
   }
 
-  bool isInstanceMember() {
-    return isMember() && !modifiers.isStatic();
+  bool get isInstanceMember {
+    return isMember && !isStatic;
   }
 
   accept(ElementVisitor visitor) => visitor.visitAbstractFieldElement(this);
@@ -1427,10 +1444,9 @@
   }
 }
 
-class FunctionElementX
+abstract class FunctionElementX
     extends ElementX with AnalyzableElement, PatchMixin<FunctionElement>
     implements FunctionElement {
-  FunctionExpression cachedNode;
   DartType typeCache;
   final Modifiers modifiers;
 
@@ -1442,32 +1458,15 @@
 
   AbstractFieldElement abstractField;
 
-  /**
-   * If this is a redirecting factory, [defaultImplementation] will be
-   * changed by the resolver to point to the redirection target.
-   * Otherwise, [:identical(defaultImplementation, this):].
-   */
-  // TODO(ahe): Rename this field to redirectionTarget.
-  FunctionElement defaultImplementation;
-
   FunctionElementX(String name,
                    ElementKind kind,
                    Modifiers modifiers,
                    Element enclosing,
                    bool hasNoBody)
-      : this.tooMuchOverloading(name, null, kind, modifiers, enclosing, null,
+      : this.tooMuchOverloading(name, kind, modifiers, enclosing, null,
                                 hasNoBody);
 
-  FunctionElementX.fromNode(String name,
-                            FunctionExpression node,
-                            ElementKind kind,
-                            Modifiers modifiers,
-                            Element enclosing)
-      : this.tooMuchOverloading(name, node, kind, modifiers, enclosing, null,
-                                false);
-
   FunctionElementX.tooMuchOverloading(String name,
-                                      FunctionExpression this.cachedNode,
                                       ElementKind kind,
                                       this.modifiers,
                                       Element enclosing,
@@ -1476,40 +1475,12 @@
       : super(name, kind, enclosing),
         _hasNoBody = hasNoBody {
     assert(modifiers != null);
-    defaultImplementation = this;
   }
 
-  bool get isRedirectingFactory => defaultImplementation != this;
-
-  /// This field is set by the post process queue when checking for cycles.
-  FunctionElement internalRedirectionTarget;
-  DartType redirectionTargetType;
-
-  set redirectionTarget(FunctionElement constructor) {
-    assert(constructor != null && internalRedirectionTarget == null);
-    internalRedirectionTarget = constructor;
-  }
-
-  FunctionElement get redirectionTarget {
-    if (Elements.isErroneousElement(defaultImplementation)) {
-      return defaultImplementation;
-    }
-    assert(!isRedirectingFactory || internalRedirectionTarget != null);
-    return isRedirectingFactory ? internalRedirectionTarget : this;
-  }
-
-  InterfaceType computeTargetType(InterfaceType newType) {
-    if (!isRedirectingFactory) return newType;
-    assert(invariant(this, redirectionTargetType != null,
-        message: 'Redirection target type has not yet been computed for '
-                 '$this.'));
-    return redirectionTargetType.substByContext(newType);
-  }
-
-  bool isInstanceMember() {
-    return isMember()
-           && !isConstructor()
-           && !modifiers.isStatic();
+  bool get isInstanceMember {
+    return isMember
+           && !isConstructor
+           && !isStatic;
   }
 
   FunctionSignature computeSignature(Compiler compiler) {
@@ -1538,31 +1509,6 @@
     return typeCache;
   }
 
-  FunctionExpression parseNode(DiagnosticListener listener) {
-    if (patch == null) {
-      if (modifiers.isExternal()) {
-        listener.internalError(this,
-            "Compiling external function with no implementation.");
-      }
-    }
-    return cachedNode;
-  }
-
-  FunctionExpression get node {
-    assert(invariant(this, cachedNode != null,
-        message: "Node has not been computed for $this."));
-    return cachedNode;
-  }
-
-  Token position() {
-    // Use the name as position if this is not an unnamed closure.
-    if (cachedNode.name != null) {
-      return cachedNode.name.getBeginToken();
-    } else {
-      return cachedNode.getBeginToken();
-    }
-  }
-
   FunctionElement asFunctionElement() => this;
 
   String toString() {
@@ -1576,29 +1522,93 @@
   }
 
   bool get isAbstract {
-    return !modifiers.isExternal() &&
-           (isFunction() || isAccessor()) &&
+    return !modifiers.isExternal &&
+           (isFunction || isAccessor) &&
            _hasNoBody;
   }
 
   accept(ElementVisitor visitor) => visitor.visitFunctionElement(this);
 }
 
+class LocalFunctionElementX extends FunctionElementX {
+  final FunctionExpression node;
+
+  LocalFunctionElementX(String name,
+                        FunctionExpression this.node,
+                        ElementKind kind,
+                        Modifiers modifiers,
+                        Element enclosing)
+      : super(name, kind, modifiers, enclosing, false);
+
+  FunctionExpression parseNode(DiagnosticListener listener) => node;
+
+  Token get position {
+    // Use the name as position if this is not an unnamed closure.
+    if (node.name != null) {
+      return node.name.getBeginToken();
+    } else {
+      return node.getBeginToken();
+    }
+  }
+}
+
+abstract class ConstructorElementX extends FunctionElementX
+    implements ConstructorElement {
+
+  ConstructorElementX(String name,
+                      ElementKind kind,
+                      Modifiers modifiers,
+                      Element enclosing)
+        : super(name, kind, modifiers, enclosing, false);
+
+  FunctionElement immediateRedirectionTarget;
+
+  bool get isRedirectingFactory => immediateRedirectionTarget != null;
+
+  /// This field is set by the post process queue when checking for cycles.
+  ConstructorElement internalEffectiveTarget;
+  DartType effectiveTargetType;
+
+  void set effectiveTarget(ConstructorElement constructor) {
+    assert(constructor != null && internalEffectiveTarget == null);
+    internalEffectiveTarget = constructor;
+  }
+
+  ConstructorElement get effectiveTarget {
+    if (Elements.isErroneousElement(immediateRedirectionTarget)) {
+      return immediateRedirectionTarget;
+    }
+    assert(!isRedirectingFactory || internalEffectiveTarget != null);
+    return isRedirectingFactory ? internalEffectiveTarget : this;
+  }
+
+  InterfaceType computeEffectiveTargetType(InterfaceType newType) {
+    if (!isRedirectingFactory) return newType;
+    assert(invariant(this, effectiveTargetType != null,
+        message: 'Redirection target type has not yet been computed for '
+                 '$this.'));
+    return effectiveTargetType.substByContext(newType);
+  }
+}
+
 class SynthesizedCallMethodElementX extends FunctionElementX {
   final FunctionElement expression;
 
   SynthesizedCallMethodElementX(String name,
-                                FunctionElement other,
+                                FunctionElementX other,
                                 Element enclosing)
       : expression = other,
-        super.tooMuchOverloading(name, other.node, other.kind,
+        super.tooMuchOverloading(name, other.kind,
                                  other.modifiers, enclosing,
                                  other.functionSignature,
                                  false);
+
+  FunctionExpression get node => expression.node;
+
+  FunctionExpression parseNode(DiagnosticListener listener) => node;
 }
 
 class DeferredLoaderGetterElementX extends FunctionElementX {
-
   final PrefixElement prefix;
 
   DeferredLoaderGetterElementX(PrefixElement prefix)
@@ -1618,21 +1628,25 @@
     return functionSignatureCache;
   }
 
-  bool isMember() => false;
+  bool get isMember => false;
 
   bool isForeign(Compiler compiler) => true;
 
   bool get isSynthesized => true;
 
-  bool isFunction() => false;
+  bool get isFunction => false;
 
-  bool isDeferredLoaderGetter() => true;
+  bool get isDeferredLoaderGetter => true;
 
-  bool isGetter() => true;
+  bool get isGetter => true;
 
   // By having position null, the enclosing elements location is printed in
   // error messages.
-  Token position() => null;
+  Token get position => null;
+
+  FunctionExpression parseNode(DiagnosticListener listener) => null;
+
+  FunctionExpression get node => null;
 }
 
 class ConstructorBodyElementX extends FunctionElementX
@@ -1648,23 +1662,18 @@
     functionSignatureCache = constructor.functionSignature;
   }
 
-  bool isInstanceMember() => true;
+  FunctionExpression get node => constructor.node;
+
+  bool get isInstanceMember => true;
 
   FunctionType computeType(Compiler compiler) {
     compiler.internalError(this, '$this.computeType.');
     return null;
   }
 
-  Node parseNode(DiagnosticListener listener) {
-    if (cachedNode != null) return cachedNode;
-    cachedNode = constructor.parseNode(listener);
-    assert(cachedNode != null);
-    return cachedNode;
-  }
+  Token get position => constructor.position;
 
-  Token position() => constructor.position();
-
-  Element getOutermostEnclosingMemberOrTopLevel() => constructor;
+  Element get outermostEnclosingMemberOrTopLevel => constructor;
 
   accept(ElementVisitor visitor) => visitor.visitConstructorBodyElement(this);
 }
@@ -1676,8 +1685,8 @@
  * This class is used to represent default constructors and forwarding
  * constructors for mixin applications.
  */
-class SynthesizedConstructorElementX extends FunctionElementX {
-  final FunctionElement superMember;
+class SynthesizedConstructorElementX extends ConstructorElementX {
+  final ConstructorElement superMember;
   final bool isDefaultConstructor;
 
   SynthesizedConstructorElementX(String name,
@@ -1687,12 +1696,16 @@
       : super(name,
               ElementKind.GENERATIVE_CONSTRUCTOR,
               Modifiers.EMPTY,
-              enclosing, false);
+              enclosing);
 
   SynthesizedConstructorElementX.forDefault(superMember, Element enclosing)
       : this('', superMember, enclosing, true);
 
-  Token position() => enclosingElement.position();
+  FunctionExpression parseNode(DiagnosticListener listener) => null;
+
+  FunctionExpression get node => null;
+
+  Token get position => enclosingElement.position;
 
   bool get isSynthesized => true;
 
@@ -1704,9 +1717,9 @@
       return functionSignatureCache = new FunctionSignatureX(
           const Link<Element>(), const Link<Element>(), 0, 0, false,
           const <Element>[],
-          new FunctionType(this, getEnclosingClass().thisType));
+          new FunctionType(this, enclosingClass.thisType));
     }
-    if (superMember.isErroneous()) {
+    if (superMember.isErroneous) {
       return functionSignatureCache =
           compiler.objectClass.localLookup('').computeSignature(compiler);
     }
@@ -1717,24 +1730,12 @@
 
   get declaration => this;
   get implementation => this;
-  get defaultImplementation => this;
 
   accept(ElementVisitor visitor) {
     return visitor.visitFunctionElement(this);
   }
 }
 
-class VoidElementX extends ElementX implements VoidElement {
-  VoidElementX(Element enclosing) : super('void', ElementKind.VOID, enclosing);
-  DartType computeType(compiler) => compiler.types.voidType;
-  Node parseNode(_) {
-    throw 'internal error: parseNode on void';
-  }
-  bool impliesType() => true;
-
-  accept(ElementVisitor visitor) => visitor.visitVoidElement(this);
-}
-
 abstract class TypeDeclarationElementX<T extends GenericType>
     implements TypeDeclarationElement {
   /**
@@ -1892,6 +1893,11 @@
 
   Link<DartType> computeTypeParameters(Compiler compiler);
 
+  InterfaceType asInstanceOf(ClassElement cls) {
+    if (cls == this) return thisType;
+    return allSupertypesAndSelf.asInstanceOf(cls);
+  }
+
   /**
    * Return [:true:] if this element is the [:Object:] class for the [compiler].
    */
@@ -1908,7 +1914,7 @@
 
   void addBackendMember(Element member) {
     // TODO(ngeoffray): Deprecate this method.
-    assert(member.isGenerativeConstructorBody());
+    assert(member.isGenerativeConstructorBody);
     backendMembers = backendMembers.prepend(member);
   }
 
@@ -1921,7 +1927,7 @@
    */
   Element lookupLocalMember(String memberName) {
     var result = localLookup(memberName);
-    if (result != null && result.isConstructor()) return null;
+    if (result != null && result.isConstructor) return null;
     return result;
   }
 
@@ -1938,7 +1944,7 @@
    * Lookup super members for the class. This will ignore constructors.
    */
   Element lookupSuperMember(String memberName) {
-    return lookupSuperMemberInLibrary(memberName, getLibrary());
+    return lookupSuperMemberInLibrary(memberName, library);
   }
 
   /**
@@ -1950,11 +1956,11 @@
     bool isPrivate = isPrivateName(memberName);
     for (ClassElement s = superclass; s != null; s = s.superclass) {
       // Private members from a different library are not visible.
-      if (isPrivate && !identical(library, s.getLibrary())) continue;
+      if (isPrivate && !identical(library, s.library)) continue;
       Element e = s.lookupLocalMember(memberName);
       if (e == null) continue;
       // Static members are not inherited.
-      if (e.modifiers.isStatic()) continue;
+      if (e.isStatic) continue;
       return e;
     }
     return null;
@@ -1995,21 +2001,21 @@
       }
       if (member == null) continue;
       // Private members from a different library are not visible.
-      if (isPrivate && !identical(library, member.getLibrary())) continue;
+      if (isPrivate && !identical(library, member.library)) continue;
       // Static members are not inherited.
-      if (member.modifiers.isStatic() && !identical(this, current)) continue;
+      if (member.isStatic && !identical(this, current)) continue;
       // If we find an abstract field we have to make sure that it has
       // the getter or setter part we're actually looking
       // for. Otherwise, we continue up the superclass chain.
-      if (member.isAbstractField()) {
+      if (member.isAbstractField) {
         AbstractFieldElement field = member;
         FunctionElement getter = field.getter;
         FunctionElement setter = field.setter;
-        if (selector.isSetter()) {
+        if (selector.isSetter) {
           // Abstract members can be defined in a super class.
           if (setter != null && !setter.isAbstract) return setter;
         } else {
-          assert(selector.isGetter() || selector.isCall());
+          assert(selector.isGetter || selector.isCall);
           if (getter != null && !getter.isAbstract) return getter;
         }
       // Abstract members can be defined in a super class.
@@ -2039,16 +2045,16 @@
    * This method also works if the [fieldMember] is private.
    */
   bool hasFieldShadowedBy(Element fieldMember) {
-    assert(fieldMember.isField());
+    assert(fieldMember.isField);
     String fieldName = fieldMember.name;
     bool isPrivate = isPrivateName(fieldName);
-    LibraryElement memberLibrary = fieldMember.getLibrary();
+    LibraryElement memberLibrary = fieldMember.library;
     ClassElement lookupClass = this.superclass;
     while (lookupClass != null) {
       Element foundMember = lookupClass.lookupLocalMember(fieldName);
       if (foundMember != null) {
-        if (foundMember.isField()) {
-          if (!isPrivate || memberLibrary == foundMember.getLibrary()) {
+        if (foundMember.isField) {
+          if (!isPrivate || memberLibrary == foundMember.library) {
             // Private fields can only be shadowed by a field declared in the
             // same library.
             return true;
@@ -2064,9 +2070,9 @@
                                            Element result,
                                            Element noMatch(Element)) {
     if (result == null
-        || !result.isConstructor()
+        || !result.isConstructor
         || (isPrivateName(selector.name)
-            && result.getLibrary() != selector.library)) {
+            && result.library != selector.library)) {
       result = noMatch != null ? noMatch(result) : null;
     }
     return result;
@@ -2085,7 +2091,7 @@
     Link<Element> result = const Link<Element>();
     // TODO(johnniwinther): Should we include injected constructors?
     forEachMember((_, Element member) {
-      if (member.isConstructor()) result = result.prepend(member);
+      if (member.isConstructor) result = result.prepend(member);
     });
     return result;
   }
@@ -2151,7 +2157,7 @@
                             {bool includeSuperAndInjectedMembers: false}) {
     // Filters so that [f] is only invoked with instance fields.
     void fieldFilter(ClassElement enclosingClass, Element member) {
-      if (member.isInstanceMember() && member.kind == ElementKind.FIELD) {
+      if (member.isInstanceMember && member.kind == ElementKind.FIELD) {
         f(enclosingClass, member);
       }
     }
@@ -2164,7 +2170,7 @@
   void forEachStaticField(void f(ClassElement enclosingClass, Element field)) {
     // Filters so that [f] is only invoked with static fields.
     void fieldFilter(ClassElement enclosingClass, Element member) {
-      if (!member.isInstanceMember() && member.kind == ElementKind.FIELD) {
+      if (!member.isInstanceMember && member.kind == ElementKind.FIELD) {
         f(enclosingClass, member);
       }
     }
@@ -2203,7 +2209,7 @@
     return false;
   }
 
-  bool isNative() => nativeTagInfo != null;
+  bool get isNative => nativeTagInfo != null;
   void setNative(String name) {
     nativeTagInfo = name;
   }
@@ -2237,7 +2243,7 @@
   }
 
   void addToScope(Element element, DiagnosticListener listener) {
-    if (element.isField() && element.name == name) {
+    if (element.isField && element.name == name) {
       listener.reportError(element, MessageKind.MEMBER_USES_CLASS_NAME);
     }
     localScope.add(element, listener);
@@ -2258,7 +2264,7 @@
   bool get hasConstructor {
     // Search in scope to be sure we search patched constructors.
     for (var element in localScope.values) {
-      if (element.isConstructor()) return true;
+      if (element.isConstructor) return true;
     }
     return false;
   }
@@ -2310,7 +2316,7 @@
   get patch => null;
   get origin => null;
 
-  Token position() => node.getBeginToken();
+  Token get position => node.getBeginToken();
 
   Node parseNode(DiagnosticListener listener) => node;
 
@@ -2329,13 +2335,13 @@
     if (mixin == null) return null;
     Element mixedInElement = mixin.localLookup(name);
     if (mixedInElement == null) return null;
-    return mixedInElement.isInstanceMember() ? mixedInElement : null;
+    return mixedInElement.isInstanceMember ? mixedInElement : null;
   }
 
   void forEachLocalMember(void f(Element member)) {
     constructors.forEach(f);
     if (mixin != null) mixin.forEachLocalMember((Element mixedInElement) {
-      if (mixedInElement.isInstanceMember()) f(mixedInElement);
+      if (mixedInElement.isInstanceMember) f(mixedInElement);
     });
   }
 
@@ -2401,7 +2407,7 @@
   bool get isTarget => isBreakTarget || isContinueTarget;
   Node parseNode(DiagnosticListener l) => label;
 
-  Token position() => label.getBeginToken();
+  Token get position => label.getBeginToken();
   String toString() => "${labelName}:";
 
   accept(ElementVisitor visitor) => visitor.visitLabelElement(this);
@@ -2431,18 +2437,18 @@
 
   bool get isSwitch => statement is SwitchStatement;
 
-  Token position() => statement.getBeginToken();
+  Token get position => statement.getBeginToken();
   String toString() => statement.toString();
 
   accept(ElementVisitor visitor) => visitor.visitTargetElement(this);
 }
 
 class TypeVariableElementX extends ElementX implements TypeVariableElement {
-  final Node cachedNode;
+  final Node node;
   TypeVariableType typeCache;
   DartType boundCache;
 
-  TypeVariableElementX(String name, Element enclosing, this.cachedNode)
+  TypeVariableElementX(String name, Element enclosing, this.node)
     : super(name, ElementKind.TYPE_VARIABLE, enclosing);
 
   TypeVariableType computeType(compiler) => type;
@@ -2459,11 +2465,11 @@
     return boundCache;
   }
 
-  Node parseNode(compiler) => cachedNode;
+  Node parseNode(compiler) => node;
 
   String toString() => "${enclosingElement.toString()}.${name}";
 
-  Token position() => cachedNode.getBeginToken();
+  Token get position => node.getBeginToken();
 
   accept(ElementVisitor visitor) => visitor.visitTypeVariableElement(this);
 }
diff --git a/sdk/lib/_internal/compiler/implementation/elements/visitor.dart b/sdk/lib/_internal/compiler/implementation/elements/visitor.dart
index b234f16..a5bd8bf 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/visitor.dart
@@ -37,7 +37,6 @@
   R visitMixinApplicationElement(MixinApplicationElement e) {
     return visitClassElement(e);
   }
-  R visitVoidElement(VoidElement e) => visitElement(e);
   R visitLabelElement(LabelElement e) => visitElement(e);
   R visitTargetElement(TargetElement e) => visitElement(e);
   R visitTypeVariableElement(TypeVariableElement e) => visitElement(e);
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index c71670c..fabf813 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -22,18 +22,12 @@
       element = element.declaration;
       String name = element.name;
       ScopeContainerElement container = null;
-      if (element.isLibrary()) {
+      if (element.isLibrary) {
         LibraryElement library = element;
-        // Don't include private implementation libraries.  These
-        // libraries contain special classes that cause problems
-        // in other parts of the resolver (in particular Null and Void).
-        // TODO(ahe): Consider lifting this restriction.
-        if (!library.isInternalLibrary) {
-          container = library;
-          // TODO(ahe): Is this right?  Is this necessary?
-          name = library.getLibraryOrScriptName();
-        }
-      } else if (element.isClass()) {
+        container = library;
+        // TODO(ahe): Is this right?  Is this necessary?
+        name = library.getLibraryOrScriptName();
+      } else if (element.isClass) {
         ClassElement cls = element;
         cls.ensureResolved(compiler);
         container = cls;
@@ -124,7 +118,7 @@
           // classes; a native abstract class may have non-abstract subclasses
           // not declared to the program.  Instances of these classes are
           // indistinguishable from the abstract class.
-          || cls.isNative()) {
+          || cls.isNative) {
         universe.instantiatedClasses.add(cls);
       }
       onRegisterInstantiatedClass(cls);
@@ -162,19 +156,19 @@
   void processInstantiatedClassMember(ClassElement cls, Element member) {
     assert(invariant(member, member.isDeclaration));
     if (isProcessed(member)) return;
-    if (!member.isInstanceMember()) return;
+    if (!member.isInstanceMember) return;
 
     String memberName = member.name;
 
     if (member.kind == ElementKind.FIELD) {
-      // The obvious thing to test here would be "member.isNative()",
+      // The obvious thing to test here would be "member.isNative",
       // however, that only works after metadata has been parsed/analyzed,
       // and that may not have happened yet.
       // So instead we use the enclosing class, which we know have had
       // its metadata parsed and analyzed.
       // Note: this assumes that there are no non-native fields on native
       // classes, which may not be the case when a native class is subclassed.
-      if (cls.isNative()) {
+      if (cls.isNative) {
         compiler.world.registerUsedElement(member);
         nativeEnqueuer.handleFieldAnnotations(member);
         if (universe.hasInvokedGetter(member, compiler) ||
@@ -328,27 +322,27 @@
     if (Elements.isUnresolved(element)) {
       // Ignore.
     } else if (element.isSynthesized
-               && element.getLibrary().isPlatformLibrary) {
+               && element.library.isPlatformLibrary) {
       // TODO(ahe): Work-around for http://dartbug.com/11205.
-    } else if (element.isConstructor()) {
-      ClassElement cls = element.declaration.getEnclosingClass();
+    } else if (element.isConstructor) {
+      ClassElement cls = element.declaration.enclosingClass;
       registerInstantiatedType(cls.rawType, elements);
       registerStaticUse(element.declaration);
-    } else if (element.isClass()) {
+    } else if (element.isClass) {
       ClassElement cls = element.declaration;
       registerInstantiatedClass(cls, elements);
       // Make sure that even abstract classes are considered instantiated.
       universe.instantiatedClasses.add(cls);
-    } else if (element.impliesType()) {
+    } else if (element.impliesType) {
       // Don't enqueue typedefs, and type variables.
     } else if (Elements.isStaticOrTopLevel(element)) {
       registerStaticUse(element.declaration);
-    } else if (element.isInstanceMember()) {
+    } else if (element.isInstanceMember) {
       Selector selector = new Selector.fromElement(element, compiler);
       registerSelectorUse(selector);
-      if (element.isField()) {
+      if (element.isField) {
         Selector selector =
-            new Selector.setter(element.name, element.getLibrary());
+            new Selector.setter(element.name, element.library);
         registerInvokedSetter(selector);
       }
     }
@@ -410,11 +404,11 @@
   void handleUnseenSelector(String methodName, Selector selector) {
     processInstanceMembers(methodName, (Element member) {
       if (selector.appliesUnnamed(member, compiler)) {
-        if (member.isFunction() && selector.isGetter()) {
+        if (member.isFunction && selector.isGetter) {
           registerClosurizedMember(member, compiler.globalDependencies);
         }
-        if (member.isField() && member.getEnclosingClass().isNative()) {
-          if (selector.isGetter() || selector.isCall()) {
+        if (member.isField && member.enclosingClass.isNative) {
+          if (selector.isGetter || selector.isCall) {
             nativeEnqueuer.registerFieldLoad(member);
             // We have to also handle storing to the field because we only get
             // one look at each member and there might be a store we have not
@@ -422,7 +416,7 @@
             // TODO(sra): Process fields for storing separately.
             nativeEnqueuer.registerFieldStore(member);
           } else {
-            assert(selector.isSetter());
+            assert(selector.isSetter);
             nativeEnqueuer.registerFieldStore(member);
             // We have to also handle loading from the field because we only get
             // one look at each member and there might be a load we have not
@@ -436,7 +430,7 @@
       }
       return false;
     });
-    if (selector.isGetter()) {
+    if (selector.isGetter) {
       processInstanceFunctions(methodName, (Element member) {
         if (selector.appliesUnnamed(member, compiler)) {
           registerClosurizedMember(member, compiler.globalDependencies);
@@ -472,9 +466,9 @@
   }
 
   void registerSelectorUse(Selector selector) {
-    if (selector.isGetter()) {
+    if (selector.isGetter) {
       registerInvokedGetter(selector);
-    } else if (selector.isSetter()) {
+    } else if (selector.isSetter) {
       registerInvokedSetter(selector);
     } else {
       registerInvocation(selector);
@@ -507,7 +501,7 @@
     // types do not imply type checks, so there should never be a check
     // against the type variable of a typedef.
     assert(type.kind != TypeKind.TYPE_VARIABLE ||
-           !type.element.enclosingElement.isTypedef());
+           !type.element.enclosingElement.isTypedef);
     compiler.backend.registerIsCheck(type, this, elements);
   }
 
@@ -537,7 +531,7 @@
   }
 
   void registerClosurizedMember(Element element, TreeElements elements) {
-    assert(element.isInstanceMember());
+    assert(element.isInstanceMember);
     registerIfGeneric(element, elements);
     registerBoundClosure();
     universe.closurizedMembers.add(element);
@@ -618,14 +612,14 @@
 
   TreeElements getCachedElements(Element element) {
     // TODO(ngeoffray): Get rid of this check.
-    if (element.enclosingElement.isClosure()) {
+    if (element.enclosingElement.isClosure) {
       closureMapping.ClosureClassElement cls = element.enclosingElement;
       element = cls.methodElement;
-    } else if (element.isGenerativeConstructorBody()) {
+    } else if (element.isGenerativeConstructorBody) {
       ConstructorBodyElement body = element;
       element = body.constructor;
     }
-    Element owner = element.getOutermostEnclosingMemberOrTopLevel();
+    Element owner = element.outermostEnclosingMemberOrTopLevel;
     if (owner == null) {
       owner = element;
     }
@@ -648,9 +642,9 @@
     // Enable isolate support if we start using something from the isolate
     // library, or timers for the async library.  We exclude constant fields,
     // which are ending here because their initializing expression is compiled.
-    LibraryElement library = element.getLibrary();
+    LibraryElement library = element.library;
     if (!compiler.hasIsolateSupport() &&
-        (!element.isField() || !element.modifiers.isConst())) {
+        (!element.isField || !element.isConst)) {
       String uri = library.canonicalUri.toString();
       if (uri == 'dart:isolate') {
         enableIsolateSupport(library);
@@ -664,7 +658,7 @@
       }
     }
 
-    if (element.isGetter() && element.name == Compiler.RUNTIME_TYPE) {
+    if (element.isGetter && element.name == Compiler.RUNTIME_TYPE) {
       // Enable runtime type support if we discover a getter called runtimeType.
       // We have to enable runtime type before hitting the codegen, so
       // that constructors know whether they need to generate code for
@@ -759,9 +753,9 @@
 
     // Codegen inlines field initializers. It only needs to generate
     // code for checked setters.
-    if (element.isField() && element.isInstanceMember()) {
+    if (element.isField && element.isInstanceMember) {
       if (!compiler.enableTypeAssertions
-          || element.enclosingElement.isClosure()) {
+          || element.enclosingElement.isClosure) {
         return;
       }
     }
diff --git a/sdk/lib/_internal/compiler/implementation/helpers/helpers.dart b/sdk/lib/_internal/compiler/implementation/helpers/helpers.dart
index a126630..f6b7a5d 100644
--- a/sdk/lib/_internal/compiler/implementation/helpers/helpers.dart
+++ b/sdk/lib/_internal/compiler/implementation/helpers/helpers.dart
@@ -8,6 +8,7 @@
 library dart2js.helpers;
 
 import "dart:collection";
+import 'dart:convert';
 import '../dart2jslib.dart';
 import '../util/util.dart';
 
@@ -15,9 +16,41 @@
 part 'trace.dart';
 part 'expensive_map.dart';
 part 'expensive_set.dart';
+part 'stats.dart';
 
-/// Print [s].
-debugPrint(s) => print(s);
+/// Global flag to enable [debugPrint]. This should always be `true` by default
+/// and be set to `false` as a means to temporarily turn off all debugging
+/// printouts.
+const bool DEBUG_PRINT_ENABLED = true;
+
+/// Current indentation used by [debugPrint].
+String _debugPrint_indentation = '';
+
+/// The current indentation level of [debugPrint].
+int get debugPrintIndentationLevel => _debugPrint_indentation.length;
+
+/// If [DEBUG_PRINT_ENABLED] is `true` print [s] using the current identation
+/// defined by [debugWrapPrint].
+debugPrint(s) {
+  if (DEBUG_PRINT_ENABLED) print('$_debugPrint_indentation$s');
+}
+
+/// Wraps the call to [f] with a print of 'start:$s' and 'end:$s' incrementing
+/// the current indentation used by [debugPrint] during the execution of [f].
+///
+/// Use this to get a tree-like debug printout for nested calls.
+debugWrapPrint(s, f()) {
+  String previousIndentation = _debugPrint_indentation;
+  debugPrint('start:$s');
+  _debugPrint_indentation += ' ';
+  var result = f();
+  _debugPrint_indentation = previousIndentation;
+  debugPrint('end:$s');
+  return result;
+}
+
+/// Dummy method to mark breakpoints.
+debugBreak() {}
 
 /// Print a message with a source location.
 reportHere(Compiler compiler, Spannable node, String debugMessage) {
diff --git a/sdk/lib/_internal/compiler/implementation/helpers/stats.dart b/sdk/lib/_internal/compiler/implementation/helpers/stats.dart
new file mode 100644
index 0000000..7591a5d
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/helpers/stats.dart
@@ -0,0 +1,575 @@
+// 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 dart2js.helpers;
+
+// Helper methods for statistics.
+
+/// Current stats collector. Use [ActiveStats] for active collection of data.
+final Stats stats = new ActiveStats(new ConsolePrinter());
+
+/// Interface for gathering and display of statistical information.
+/// This class serves as the noop collector.
+class Stats {
+  const Stats();
+
+  /// Registers [key], [value] pair in the map [id]. If [fromExisting] is
+  /// non-null and [key] already exists, the value associated with [key] will
+  /// be the return value of [fromExisting] when called with the existing value.
+  ///
+  /// The recorded information is not dumped automatically.
+  void recordMap(id, key, value, {fromExisting(value)}) {}
+
+  /// Returns the map [id] recorded with [recordMap].
+  Map getMap(id) => const {};
+
+  /// Registers [element] as an element of the list [id]. If provided, [data]
+  /// provides additional data for [element].
+  ///
+  /// The recorded information is dumped automatically on call to [dumpStats].
+  ///
+  /// Example:
+  ///   Calling [recordElement] like this:
+  ///     recordElement('foo', 'a', data: 'first-a-data');
+  ///     recordElement('foo', 'a', data: 'second-a-data');
+  ///     recordElement('foo', 'b');
+  ///     recordElement('bar', 'a', data: 'third-a-data');
+  ///     recordElement('bar', 'c');
+  ///   will result in a dump like this:
+  ///     foo: 2
+  ///      value=a data=second-a-data
+  ///      b
+  ///     bar: 2
+  ///      value=a data=third-a-data
+  ///      c
+  ///
+  void recordElement(id, element, {data}) {}
+
+  /// Returns the list [id] recorded with [recordElement].
+  Iterable getList(String id) => const [];
+
+  /// Registers [value] as an occurrence of [id]. If passed, [example] provides
+  /// an example data of the occurrence of [value].
+  ///
+  /// The recorded information is dumped automatically on call to [dumpStats].
+  ///
+  /// Example:
+  ///   Calling [recordFrequency] like this:
+  ///     recordFrequency('foo', 'a', 'first-a-data');
+  ///     recordFrequency('foo', 'a', 'second-a-data');
+  ///     recordFrequency('bar', 'b', 'first-b-data');
+  ///     recordFrequency('foo', 'c');
+  ///     recordFrequency('bar', 'b');
+  ///   will result in a dump like this:
+  ///     foo:
+  ///      a: 2
+  ///       first-a-data
+  ///       second-a-data
+  ///      c: 1
+  ///     bar:
+  ///      b: 2
+  ///       first-b-data
+  ///
+  void recordFrequency(id, value, [example]) {}
+
+  /// For each key/value pair in [map] the elements in the value are registered
+  /// as examples of occurrences of the key in [id].
+  void recordFrequencies(id, Map<dynamic, Iterable> map) {}
+
+  /// Returns the examples given for the occurrence of [value] for [id].
+  Iterable recordedFrequencies(id, value) => const [];
+
+  /// Increases the counter [id] by 1. If provided, [example] is used as an
+  /// example of the count and [data] provides additional information for
+  /// [example].
+  ///
+  /// The recorded information is dumped automatically on call to [dumpStats].
+  ///
+  /// Example:
+  ///   Calling [recordCounter] like this:
+  ///     recordCounter('foo', 'a');
+  ///     recordCounter('foo', 'a');
+  ///     recordCounter('foo', 'b');
+  ///     recordCounter('bar', 'c', 'first-c-data');
+  ///     recordCounter('bar', 'c', 'second-c-data');
+  ///     recordCounter('bar', 'd');
+  ///     recordCounter('bar', 'd');
+  ///     recordCounter('baz');
+  ///     recordCounter('baz');
+  ///   will result in a dump like this:
+  ///     foo: 3
+  ///      count=2 example=a
+  ///      count=1 example=b
+  ///     bar: 4
+  ///      count=2 examples=2
+  ///       c:
+  ///        first-c-data
+  ///        second-c-data
+  ///       d
+  ///     baz: 2
+  ///
+  void recordCounter(id, [example, data]) {}
+
+  /// Dumps the stats for the recorded frequencies, sets, and counters. If
+  /// provided [beforeClose] is called before closing the dump output. This
+  /// can be used to include correlations on the collected data through
+  /// [dumpCorrelation].
+  void dumpStats({void beforeClose()}) {}
+
+  /// Prints the correlation between the elements of [a] and [b].
+  ///
+  /// Three sets are output using [idA] and [idB] as labels for the elements
+  /// [a] and [b]:
+  ///
+  ///   'idA && idB' lists the elements both in [a] and [b],
+  ///   '!idA && idB' lists the elements not in [a] but in [b], and
+  ///   'idA && !idB' lists the elements in [a] but not in [b].
+  ///
+  /// If [dataA] and/or [dataB] are provided, additional information on the
+  /// elements are looked up in [dataA] or [dataB] using [dataA] as the primary
+  /// source.
+  void dumpCorrelation(idA, Iterable a, idB, Iterable b,
+                       {Map dataA, Map dataB}) {}
+}
+
+/// Interface for printing output data.
+///
+/// This class serves as the disabled output.
+class StatsOutput {
+  const StatsOutput();
+
+  /// Print [text] as on a separate line.
+  void println(String text) {}
+}
+
+/// Output to the [debugPrint] method.
+class DebugOutput implements StatsOutput {
+  const DebugOutput();
+
+  void println(String text) => debugPrint(text);
+}
+
+/// Interface for printing stats collected in [Stats].
+abstract class StatsPrinter {
+  /// The number of examples printer. If `null` all examples are printed.
+  int get examples => 0;
+
+  /// Start a group [id].
+  void start(String id) {}
+
+  /// Create a group [id] with content created by [createGroupContent].
+  void group(String id, void createGroupContent()) {
+    start(id);
+    createGroupContent();
+    end(id);
+  }
+
+  /// End a group [id].
+  void end(String id) {}
+
+  /// Start a stat entry for [id] with additional [data].
+  void open(String id,
+            [Map<String, dynamic> data = const <String, dynamic>{}]) {}
+
+  /// Create a stat entry for [id] with additional [data] and content created by
+  /// [createChildContent].
+  void child(String id,
+             [Map<String, dynamic> data = const <String, dynamic>{},
+              void createChildContent()]) {
+    open(id, data);
+    if (createChildContent != null) createChildContent();
+    close(id);
+  }
+
+  /// End a stat entry for [id].
+  void close(String id) {}
+
+  /// Starts a group of additional information.
+  void beginExtra() {}
+
+  /// Starts a group of additional information.
+  void endExtra() {}
+}
+
+/// Abstract base class for [ConsolePrinter] and [XMLPrinter].
+abstract class BasePrinter extends StatsPrinter {
+  final int examples;
+  final StatsOutput output;
+  int indentationLevel = 0;
+
+  BasePrinter({this.output: const DebugOutput(),
+               this.examples: 10});
+
+  String get indentation {
+    StringBuffer sb = new StringBuffer();
+    for (int i = 0 ; i < indentationLevel ; i++) {
+      sb.write(' ');
+    }
+    return sb.toString();
+  }
+}
+
+/// [StatsPrinter] that displays stats in console lines.
+class ConsolePrinter extends BasePrinter {
+  int extraLevel = 0;
+
+  ConsolePrinter({StatsOutput output: const DebugOutput(),
+                  int examples: 10})
+      : super(output: output, examples: examples);
+
+  void open(String id,
+            [Map<String, dynamic> data = const <String, dynamic>{}]) {
+    if (extraLevel > 0) return;
+
+    StringBuffer sb = new StringBuffer();
+    sb.write(indentation);
+    String space = '';
+    if (data['title'] != null) {
+      sb.write('${data['title']}:');
+      space = ' ';
+      data.remove('title');
+    } else if (data['name'] != null) {
+      sb.write('${data['name']}');
+      space = ' ';
+      data.remove('name');
+    }
+    Iterable nonNullValues = data.values.where((v) => v != null);
+    if (nonNullValues.length == 1) {
+      sb.write('$space${nonNullValues.first}');
+    } else {
+      data.forEach((key, value) {
+        sb.write('$space$key=$value');
+        space = ' ';
+      });
+    }
+    output.println(sb.toString());
+    indentationLevel++;
+  }
+
+  void close(String id) {
+    if (extraLevel > 0) return;
+
+    indentationLevel--;
+  }
+
+  void beginExtra() {
+    if (extraLevel == 0) output.println('$indentation...');
+    extraLevel++;
+  }
+
+  void endExtra() {
+    extraLevel--;
+  }
+}
+
+/// [StatsPrinter] that displays stats in XML format.
+class XMLPrinter extends BasePrinter {
+  static const HtmlEscape escape = const HtmlEscape();
+  bool opened = false;
+
+  XMLPrinter({output: const DebugOutput(),
+              int examples: 10})
+      : super(output: output, examples: examples);
+
+  void start(String id) {
+    if (!opened) {
+      output.println('<?xml version="1.0" encoding="UTF-8"?>');
+      opened = true;
+    }
+    open(id);
+  }
+
+  void end(String id) {
+    close(id);
+  }
+
+  void open(String id,
+            [Map<String, dynamic> data = const <String, dynamic>{}]) {
+    StringBuffer sb = new StringBuffer();
+    for (int i = 0 ; i < indentationLevel ; i++) {
+      sb.write(' ');
+    }
+    sb.write('<$id');
+    data.forEach((key, value) {
+      if (value != null) {
+        sb.write(' $key="${escape.convert('$value')}"');
+      }
+    });
+    sb.write('>');
+    output.println(sb.toString());
+    indentationLevel++;
+  }
+
+  void close(String id) {
+    indentationLevel--;
+    output.println('${indentation}</$id>');
+  }
+
+  void beginExtra() {
+    open('extra');
+  }
+
+  void endExtra() {
+    close('extra');
+  }
+}
+
+/// Actual implementation of [Stats].
+class ActiveStats implements Stats {
+  final StatsPrinter printer;
+  Map<dynamic, Map> maps = {};
+  Map<dynamic, Map<dynamic, List>> frequencyMaps = {};
+  Map<dynamic, Map> setsMap = {};
+  Map<dynamic, Map<dynamic, List>> countersMap =
+      <dynamic, Map<dynamic, List>>{};
+
+  ActiveStats(StatsPrinter this.printer);
+
+  void recordMap(id, key, value, {fromExisting(value)}) {
+    Map map = maps.putIfAbsent(id, () => {});
+    if (fromExisting != null && map.containsKey(key)) {
+      map[key] = fromExisting(map[key]);
+    } else {
+      map[key] = value;
+    }
+  }
+
+  Map getMap(key) {
+    return maps[key];
+  }
+
+  void recordFrequency(id, value, [example]) {
+    Map<int, List> map = frequencyMaps.putIfAbsent(id, () => {});
+    map.putIfAbsent(value, () => []);
+    map[value].add(example);
+  }
+
+  void recordFrequencies(id, Map<dynamic, Iterable> frequencyMap) {
+    Map<int, List> map = frequencyMaps.putIfAbsent(id, () => {});
+    frequencyMap.forEach((value, examples) {
+      map.putIfAbsent(value, () => []);
+      map[value].addAll(examples);
+    });
+  }
+
+  Iterable recordedFrequencies(id, value) {
+    Map<dynamic, List> map = frequencyMaps[id];
+    if (map == null) return const [];
+    List list = map[value];
+    if (list == null) return const [];
+    return list;
+  }
+
+  void recordCounter(id, [reason, example]) {
+    Map<dynamic, List> map = countersMap.putIfAbsent(id, () => {});
+    map.putIfAbsent(reason, () => []).add(example);
+  }
+
+  void recordElement(key, element, {data}) {
+    setsMap.putIfAbsent(key, () => new Map())[element] = data;
+  }
+
+  Iterable getList(String key) {
+    Map map = setsMap[key];
+    if (map == null) return const [];
+    return map.keys;
+  }
+
+  void dumpStats({void beforeClose()}) {
+    printer.start('stats');
+    dumpFrequencies();
+    dumpSets();
+    dumpCounters();
+    if (beforeClose != null) {
+      beforeClose();
+    }
+    printer.end('stats');
+  }
+
+  void dumpSets() {
+    printer.group('sets', () {
+      setsMap.forEach((k, set) {
+        dumpIterable('examples', '$k', set.keys,
+            limit: printer.examples, dataMap: set);
+      });
+    });
+
+  }
+
+  void dumpFrequencies() {
+    printer.group('frequencies', () {
+      frequencyMaps.forEach((key, Map<dynamic, List> map) {
+        printer.child('frequency', {'title': '$key'}, () {
+          dumpFrequency(map);
+        });
+      });
+    });
+  }
+
+  void dumpFrequency(Map<dynamic, Iterable> map) {
+    Map sortedMap = trySortMap(map);
+    sortedMap.forEach((k, list) {
+      dumpIterable('examples', '$k', list, limit: printer.examples);
+    });
+  }
+
+  void dumpCounters() {
+    printer.group('counters', () {
+      countersMap.keys.forEach(dumpCounter);
+    });
+  }
+
+  void dumpCounter(id) {
+    Map<dynamic, List> map = countersMap[id];
+    bool hasData(example) {
+      if (map == null) return false;
+      List list = map[example];
+      if (list == null) return false;
+      return list.any((data) => data != null);
+    }
+
+    int count = 0;
+    Map<dynamic, int> frequencyMap = {};
+    map.forEach((var category, List examples) {
+      if (category != null) {
+        frequencyMap.putIfAbsent(category, () => 0);
+        frequencyMap[category] += examples.length;
+      }
+      count += examples.length;
+    });
+    Map<int, Set> result = sortMap(inverseMap(frequencyMap), (a, b) => b - a);
+    int examplesLimit = null;
+    if (printer.examples != null && result.length >= printer.examples) {
+      examplesLimit = 0;
+    }
+    int counter = 0;
+    bool hasMore = false;
+    printer.open('counter', {'title': '$id', 'count': count});
+    result.forEach((int count, Set examples) {
+      if (counter == printer.examples) {
+        printer.beginExtra();
+        hasMore = true;
+      }
+      if (examples.length == 1 &&
+          (examplesLimit == 0 || !hasData(examples.first))) {
+        printer.child('examples', {'count': count, 'example': examples.first});
+      } else {
+        printer.child('examples',
+            {'count': count, 'examples': examples.length},
+            () {
+          examples.forEach((example) {
+            dumpIterable(
+                'examples', '$example', map[example],
+                limit: examplesLimit,
+                includeCount: false);
+          });
+        });
+      }
+      counter++;
+    });
+    if (hasMore) {
+      printer.endExtra();
+    }
+    printer.close('counter');
+  }
+
+  void dumpCorrelation(keyA, Iterable a, keyB, Iterable b,
+                       {Map dataA, Map dataB}) {
+    printer.child('correlations', {'title': '$keyA vs $keyB'}, () {
+      List aAndB = a.where((e) => e != null && b.contains(e)).toList();
+      List aAndNotB = a.where((e) => e != null && !b.contains(e)).toList();
+      List notAandB = b.where((e) => e != null && !a.contains(e)).toList();
+      dumpIterable('correlation', '$keyA && $keyB', aAndB, dataMap: dataA,
+          limit: printer.examples);
+      dumpIterable('correlation', '$keyA && !$keyB', aAndNotB, dataMap: dataA,
+          limit: printer.examples);
+      dumpIterable('correlation', '!$keyA && $keyB', notAandB, dataMap: dataB,
+          limit: printer.examples);
+    });
+  }
+
+  void dumpIterable(String tag, String title, Iterable iterable,
+                    {int limit, Map dataMap, bool includeCount: true}) {
+    if (limit == 0) return;
+
+    Map childData = {};
+    Iterable nonNullIterable = iterable.where((e) => e != null);
+    if (nonNullIterable.isEmpty && !includeCount) {
+      childData['name'] = title;
+    } else {
+      childData['title'] = title;
+    }
+    if (includeCount) {
+      childData['count'] = iterable.length;
+    }
+    printer.child(tag, childData, () {
+      bool hasMore = false;
+      int counter = 0;
+      nonNullIterable.forEach((element) {
+        if (counter == limit) {
+          printer.beginExtra();
+          hasMore = true;
+        }
+        var data = dataMap != null ? dataMap[element] : null;
+        if (data != null) {
+          printer.child('example', {'value': element, 'data': data});
+        } else {
+          printer.child('example', {'value': element});
+        }
+        counter++;
+      });
+      if (hasMore) {
+        printer.endExtra();
+      }
+    });
+  }
+}
+
+/// Returns a map that is an inversion of [map], where the keys are the values
+/// of [map] and the values are the set of keys in [map] that share values.
+///
+/// If [equals] and [hashCode] are provided, these are used to determine
+/// equality among the values of [map].
+///
+/// If [isValidKey] is provided, this is used to determine with a value of [map]
+/// is a potential key of the inversion map.
+Map<dynamic, Set> inverseMap(Map map,
+                             {bool equals(key1, key2),
+                              int hashCode(key),
+                              bool isValidKey(potentialKey)}) {
+  Map<dynamic, Set> result = new LinkedHashMap<dynamic, Set>(
+      equals: equals, hashCode: hashCode, isValidKey: isValidKey);
+  map.forEach((k, v) {
+    if (isValidKey == null || isValidKey(v)) {
+      result.putIfAbsent(v, () => new Set()).add(k);
+    }
+  });
+  return result;
+}
+
+/// Return a new map heuristically sorted by the keys of [map]. If the first
+/// key of [map] is [Comparable], the keys are sorted using [sortMap] under
+/// the assumption that all keys are [Comparable].
+/// Otherwise, the keys are sorted as string using their `toString`
+/// representation.
+Map trySortMap(Map map) {
+  Iterable iterable = map.keys.where((k) => k != null);
+  if (iterable.isEmpty) return map;
+  var key = iterable.first;
+  if (key is Comparable) {
+    return sortMap(map);
+  }
+  return sortMap(map, (a, b) => '$a'.compareTo('$b'));
+}
+
+/// Returns a new map in which the keys of [map] are sorted using [compare].
+/// If [compare] is null, the keys must be [Comparable].
+Map sortMap(Map map, [int compare(a,b)]) {
+  List keys = map.keys.toList();
+  keys.sort(compare);
+  Map sortedMap = new Map();
+  keys.forEach((k) => sortedMap[k] = map[k]);
+  return sortedMap;
+}
+
diff --git a/sdk/lib/_internal/compiler/implementation/helpers/trace.dart b/sdk/lib/_internal/compiler/implementation/helpers/trace.dart
index 8fcb63b..42c122a 100644
--- a/sdk/lib/_internal/compiler/implementation/helpers/trace.dart
+++ b/sdk/lib/_internal/compiler/implementation/helpers/trace.dart
@@ -14,12 +14,12 @@
  * printed stack traces based on their content. For instance only print stack
  * traces that contain specific paths.
  */
-void trace(String message, [bool condition(String stackTrace)]) {
+void trace(String message, {bool condition(String stackTrace), int limit}) {
   try {
     throw '';
   } catch (e, s) {
     String stackTrace = prettifyStackTrace(
-        s, rangeStart: 1, filePrefix: stackTraceFilePrefix);
+        s, rangeStart: 1, rangeEnd: limit, filePrefix: stackTraceFilePrefix);
     if (condition != null) {
       if (!condition(stackTrace)) return;
     }
@@ -27,10 +27,10 @@
   }
 }
 
-void traceAndReport(Compiler compiler, Spannable node,
-                    String message, [bool condition(String stackTrace)]) {
+void traceAndReport(Compiler compiler, Spannable node, String message,
+                    {bool condition(String stackTrace), int limit}) {
 
-  trace(message, (String stackTrace) {
+  trace(message, condition: (String stackTrace) {
     bool result = condition != null ? condition(stackTrace) : true;
     if (result) {
       reportHere(compiler, node, message);
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart
index 8ec3700..9293b43 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart
@@ -67,9 +67,9 @@
         bailout('Used in JS ${info.call}');
       }
     }
-    if (called.isGetter()
+    if (called.isGetter
         && info.selector != null
-        && info.selector.isCall()
+        && info.selector.isCall
         && inferrer.types.getInferredTypeOf(called) == currentUser) {
       // This node can be a closure call as well. For example, `foo()`
       // where `foo` is a getter.
@@ -92,9 +92,9 @@
 
   visitDynamicCallSiteTypeInformation(DynamicCallSiteTypeInformation info) {
     super.visitDynamicCallSiteTypeInformation(info);
-    if (info.selector.isCall()) {
+    if (info.selector.isCall) {
       if (info.arguments.contains(currentUser)) {
-        if (!info.targets.every((element) => element.isFunction())) {
+        if (!info.targets.every((element) => element.isFunction)) {
           bailout('Passed to a closure');
         }
         if (info.targets.any(checkIfFunctionApply)) {
@@ -103,7 +103,7 @@
       } else if (info.targets.any((element) => checkIfCurrentUser(element))) {
         analyzeCall(info);
       }
-    } else if (info.selector.isGetter() &&
+    } else if (info.selector.isGetter &&
         info.selector.name == Compiler.CALL_OPERATOR_NAME) {
       // We are potentially tearing off ourself here
       addNewEscapeInformation(info);
@@ -119,7 +119,7 @@
     super.visitStaticCallSiteTypeInformation(info);
     if (info.calledElement == tracedElements.first
         && info.selector != null
-        && info.selector.isGetter()) {
+        && info.selector.isGetter) {
       addNewEscapeInformation(info);
     }
   }
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 e926165..358d74e 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
@@ -1194,7 +1194,7 @@
         compiler.listClass.lookupConstructor(
             new Selector.callConstructor(
                 '',
-                compiler.listClass.getLibrary())).implementation;
+                compiler.listClass.library)).implementation;
     emptyConcreteType = new ConcreteType.empty(compiler.maxConcreteTypeSize,
                                                baseTypes);
     nullConcreteType = singletonConcreteType(const NullBaseType());
@@ -1288,7 +1288,7 @@
     result = (result == null) ? emptyConcreteType : result;
     if (selector != null) {
       Element enclosing = field.enclosingElement;
-      if (enclosing.isClass()) {
+      if (enclosing.isClass) {
         ClassElement cls = enclosing;
         TypeMask receiverMask = new TypeMask.exact(cls.declaration);
         TypeMask resultMask = types.concreteTypeToTypeMask(result);
@@ -1413,7 +1413,7 @@
    * Add all templates of [methodOrField] to the workqueue.
    */
   void invalidate(Element methodOrField) {
-    if (methodOrField.isField()) {
+    if (methodOrField.isField) {
       workQueue.add(new InferenceWorkItem(
           methodOrField, new ConcreteTypesEnvironment()));
     } else {
@@ -1826,7 +1826,7 @@
         new InferenceWorkItem(element, new ConcreteTypesEnvironment()));
     while (!workQueue.isEmpty) {
       currentWorkItem = workQueue.remove();
-      if (currentWorkItem.method.isField()) {
+      if (currentWorkItem.method.isField) {
         analyzeFieldInitialization(currentWorkItem.method);
       } else {
         Map<ConcreteTypesEnvironment, ConcreteType> template =
@@ -1974,7 +1974,7 @@
   Element getRealCaller(Element allegedCaller) {
     Element currentMethod = currentWorkItem.method;
     if ((currentMethod != allegedCaller)
-        && currentMethod.isFunction()
+        && currentMethod.isFunction
         && closures.contains(currentMethod)) {
       return currentMethod;
     } else {
@@ -1996,7 +1996,7 @@
       if (selector != null && selector.name == 'JS') {
         return null;
       }
-      if (callee.isField()) {  // toplevel closure call
+      if (callee.isField) {  // toplevel closure call
         getFieldType(selector, callee);  // trigger toplevel field analysis
         addFieldReader(callee, caller);
         ConcreteType result = emptyConcreteType;
@@ -2009,8 +2009,8 @@
       } else {  // method or constructor call
         addCaller(callee, caller);
         ClassElement receiverClass = null;
-        if (callee.isGenerativeConstructor()) {
-          receiverClass = callee.getEnclosingClass();
+        if (callee.isGenerativeConstructor) {
+          receiverClass = callee.enclosingClass;
         } else if (node is Send) {
           Send send = node;
           if (send.receiver != null) {
@@ -2025,24 +2025,24 @@
         return getSendReturnType(selector, callee, receiverClass, arguments);
       }
     } else if (selector.kind == SelectorKind.GETTER) {
-      if (callee.isField()) {
+      if (callee.isField) {
         addFieldReader(callee, caller);
         return getFieldType(selector, callee);
-      } else if (callee.isGetter()) {
-        Element enclosing = callee.enclosingElement.isCompilationUnit()
+      } else if (callee.isGetter) {
+        Element enclosing = callee.enclosingElement.isCompilationUnit
             ? null : callee.enclosingElement;
         addCaller(callee, caller);
         ArgumentsTypes noArguments = new ArgumentsTypes([], new Map());
         return getSendReturnType(selector, callee, enclosing, noArguments);
-      } else if (callee.isFunction()) {
+      } else if (callee.isFunction) {
         addClosure(callee, null, null);
         return singletonConcreteType(baseTypes.functionBaseType);
       }
     } else if (selector.kind == SelectorKind.SETTER) {
       ConcreteType argumentType = arguments.positional.first;
-      if (callee.isField()) {
+      if (callee.isField) {
         augmentFieldType(callee, argumentType);
-      } else if (callee.isSetter()) {
+      } else if (callee.isSetter) {
         FunctionElement setter = callee;
         // TODO(polux): A setter always returns void so there's no need to
         // invalidate its callers even if it is called with new arguments.
@@ -2050,7 +2050,7 @@
         // exceptions for instance, we need to do it by uncommenting the
         // following line.
         // inferrer.addCaller(setter, currentMethod);
-        Element enclosing = callee.enclosingElement.isCompilationUnit()
+        Element enclosing = callee.enclosingElement.isCompilationUnit
             ? null : callee.enclosingElement;
         return getSendReturnType(selector, setter, enclosing,
             new ArgumentsTypes([argumentType], new Map()));
@@ -2088,15 +2088,15 @@
     ConcreteType result = emptyConcreteType;
 
     void augmentResult(ClassElement baseReceiverType, Element member) {
-      if (member.isField()) {
+      if (member.isField) {
         addFieldReader(member, caller);
         result = result.union(getFieldType(selector, member));
-      } else if (member.isGetter()) {
+      } else if (member.isGetter) {
         addCaller(member, caller);
         ArgumentsTypes noArguments = new ArgumentsTypes([], new Map());
         result = result.union(
             getSendReturnType(selector, member, baseReceiverType, noArguments));
-      } else if (member.isFunction()) {
+      } else if (member.isFunction) {
         addClosure(member, receiverType, null);
         result = result.union(
             singletonConcreteType(baseTypes.functionBaseType));
@@ -2109,7 +2109,7 @@
       addDynamicCaller(selector, caller);
       Set<Element> members = getMembersBySelector(selector);
       for (Element member in members) {
-        if (!(member.isField() || member.isGetter())) continue;
+        if (!(member.isField || member.isGetter)) continue;
         for (ClassElement cls in
             getReflexiveSubtypesOf(member.enclosingElement)) {
           augmentResult(cls, member);
@@ -2139,9 +2139,9 @@
     ConcreteType argumentType = arguments.positional.first;
 
     void augmentField(ClassElement receiverType, Element setterOrField) {
-      if (setterOrField.isField()) {
+      if (setterOrField.isField) {
         augmentFieldType(setterOrField, argumentType);
-      } else if (setterOrField.isSetter()) {
+      } else if (setterOrField.isSetter) {
         // A setter always returns void so there's no need to invalidate its
         // callers even if it is called with new arguments. However, if we
         // start to record more than returned types, like exceptions for
@@ -2158,8 +2158,8 @@
       // Same remark as above
       // addDynamicCaller(selector, caller);
       for (Element member in getMembersBySelector(selector)) {
-        if (!(member.isField() || member.isSetter())) continue;
-        Element cls = member.getEnclosingClass();
+        if (!(member.isField || member.isSetter)) continue;
+        Element cls = member.enclosingClass;
         augmentField(cls, member);
       }
     } else {
@@ -2187,7 +2187,7 @@
       addDynamicCaller(selector, caller);
       Set<Element> elements = getMembersBySelector(selector);
       for (Element element in elements) {
-        if (element.isFunction()) {
+        if (element.isFunction) {
           FunctionElement method = element;
           addCaller(method, caller);
           for (ClassElement cls in
@@ -2196,7 +2196,7 @@
                 getSendReturnType(selector, method, cls, arguments));
           }
         } else { // closure call
-          assert(element.isField());
+          assert(element.isField);
           for (FunctionElement function in closures.functionElements) {
             addCaller(function, caller);
             result = result.union(
@@ -2211,7 +2211,7 @@
           ClassElement cls = classBaseReceiverType.element;
           Element method = cls.lookupSelector(selector, compiler);
           if (method != null) {
-            if (method.isFunction()) {
+            if (method.isFunction) {
               assert(method is FunctionElement);
               method = method.implementation;
               addCaller(method, caller);
@@ -2266,9 +2266,9 @@
       final result = currentWorkItem.environment.lookupType(element);
       if (result != null) return result;
     }
-    if (element.isParameter() || element.isFieldParameter()) {
+    if (element.isParameter || element.isFieldParameter) {
       return inferredParameterTypes[element];
-    } else if (element.isField()) {
+    } else if (element.isField) {
       return inferredFieldTypes[element];
     }
     throw new ArgumentError("unexpected element type");
@@ -2331,7 +2331,7 @@
     elementType = elementType == null
         ? types.nonNullEmpty()
         : types.simplifyPhi(null, null, elementType);
-    ConcreteType containerType = node.isConst()
+    ConcreteType containerType = node.isConst
         ? types.constListType
         : types.growableListType;
     return types.allocateList(
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
index cf49e90..bbd3ed92 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
@@ -595,7 +595,7 @@
 
 abstract class InferrerVisitor
     <T, E extends MinimalInferrerEngine<T>> extends ResolvedVisitor<T> {
-  final Element analyzedElement;
+  final AstElement analyzedElement;
   final TypeSystem<T> types;
   final E inferrer;
   final Map<TargetElement, List<LocalsHandler<T>>> breaksFor =
@@ -612,17 +612,17 @@
 
   bool get inLoop => loopLevel > 0;
   bool get isThisExposed {
-    return analyzedElement.isGenerativeConstructor()
+    return analyzedElement.isGenerativeConstructor
         ? locals.fieldScope.isThisExposed
         : true;
   }
   void set isThisExposed(value) {
-    if (analyzedElement.isGenerativeConstructor()) {
+    if (analyzedElement.isGenerativeConstructor) {
       locals.fieldScope.isThisExposed = value;
     }
   }
 
-  InferrerVisitor(Element analyzedElement,
+  InferrerVisitor(AstElement analyzedElement,
                   this.inferrer,
                   this.types,
                   Compiler compiler,
@@ -632,9 +632,9 @@
       super(compiler.enqueuer.resolution.getCachedElements(analyzedElement),
             compiler) {
     if (handler != null) return;
-    Node node = analyzedElement.parseNode(compiler);
+    Node node = analyzedElement.node;
     FieldInitializationScope<T> fieldScope =
-        analyzedElement.isGenerativeConstructor()
+        analyzedElement.isGenerativeConstructor
             ? new FieldInitializationScope<T>(types)
             : null;
     locals = new LocalsHandler<T>(inferrer, types, compiler, node, fieldScope);
@@ -718,12 +718,12 @@
 
   T visitLiteralList(LiteralList node) {
     node.visitChildren(this);
-    return node.isConst() ? types.constListType : types.growableListType;
+    return node.isConst ? types.constListType : types.growableListType;
   }
 
   T visitLiteralMap(LiteralMap node) {
     node.visitChildren(this);
-    return node.isConst() ? types.constMapType : types.mapType;
+    return node.isConst ? types.constMapType : types.mapType;
   }
 
   T visitLiteralNull(LiteralNull node) {
@@ -744,14 +744,13 @@
   bool isThisOrSuper(Node node) => node.isThis() || node.isSuper();
 
   Element get outermostElement {
-    return
-        analyzedElement.getOutermostEnclosingMemberOrTopLevel().implementation;
+    return analyzedElement.outermostEnclosingMemberOrTopLevel.implementation;
   }
 
   T _thisType;
   T get thisType {
     if (_thisType != null) return _thisType;
-    ClassElement cls = outermostElement.getEnclosingClass();
+    ClassElement cls = outermostElement.enclosingClass;
     if (compiler.world.isUsedAsMixin(cls)) {
       return _thisType = types.nonNullSubtype(cls);
     } else if (compiler.world.hasAnySubclass(cls)) {
@@ -765,7 +764,7 @@
   T get superType {
     if (_superType != null) return _superType;
     return _superType = types.nonNullExact(
-        outermostElement.getEnclosingClass().superclass);
+        outermostElement.enclosingClass.superclass);
   }
 
   T visitIdentifier(Identifier node) {
@@ -1081,7 +1080,9 @@
     Node exception = node.exception;
     if (exception != null) {
       DartType type = elements.getType(node.type);
-      T mask = type == null || type.treatAsDynamic
+      T mask = type == null ||
+               type.treatAsDynamic ||
+               type.kind == TypeKind.TYPE_VARIABLE
           ? types.dynamicType
           : types.nonNullSubtype(type.element);
       locals.update(elements[exception], mask, node);
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/list_tracer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/list_tracer.dart
index fcb3ae1..907be9e 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/list_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/list_tracer.dart
@@ -172,7 +172,7 @@
     String selectorName = selector.name;
     if (currentUser == info.receiver) {
       if (!okListSelectorsSet.contains(selectorName)) {
-        if (selector.isCall()) {
+        if (selector.isCall) {
           int positionalLength = info.arguments.positional.length;
           if (selectorName == 'add') {
             if (positionalLength == 1) {
@@ -186,9 +186,9 @@
             bailout('Used in a not-ok selector');
             return;
           }
-        } else if (selector.isIndexSet()) {
+        } else if (selector.isIndexSet) {
           assignments.add(info.arguments.positional[1]);
-        } else if (!selector.isIndex()) {
+        } else if (!selector.isIndex) {
           bailout('Used in a not-ok selector');
           return;
         }
@@ -196,12 +196,12 @@
       if (!doNotChangeLengthSelectorsSet.contains(selectorName)) {
         callsGrowableMethod = true;
       }
-      if (selectorName == 'length' && selector.isSetter()) {
+      if (selectorName == 'length' && selector.isSetter) {
         callsGrowableMethod = true;
         assignments.add(inferrer.types.nullType);
       }
-    } else if (selector.isCall() &&
-               !info.targets.every((element) => element.isFunction())) {
+    } else if (selector.isCall &&
+               !info.targets.every((element) => element.isFunction)) {
       bailout('Passed to a closure');
       return;
     }
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/map_tracer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/map_tracer.dart
index 0e98efa..7e04dc5 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/map_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/map_tracer.dart
@@ -72,7 +72,7 @@
     String selectorName = selector.name;
     if (currentUser == info.receiver) {
       if (!okMapSelectorsSet.contains(selectorName)) {
-        if (selector.isCall()) {
+        if (selector.isCall) {
           int positionalLength = info.arguments.positional.length;
           if (selectorName == 'addAll') {
             // All keys and values from the argument flow into
@@ -106,16 +106,16 @@
             bailout('Map used in a not-ok selector [$selectorName]');
             return;
           }
-        } else if (selector.isIndexSet()) {
+        } else if (selector.isIndexSet) {
           keyAssignments.add(info.arguments.positional[0]);
           valueAssignments.add(info.arguments.positional[1]);
-        } else if (!selector.isIndex()) {
+        } else if (!selector.isIndex) {
           bailout('Map used in a not-ok selector [$selectorName]');
           return;
         }
       }
-    } else if (selector.isCall() &&
-               !info.targets.every((element) => element.isFunction())) {
+    } else if (selector.isCall &&
+               !info.targets.every((element) => element.isFunction)) {
       bailout('Passed to a closure');
       return;
     }
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart
index 1083829..e2f8955 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart
@@ -189,7 +189,7 @@
         flow.users.forEach((user) {
           if (user is !DynamicCallSiteTypeInformation) return;
           if (user.receiver != flow) return;
-          if (returnsListElementTypeSet.contains(user.selector)) {
+          if (inferrer._returnsListElementTypeSet.contains(user.selector)) {
             addNewEscapeInformation(user);
           } else if (!doesNotEscapeListSet.contains(user.selector.name)) {
             bailout('Escape from a list via [${user.selector.name}]');
@@ -208,7 +208,7 @@
         flow.users.forEach((user) {
           if (user is !DynamicCallSiteTypeInformation) return;
           if (user.receiver != flow) return;
-          if (user.selector.isIndex()) {
+          if (user.selector.isIndex) {
             addNewEscapeInformation(user);
           } else if (!doesNotEscapeMapSet.contains(user.selector.name)) {
             bailout('Escape from a map via [${user.selector.name}]');
@@ -308,8 +308,8 @@
    * [isAddedToContainer].
    */
   bool isParameterOfListAddingMethod(Element element) {
-    if (!element.isParameter()) return false;
-    if (element.getEnclosingClass() != compiler.backend.listImplementation) {
+    if (!element.isParameter) return false;
+    if (element.enclosingClass != compiler.backend.listImplementation) {
       return false;
     }
     Element method = element.enclosingElement;
@@ -324,8 +324,8 @@
    * [isValueAddedToMap] and [isKeyAddedToMap].
    */
   bool isParameterOfMapAddingMethod(Element element) {
-    if (!element.isParameter()) return false;
-    if (element.getEnclosingClass() != compiler.backend.mapImplementation) {
+    if (!element.isParameter) return false;
+    if (element.enclosingClass != compiler.backend.mapImplementation) {
       return false;
     }
     Element method = element.enclosingElement;
@@ -333,23 +333,23 @@
   }
 
   bool isClosure(Element element) {
-    if (!element.isFunction()) return false;
+    if (!element.isFunction) return false;
     /// Creating an instance of a class that implements [Function] also
     /// closurizes the corresponding [call] member. We do not currently
     /// track these, thus the check for [isClosurized] on such a method will
     /// return false. Instead we catch that case here for now.
     // TODO(herhut): Handle creation of closures from instances of Function.
-    if (element.isInstanceMember() &&
+    if (element.isInstanceMember &&
         element.name == Compiler.CALL_OPERATOR_NAME) {
       return true;
     }
-    Element outermost = element.getOutermostEnclosingMemberOrTopLevel();
+    Element outermost = element.outermostEnclosingMemberOrTopLevel;
     return outermost.declaration != element.declaration;
   }
 
   void visitElementTypeInformation(ElementTypeInformation info) {
     Element element = info.element;
-    if (element.isParameter()
+    if (element.isParameter
         && inferrer.isNativeElement(element.enclosingElement)) {
       bailout('Passed to a native method');
     }
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 ca1ef9a..0ea976d 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
@@ -275,27 +275,27 @@
   void updateSideEffects(SideEffects sideEffects,
                          Selector selector,
                          Element callee) {
-    if (callee.isField()) {
-      if (callee.isInstanceMember()) {
-        if (selector.isSetter()) {
+    if (callee.isField) {
+      if (callee.isInstanceMember) {
+        if (selector.isSetter) {
           sideEffects.setChangesInstanceProperty();
-        } else if (selector.isGetter()) {
+        } else if (selector.isGetter) {
           sideEffects.setDependsOnInstancePropertyStore();
         } else {
           sideEffects.setAllSideEffects();
           sideEffects.setDependsOnSomething();
         }
       } else {
-        if (selector.isSetter()) {
+        if (selector.isSetter) {
           sideEffects.setChangesStaticProperty();
-        } else if (selector.isGetter()) {
+        } else if (selector.isGetter) {
           sideEffects.setDependsOnStaticPropertyStore();
         } else {
           sideEffects.setAllSideEffects();
           sideEffects.setDependsOnSomething();
         }
       }
-    } else if (callee.isGetter() && !selector.isGetter()) {
+    } else if (callee.isGetter && !selector.isGetter) {
       sideEffects.setAllSideEffects();
       sideEffects.setDependsOnSomething();
     } else {
@@ -361,12 +361,12 @@
     ast.Node astNode = node;
     var elements = compiler.enqueuer.resolution.getCachedElements(owner);
     if (astNode.asSendSet() != null) {
-      if (selector.isSetter() || selector.isIndexSet()) {
+      if (selector.isSetter || selector.isIndexSet) {
         elements.setSelector(node, selector);
-      } else if (selector.isGetter() || selector.isIndex()) {
+      } else if (selector.isGetter || selector.isIndex) {
         elements.setGetterSelectorInComplexSendSet(node, selector);
       } else {
-        assert(selector.isOperator());
+        assert(selector.isOperator);
         elements.setOperatorSelectorInComplexSendSet(node, selector);
       }
     } else if (astNode.asSend() != null) {
@@ -385,10 +385,10 @@
   }
 
   bool isNativeElement(Element element) {
-    if (element.isNative()) return true;
-    return element.isMember()
-        && element.getEnclosingClass().isNative()
-        && element.isField();
+    if (element.isNative) return true;
+    return element.isMember
+        && element.enclosingClass.isNative
+        && element.isField;
   }
 
   void analyze(Element element, ArgumentsTypes arguments);
@@ -432,7 +432,7 @@
                             InferrerEngine<T, TypeSystem<T>> inferrer,
                             [LocalsHandler<T> handler])
     : this.internal(element,
-        element.getOutermostEnclosingMemberOrTopLevel().implementation,
+        element.outermostEnclosingMemberOrTopLevel.implementation,
         inferrer, compiler, handler);
 
   void analyzeSuperConstructorCall(Element target, ArgumentsTypes arguments) {
@@ -441,9 +441,9 @@
   }
 
   T run() {
-    var node = analyzedElement.parseNode(compiler);
+    var node = analyzedElement.node;
     ast.Expression initializer;
-    if (analyzedElement.isField()) {
+    if (analyzedElement.isField) {
       VariableElement fieldElement = analyzedElement;
       initializer = fieldElement.initializer;
       if (initializer == null) {
@@ -465,7 +465,7 @@
     closureData.forEachBoxedVariable((variable, field) {
       locals.setCapturedAndBoxed(variable, field);
     });
-    if (analyzedElement.isField()) {
+    if (analyzedElement.isField) {
       return visit(initializer);
     }
 
@@ -477,18 +477,18 @@
       inferrer.setDefaultTypeOfParameter(element, type);
     });
 
-    if (analyzedElement.isNative()) {
+    if (analyzedElement.isNative) {
       // Native methods do not have a body, and we currently just say
       // they return dynamic.
       return types.dynamicType;
     }
 
-    if (analyzedElement.isGenerativeConstructor()) {
+    if (analyzedElement.isGenerativeConstructor) {
       isThisExposed = false;
       signature.forEachParameter((element) {
         T parameterType = inferrer.typeOfElement(element);
         if (element.kind == ElementKind.FIELD_PARAMETER) {
-          if (element.fieldElement.modifiers.isFinal()) {
+          if (element.fieldElement.modifiers.isFinal) {
             inferrer.recordTypeOfFinalField(
                 node,
                 analyzedElement,
@@ -504,7 +504,7 @@
         }
         locals.update(element, parameterType, node);
       });
-      ClassElement cls = analyzedElement.getEnclosingClass();
+      ClassElement cls = analyzedElement.enclosingClass;
       if (analyzedElement.isSynthesized) {
         node = analyzedElement;
         synthesizeForwardingCall(node, analyzedElement.targetConstructor);
@@ -520,7 +520,7 @@
             && !seenSuperConstructorCall
             && !cls.isObject(compiler)) {
           Selector selector =
-              new Selector.callDefaultConstructor(analyzedElement.getLibrary());
+              new Selector.callDefaultConstructor(analyzedElement.library);
           FunctionElement target = cls.superclass.lookupConstructor(selector);
           analyzeSuperConstructorCall(target, new ArgumentsTypes([], {}));
           synthesizeForwardingCall(analyzedElement, target);
@@ -532,7 +532,7 @@
         // Iterate over all instance fields, and give a null type to
         // fields that we haven't initialized for sure.
         cls.forEachInstanceField((_, field) {
-          if (field.modifiers.isFinal()) return;
+          if (field.modifiers.isFinal) return;
           T type = locals.fieldScope.readField(field);
           if (type == null && field.initializer == null) {
             inferrer.recordTypeOfNonFinalField(node, field, types.nullType);
@@ -637,7 +637,7 @@
       elementType = elementType == null
           ? types.nonNullEmpty()
           : types.simplifyPhi(null, null, elementType);
-      T containerType = node.isConst()
+      T containerType = node.isConst
           ? types.constListType
           : types.growableListType;
       return types.allocateList(
@@ -660,7 +660,7 @@
         valueTypes.add(visit(entry.value));
       }
 
-      T type = node.isConst() ? types.constMapType : types.mapType;
+      T type = node.isConst ? types.constMapType : types.mapType;
       return types.allocateMap(type,
                                node,
                                outermostElement,
@@ -672,25 +672,25 @@
   bool isThisOrSuper(ast.Node node) => node.isThis() || node.isSuper();
 
   bool isInClassOrSubclass(Element element) {
-    ClassElement cls = outermostElement.getEnclosingClass();
-    ClassElement enclosing = element.getEnclosingClass();
+    ClassElement cls = outermostElement.enclosingClass;
+    ClassElement enclosing = element.enclosingClass;
     return (enclosing == cls) || compiler.world.isSubclass(cls, enclosing);
   }
 
   void checkIfExposesThis(Selector selector) {
     if (isThisExposed) return;
     inferrer.forEachElementMatching(selector, (element) {
-      if (element.isField()) {
-        if (!selector.isSetter()
+      if (element.isField) {
+        if (!selector.isSetter
             && isInClassOrSubclass(element)
-            && !element.modifiers.isFinal()
+            && !element.modifiers.isFinal
             && locals.fieldScope.readField(element) == null
             && element.initializer == null) {
           // If the field is being used before this constructor
           // actually had a chance to initialize it, say it can be
           // null.
           inferrer.recordTypeOfNonFinalField(
-              analyzedElement.parseNode(compiler), element,
+              analyzedElement.node, element,
               types.nullType);
         }
         // Accessing a field does not expose [:this:].
@@ -704,18 +704,18 @@
   }
 
   bool get inInstanceContext {
-    return (outermostElement.isInstanceMember() && !outermostElement.isField())
-        || outermostElement.isGenerativeConstructor();
+    return (outermostElement.isInstanceMember && !outermostElement.isField)
+        || outermostElement.isGenerativeConstructor;
   }
 
   bool treatAsInstanceMember(Element element) {
     return (Elements.isUnresolved(element) && inInstanceContext)
-        || (element != null && element.isInstanceMember());
+        || (element != null && element.isInstanceMember);
   }
 
   T visitSendSet(ast.SendSet node) {
     Element element = elements[node];
-    if (!Elements.isUnresolved(element) && element.impliesType()) {
+    if (!Elements.isUnresolved(element) && element.impliesType) {
       node.visitChildren(this);
       return types.dynamicType;
     }
@@ -826,8 +826,8 @@
             node, setterSelector, element,
             new ArgumentsTypes<T>([newType], null));
       } else if (Elements.isUnresolved(element)
-                 || element.isSetter()
-                 || element.isField()) {
+                 || element.isSetter
+                 || element.isField) {
         getterType = handleDynamicSend(
             node, getterSelector, receiverType, null);
         newType = handleDynamicSend(
@@ -865,8 +865,8 @@
       // Code will always throw.
     } else if (Elements.isStaticOrTopLevelField(element)) {
       handleStaticSend(node, setterSelector, element, arguments);
-    } else if (Elements.isUnresolved(element) || element.isSetter()) {
-      if (analyzedElement.isGenerativeConstructor()
+    } else if (Elements.isUnresolved(element) || element.isSetter) {
+      if (analyzedElement.isGenerativeConstructor
           && (node.asSendSet() != null)
           && (node.asSendSet().receiver != null)
           && node.asSendSet().receiver.isThis()) {
@@ -877,19 +877,19 @@
         // its type.
         if (targets.length == 1) {
           Element single = targets.first;
-          if (single.isField()) {
+          if (single.isField) {
             locals.updateField(single, rhsType);
           }
         }
       }
       handleDynamicSend(
           node, setterSelector, receiverType, arguments);
-    } else if (element.isField()) {
-      if (element.modifiers.isFinal()) {
+    } else if (element.isField) {
+      if (element.isFinal) {
         inferrer.recordTypeOfFinalField(
             node, outermostElement, element, rhsType);
       } else {
-        if (analyzedElement.isGenerativeConstructor()) {
+        if (analyzedElement.isGenerativeConstructor) {
           locals.updateField(element, rhsType);
         }
         if (visitingInitializers) {
@@ -924,8 +924,8 @@
       // `noSuchMethod` handler.
       return handleDynamicSend(node, selector, superType, arguments);
     } else if (node.isPropertyAccess
-              || element.isFunction()
-              || element.isGenerativeConstructor()) {
+              || element.isFunction
+              || element.isGenerativeConstructor) {
       return handleStaticSend(node, selector, element, arguments);
     } else {
       return inferrer.registerCalledClosure(
@@ -942,7 +942,7 @@
     if (length != null) {
       return length.value;
     } else if (element != null
-               && element.isField()
+               && element.isField
                && Elements.isStaticOrTopLevelField(element)
                && compiler.world.fieldNeverChanges(element)) {
       var constant =
@@ -995,18 +995,18 @@
               elementType, length));
     } else if (Elements.isConstructorOfTypedArraySubclass(element, compiler)) {
       int length = findLength(node);
-      FunctionElement constructor = element;
-      constructor = constructor.redirectionTarget;
+      ConstructorElement constructor = element;
+      constructor = constructor.effectiveTarget;
       T elementType = inferrer.returnTypeOfElement(
-          constructor.getEnclosingClass().lookupMember('[]'));
+          constructor.enclosingClass.lookupMember('[]'));
       return inferrer.concreteTypes.putIfAbsent(
         node, () => types.allocateList(
-          types.nonNullExact(constructor.getEnclosingClass()), node,
+          types.nonNullExact(constructor.enclosingClass), node,
           outermostElement, elementType, length));
-    } else if (element.isFunction() || element.isConstructor()) {
+    } else if (element.isFunction || element.isConstructor) {
       return returnType;
     } else {
-      assert(element.isField() || element.isGetter());
+      assert(element.isField || element.isGetter);
       return inferrer.registerCalledClosure(
           node, selector, inferrer.typeOfElement(element),
           outermostElement, arguments, sideEffects, inLoop);
@@ -1081,7 +1081,7 @@
     ArgumentsTypes arguments = analyzeArguments(node.arguments);
     Element element = elements[node];
     Selector selector = elements.getSelector(node);
-    if (element != null && element.isFunction()) {
+    if (element != null && element.isFunction) {
       assert(Elements.isLocal(element));
       // This only works for function statements. We need a
       // more sophisticated type system with function types to support
@@ -1262,7 +1262,7 @@
     Selector selector = elements.getSelector(identifier);
 
     T receiverType;
-    if (element != null && element.isInstanceMember()) {
+    if (element != null && element.isInstanceMember) {
       receiverType = thisType;
     } else {
       receiverType = types.dynamicType;
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 ca6e91a..53bea15 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -29,34 +29,6 @@
 bool _VERBOSE = false;
 bool _PRINT_SUMMARY = false;
 
-/**
- * A set of selector names that [List] implements, that we know return
- * their element type.
- */
-Set<Selector> returnsListElementTypeSet = new Set<Selector>.from(
-  <Selector>[
-    new Selector.getter('first', null),
-    new Selector.getter('last', null),
-    new Selector.getter('single', null),
-    new Selector.call('singleWhere', null, 1),
-    new Selector.call('elementAt', null, 1),
-    new Selector.index(),
-    new Selector.call('removeAt', null, 1),
-    new Selector.call('removeLast', null, 0)
-  ]);
-
-bool returnsListElementType(Selector selector) {
-  return (selector.mask != null) &&
-         selector.mask.isContainer &&
-         returnsListElementTypeSet.contains(selector.asUntyped);
-}
-
-bool returnsMapValueType(Selector selector) {
-  return (selector.mask != null) &&
-         selector.mask.isMap &&
-         selector.isIndex();
-}
-
 class TypeInformationSystem extends TypeSystem<TypeInformation> {
   final Compiler compiler;
 
@@ -496,6 +468,34 @@
   TypeGraphInferrerEngine(Compiler compiler, this.mainElement)
         : super(compiler, new TypeInformationSystem(compiler));
 
+  /**
+   * A set of selector names that [List] implements, that we know return
+   * their element type.
+   */
+  final Set<Selector> _returnsListElementTypeSet = new Set<Selector>.from(
+    <Selector>[
+      new Selector.getter('first', null),
+      new Selector.getter('last', null),
+      new Selector.getter('single', null),
+      new Selector.call('singleWhere', null, 1),
+      new Selector.call('elementAt', null, 1),
+      new Selector.index(),
+      new Selector.call('removeAt', null, 1),
+      new Selector.call('removeLast', null, 0)
+    ]);
+
+  bool returnsListElementType(Selector selector) {
+    return (selector.mask != null) &&
+           selector.mask.isContainer &&
+           _returnsListElementTypeSet.contains(selector.asUntyped);
+  }
+
+  bool returnsMapValueType(Selector selector) {
+    return (selector.mask != null) &&
+           selector.mask.isMap &&
+           selector.isIndex;
+  }
+
   void analyzeListAndEnqueue(ListTypeInformation info) {
     if (info.analyzed) return;
     info.analyzed = true;
@@ -604,7 +604,7 @@
         // of this closure call are not a root to trace but an intermediate
         // for some other function.
         Iterable<FunctionElement> elements = info.callees
-            .where((e) => e.isFunction()).toList();
+            .where((e) => e.isFunction).toList();
         trace(elements, new ClosureTracerVisitor(elements, info, this));
       } else {
         assert(info is ElementTypeInformation);
@@ -665,10 +665,10 @@
     });
     addedInGraph++;
 
-    if (element.isField()) {
+    if (element.isField) {
       VariableElement fieldElement = element;
-      ast.Node node = fieldElement.parseNode(compiler);
-      if (element.modifiers.isFinal() || element.modifiers.isConst()) {
+      ast.Node node = fieldElement.node;
+      if (element.isFinal || element.isConst) {
         // If [element] is final and has an initializer, we record
         // the inferred type.
         if (fieldElement.initializer != null) {
@@ -692,7 +692,7 @@
             }
           }
           recordType(element, type);
-        } else if (!element.isInstanceMember()) {
+        } else if (!element.isInstanceMember) {
           recordType(element, types.nullType);
         }
       } else if (fieldElement.initializer == null) {
@@ -706,12 +706,12 @@
       }
       if (Elements.isStaticOrTopLevelField(element) &&
           fieldElement.initializer != null &&
-          !element.modifiers.isConst()) {
+          !element.isConst) {
         var argument = fieldElement.initializer;
         // TODO(13429): We could do better here by using the
         // constant handler to figure out if it's a lazy field or not.
         if (argument.asSend() != null ||
-            (argument.asNewExpression() != null && !argument.isConst())) {
+            (argument.asNewExpression() != null && !argument.isConst)) {
           recordType(element, types.nullType);
         }
       }
@@ -776,8 +776,8 @@
                                   Selector selector,
                                   {bool remove, bool addToQueue: true}) {
     if (callee.name == Compiler.NO_SUCH_METHOD) return;
-    if (callee.isField()) {
-      if (selector.isSetter()) {
+    if (callee.isField) {
+      if (selector.isSetter) {
         ElementTypeInformation info = types.getInferredTypeOf(callee);
         if (remove) {
           info.removeAssignment(arguments.positional[0]);
@@ -786,11 +786,11 @@
         }
         if (addToQueue) workQueue.add(info);
       }
-    } else if (callee.isGetter()) {
+    } else if (callee.isGetter) {
       return;
-    } else if (selector != null && selector.isGetter()) {
+    } else if (selector != null && selector.isGetter) {
       // We are tearing a function off and thus create a closure.
-      assert(callee.isFunction());
+      assert(callee.isFunction);
       ElementTypeInformation info = types.getInferredTypeOf(callee);
       if (remove) {
         info.closurizedCount--;
@@ -847,7 +847,7 @@
     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.enclosingElement.isInstanceMember) {
         ParameterAssignments assignments = info.assignments;
         int count = assignments.assignments[existing];
         if (count == null) return;
@@ -917,7 +917,7 @@
     TypeInformation type = types.getInferredTypeOf(element);
     // TODO(ngeoffray): Clean up. We do this check because
     // [SimpleTypesInferrer] deals with two different inferrers.
-    if (element.isGenerativeConstructor()) return type;
+    if (element.isGenerativeConstructor) return type;
     type.addAssignment(newType);
     return type;
   }
@@ -944,7 +944,7 @@
                                          ArgumentsTypes arguments,
                                          SideEffects sideEffects,
                                          bool inLoop) {
-    if (selector.isClosureCall()) {
+    if (selector.isClosureCall) {
       return registerCalledClosure(
           node, selector, receiverType, caller, arguments, sideEffects, inLoop);
     }
@@ -986,13 +986,13 @@
     compiler.enqueuer.resolution.resolvedElements.forEach(
       (Element element, TreeElementMapping mapping) {
         element = element.implementation;
-        if (element.impliesType()) return;
+        if (element.impliesType) return;
         assert(invariant(element,
-            element.isField() ||
-            element.isFunction() ||
-            element.isGenerativeConstructor() ||
-            element.isGetter() ||
-            element.isSetter(),
+            element.isField ||
+            element.isFunction ||
+            element.isGenerativeConstructor ||
+            element.isGetter ||
+            element.isSetter,
             message: 'Unexpected element kind: ${element.kind}'));
         // TODO(ngeoffray): Not sure why the resolver would put a null
         // mapping.
@@ -1044,22 +1044,22 @@
       // An invocation can resolve to a [noSuchMethod], in which case
       // we get the return type of [noSuchMethod].
       return returnTypeOfElement(element);
-    } else if (selector.isGetter()) {
-      if (element.isFunction()) {
+    } else if (selector.isGetter) {
+      if (element.isFunction) {
         // [functionType] is null if the inferrer did not run.
         return types.functionType == null
             ? types.dynamicType
             : types.functionType;
-      } else if (element.isField()) {
+      } else if (element.isField) {
         return typeOfElement(element);
       } else if (Elements.isUnresolved(element)) {
         return types.dynamicType;
       } else {
-        assert(element.isGetter());
+        assert(element.isGetter);
         return returnTypeOfElement(element);
       }
-    } else if (element.isGetter() || element.isField()) {
-      assert(selector.isCall() || selector.isSetter());
+    } else if (element.isGetter || element.isField) {
+      assert(selector.isCall || selector.isSetter);
       return types.dynamicType;
     } else {
       return returnTypeOfElement(element);
@@ -1113,16 +1113,16 @@
     if (compiler.disableTypeInference) return compiler.typesTask.dynamicType;
     // Bailout for closure calls. We're not tracking types of
     // closures.
-    if (selector.isClosureCall()) return compiler.typesTask.dynamicType;
-    if (selector.isSetter() || selector.isIndexSet()) {
+    if (selector.isClosureCall) return compiler.typesTask.dynamicType;
+    if (selector.isSetter || selector.isIndexSet) {
       return compiler.typesTask.dynamicType;
     }
-    if (returnsListElementType(selector)) {
+    if (inferrer.returnsListElementType(selector)) {
       ContainerTypeMask mask = selector.mask;
       TypeMask elementType = mask.elementType;
       return elementType == null ? compiler.typesTask.dynamicType : elementType;
     }
-    if (returnsMapValueType(selector)) {
+    if (inferrer.returnsMapValueType(selector)) {
       MapTypeMask mask = selector.mask;
       TypeMask valueType = mask.valueType;
       return valueType == null ? compiler.typesTask.dynamicType
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
index 46d9c59..fe37c1f 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
@@ -251,8 +251,8 @@
 
   factory ElementTypeInformation(Element element) {
     var assignments = null;
-    if (element.enclosingElement.isInstanceMember() &&
-        (element.isParameter() || element.isFieldParameter())) {
+    if (element.enclosingElement.isInstanceMember &&
+        (element.isParameter || element.isFieldParameter)) {
       assignments = new ParameterAssignments();
     }
     return new ElementTypeInformation.internal(element, assignments);
@@ -295,7 +295,7 @@
     if (abandonInferencing) return type;
     if (disableHandleSpecialCases) return null;
 
-    if (element.isParameter()) {
+    if (element.isParameter) {
       Element enclosing = element.enclosingElement;
       if (Elements.isLocal(enclosing)) {
         // Do not infer types for parameters of closures. We do not
@@ -303,7 +303,7 @@
         // traced.
         giveUp(inferrer, clearAssignments: false);
         return type;
-      } else if (enclosing.isInstanceMember() &&
+      } else if (enclosing.isInstanceMember &&
                  (enclosing.name == Compiler.NO_SUCH_METHOD ||
                   enclosing.name == Compiler.CALL_OPERATOR_NAME)) {
         // Do not infer types for parameters of [noSuchMethod] and
@@ -320,9 +320,9 @@
         return type;
       }
     }
-    if (element.isField() ||
-        element.isParameter() ||
-        element.isFieldParameter()) {
+    if (element.isField ||
+        element.isParameter ||
+        element.isFieldParameter) {
       if (!inferrer.compiler.backend.canBeUsedForGlobalOptimizations(element)) {
         // Do not infer types for fields and parameters being assigned
         // by synthesized calls.
@@ -335,13 +335,13 @@
       // also give up on inferring to make sure this element never
       // goes in the work queue.
       giveUp(inferrer);
-      if (element.isField()) {
+      if (element.isField) {
         return inferrer.typeOfNativeBehavior(
             native.NativeBehavior.ofFieldLoad(element, inferrer.compiler)).type;
       } else {
-        assert(element.isFunction() ||
-               element.isGetter() ||
-               element.isSetter());
+        assert(element.isFunction ||
+               element.isGetter ||
+               element.isSetter);
         TypedElement typedElement = element;
         var elementType = typedElement.type;
         if (elementType.kind != TypeKind.FUNCTION) {
@@ -371,15 +371,15 @@
                                  TypeGraphInferrerEngine inferrer) {
     Compiler compiler = inferrer.compiler;
     // Parameters are being explicitly checked in the method.
-    if (element.isParameter() || element.isFieldParameter()) return mask;
+    if (element.isParameter || element.isFieldParameter) return mask;
     if (!compiler.trustTypeAnnotations && !compiler.enableTypeAssertions) {
       return mask;
     }
-    if (element.isGenerativeConstructor() || element.isSetter()) return mask;
+    if (element.isGenerativeConstructor || element.isSetter) return mask;
     var type = element.computeType(compiler);
-    if (element.isFunction() ||
-        element.isGetter() ||
-        element.isFactoryConstructor()) {
+    if (element.isFunction ||
+        element.isGetter ||
+        element.isFactoryConstructor) {
       type = type.returnType;
     }
     return new TypeMaskSystem(compiler).narrowType(mask, type);
@@ -398,23 +398,22 @@
     return visitor.visitElementTypeInformation(this);
   }
 
-  Element get owner => element.getOutermostEnclosingMemberOrTopLevel();
+  Element get owner => element.outermostEnclosingMemberOrTopLevel;
 
   bool hasStableType(TypeGraphInferrerEngine inferrer) {
     // The number of assignments of parameters of instance methods is
     // not stable. Therefore such a parameter cannot be stable.
-    if (element.isParameter() && element.enclosingElement.isInstanceMember()) {
+    if (element.isParameter && element.enclosingElement.isInstanceMember) {
       return false;
     }
 
     // The number of assignments of non-final fields is
     // not stable. Therefore such a field cannot be stable.
-    if (element.isField() &&
-        !(element.modifiers.isConst() || element.modifiers.isFinal())) {
+    if (element.isField && !(element.isConst || element.isFinal)) {
       return false;
     }
 
-    if (element.isFunction()) return false;
+    if (element.isFunction) return false;
 
     return super.hasStableType(inferrer);
   }
@@ -579,7 +578,7 @@
     if (!selector.mask.containsOnlyInt(compiler)) {
       return null;
     }
-    if (!selector.isCall() && !selector.isOperator()) return null;
+    if (!selector.isCall && !selector.isOperator) return null;
     if (!arguments.named.isEmpty) return null;
     if (arguments.positional.length > 1) return null;
 
@@ -684,10 +683,10 @@
         return const TypeMask.nonNullEmpty();
       }
 
-      if (returnsListElementType(typedSelector)) {
+      if (inferrer.returnsListElementType(typedSelector)) {
         ContainerTypeMask mask = receiver.type;
         return mask.elementType;
-      } else if (returnsMapValueType(typedSelector)) {
+      } else if (inferrer.returnsMapValueType(typedSelector)) {
         if (typedSelector.mask.isDictionary &&
             arguments.positional[0].type.isValue) {
           DictionaryTypeMask mask = typedSelector.mask;
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
index 171de10..c373e7d 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -10,9 +10,9 @@
 import '../dart_types.dart';
 import '../source_file.dart';
 import '../tree/tree.dart' as ast;
-import '../scanner/scannerlib.dart' show Token;
+import '../scanner/scannerlib.dart' show Token, isUserDefinableOperator;
 import '../dart_backend/dart_backend.dart' show DartBackend;
-import 'ir_pickler.dart' show Unpickler, IrConstantPool;
+import '../universe/universe.dart' show SelectorKind;
 
 /**
  * This task iterates through all resolved elements and builds [ir.Node]s. The
@@ -59,7 +59,7 @@
           ElementKind kind = element.kind;
           if (kind == ElementKind.GENERATIVE_CONSTRUCTOR) {
             // TODO(lry): build ir for constructors.
-          } else if (element.isDeferredLoaderGetter()) {
+          } else if (element.isDeferredLoaderGetter) {
             // TODO(sigurdm): Build ir for deferred loader functions.
           } else if (kind == ElementKind.GENERATIVE_CONSTRUCTOR_BODY ||
               kind == ElementKind.FUNCTION ||
@@ -73,14 +73,6 @@
           }
 
           if (function != null) {
-            assert(() {
-              // In host-checked mode, serialize and de-serialize the IrNode.
-              LibraryElement library = element.declaration.getLibrary();
-              IrConstantPool constantPool = IrConstantPool.forLibrary(library);
-              List<int> data = function.pickle(constantPool);
-              function = new Unpickler(compiler, constantPool).unpickle(data);
-              return true;
-            });
             nodes[element] = function;
             compiler.tracer.traceCompilation(element.name, null, compiler);
             compiler.tracer.traceGraph("IR Builder", function);
@@ -92,12 +84,10 @@
 
   bool irEnabled() {
     // TODO(lry): support checked-mode checks.
-    if (compiler.enableTypeAssertions ||
-        compiler.backend is !DartBackend ||
-        compiler.enableConcreteTypeInference) {
-      return false;
-    }
-    return const bool.fromEnvironment('enable_ir', defaultValue: true);
+    return const bool.fromEnvironment('USE_NEW_BACKEND') &&
+        compiler.backend is DartBackend &&
+        !compiler.enableTypeAssertions &&
+        !compiler.enableConcreteTypeInference;
   }
 
   bool canBuild(Element element) {
@@ -121,11 +111,11 @@
     // 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.
-    if (element.isGetter() || element.isSetter()) return false;
-    if (element.enclosingElement.isClass()) return false;
+    if (element.isGetter || element.isSetter) return false;
+    if (element.enclosingElement.isClass) return false;
 
     // TODO(lry): support native functions (also in [visitReturn]).
-    if (function.isNative()) return false;
+    if (function.isNative) return false;
 
     return true;
   }
@@ -141,7 +131,7 @@
       FunctionElement functionElement = element;
       if (functionElement.patch != null) element = functionElement.patch;
     }
-    return element.getCompilationUnit().script.file;
+    return element.compilationUnit.script.file;
   }
 }
 
@@ -236,9 +226,9 @@
 
   ir.FunctionDefinition buildFunctionInternal(FunctionElement element) {
     assert(invariant(element, element.isImplementation));
-    ast.FunctionExpression function = element.parseNode(compiler);
+    ast.FunctionExpression function = element.node;
     assert(function != null);
-    assert(!function.modifiers.isExternal());
+    assert(!function.modifiers.isExternal);
     assert(elements[function] != null);
 
     root = current = null;
@@ -315,14 +305,84 @@
     return null;
   }
 
+  List<ir.Parameter> createJoinParameters(IrBuilder leftBuilder,
+                                          List<ir.Primitive> leftArguments,
+                                          IrBuilder rightBuilder,
+                                          List<ir.Primitive> rightArguments) {
+    // The sets of free and assigned variables for a delimited builder is
+    // initially the length of the assigned variables of the parent.  The free
+    // variables cannot grow because there cannot be free occurrences of
+    // variables that were not declared before the entrance to the delimited
+    // subgraph.  The assigned variables can grow when new variables are
+    // declared in the delimited graph, but we only inspect the prefix
+    // corresponding to the parent's declared variables.
+    assert(assignedVars.length == leftBuilder.freeVars.length);
+    assert(assignedVars.length == rightBuilder.freeVars.length);
+    assert(assignedVars.length <= leftBuilder.assignedVars.length);
+    assert(assignedVars.length <= rightBuilder.assignedVars.length);
+
+    List<ir.Parameter> parameters = <ir.Parameter>[];
+    // If a variable was assigned on either the left or the right (and control
+    // flow reaches the end of the corresponding subterm) then the variable has
+    // different values reaching the join point and needs to be passed as an
+    // argument to the join point continuation.
+    for (int i = 0; i < assignedVars.length; ++i) {
+      // The last assignments if any reaching the end of the two subterms.
+      ir.Definition leftAssignment =
+          leftBuilder.isOpen ? leftBuilder.assignedVars[i] : null;
+      ir.Definition rightAssignment =
+          rightBuilder.isOpen ? rightBuilder.assignedVars[i] : null;
+
+      if (leftAssignment != null || rightAssignment != null) {
+        // The corresponsing argument is the reaching definition if any, or a
+        // free occurrence.  In the case that control does not reach both the
+        // left and right subterms we will still have a join continuation with
+        // possibly arguments passed to it.  Such singly-used continuations
+        // are eliminated by the shrinking conversions.
+        ir.Parameter parameter = new ir.Parameter(null);
+        parameters.add(parameter);
+        leftArguments.add(leftAssignment == null
+                              ? leftBuilder.freeVars[i]
+                              : leftAssignment);
+        rightArguments.add(rightAssignment == null
+                              ? rightBuilder.freeVars[i]
+                              : rightAssignment);
+      }
+    }
+    return parameters;
+  }
+
+  void captureFreeVariables(IrBuilder leftBuilder,
+                            IrBuilder rightBuilder,
+                            List<ir.Parameter> parameters) {
+    int parameterIndex = 0;
+    for (int i = 0; i < assignedVars.length; ++i) {
+      // This is the definition that reaches the left and right subterms.  All
+      // free uses in either term are uses of this definition.
+      ir.Definition reachingDefinition =
+          assignedVars[i] == null ? freeVars[i] : assignedVars[i];
+      reachingDefinition
+          ..substituteFor(leftBuilder.freeVars[i])
+          ..substituteFor(rightBuilder.freeVars[i]);
+
+      // Also add join continuation parameters as assignments for the join
+      // body.  This is done last because the assigned variables are updated
+      // in place.
+      if ((leftBuilder.isOpen && leftBuilder.assignedVars[i] != null) ||
+          (rightBuilder.isOpen && rightBuilder.assignedVars[i] != null)) {
+        assignedVars[i] = parameters[parameterIndex++];
+      }
+    }
+  }
+
   ir.Primitive visitIf(ast.If node) {
     assert(isOpen);
     ir.Primitive condition = visit(node.condition);
 
     // The then and else parts are delimited.
     IrBuilder thenBuilder = new IrBuilder.delimited(this);
-    thenBuilder.visit(node.thenPart);
     IrBuilder elseBuilder = new IrBuilder.delimited(this);
+    thenBuilder.visit(node.thenPart);
     if (node.hasElsePart) elseBuilder.visit(node.elsePart);
 
     // The free variables in the then and else parts are uses of definitions
@@ -330,41 +390,11 @@
     // assigned variables in the then and else parts are arguments to the join
     // point continuation if any.
 
-    // FreeVars is initially the length of assignedVars of the parent, and it
-    // does not grow.  AssignedVars can grow.
-    assert(assignedVars.length == thenBuilder.freeVars.length);
-    assert(assignedVars.length == elseBuilder.freeVars.length);
-    assert(assignedVars.length <= thenBuilder.assignedVars.length);
-    assert(assignedVars.length <= elseBuilder.assignedVars.length);
-    List<ir.Parameter> parameters = <ir.Parameter>[];
     List<ir.Primitive> thenArguments = <ir.Primitive>[];
     List<ir.Primitive> elseArguments = <ir.Primitive>[];
-    for (int i = 0; i < assignedVars.length; ++i) {
-      // These are the last assignments, if any, in the then and else
-      // continuations respectively (if they can reach the join point).  If a
-      // variable is assigned in either branch reaching the join point, it has
-      // different values that must be passed as an argument to the join point
-      // continuation.
-      ir.Definition thenAssignment =
-          thenBuilder.isOpen ? thenBuilder.assignedVars[i] : null;
-      ir.Definition elseAssignment =
-          elseBuilder.isOpen ? elseBuilder.assignedVars[i] : null;
-      if (thenAssignment != null || elseAssignment != null) {
-        // In the case that not both then and else parts can reach the join
-        // point, there will still be a join-point continuation possibly with
-        // arguments passed to it.  Such singly-used continuations should be
-        // eliminated by shrinking conversions (because they can arise
-        // otherwise as the result of optimization).
-        ir.Parameter parameter = new ir.Parameter(null);
-        parameters.add(parameter);
-        thenArguments.add(thenAssignment == null
-                              ? thenBuilder.freeVars[i]
-                              : thenAssignment);
-        elseArguments.add(elseAssignment == null
-                              ? elseBuilder.freeVars[i]
-                              : elseAssignment);
-      }
-    }
+    List<ir.Parameter> parameters =
+        createJoinParameters(thenBuilder, thenArguments,
+                             elseBuilder, elseArguments);
 
     // Create a then and else continuations and a join continuation if
     // necessary.  Jump to the join continuation from the exits of the then
@@ -386,27 +416,11 @@
     thenContinuation.body = thenBuilder.root;
     elseContinuation.body = elseBuilder.root;
 
-    // Capture free occurrences in the then and else bodies.  This is done
-    // after creating invocations of the join continuation so free join
+    // Capture free occurrences in the then and else bodies and add join
+    // continuation parameters as assignments reaching the join body.  This is
+    // done after creating invocations of the join continuation so free join
     // continuation arguments are properly captured.
-    //
-    // Also add join continuation parameters as assignments for the join body.
-    // This is done last because the assigned variables are updated in place.
-    int parameterIndex = 0;
-    for (int i = 0; i < assignedVars.length; ++i) {
-      // This is the definition that reaches the then and else continuations.
-      // All free uses in either continuation are uses of this definition.
-      ir.Definition reachingDefinition =
-          assignedVars[i] == null ? freeVars[i] : assignedVars[i];
-      reachingDefinition
-          ..substituteFor(thenBuilder.freeVars[i])
-          ..substituteFor(elseBuilder.freeVars[i]);
-
-      if ((thenBuilder.isOpen && thenBuilder.assignedVars[i] != null) ||
-          (elseBuilder.isOpen && elseBuilder.assignedVars[i] != null)) {
-        assignedVars[i] = parameters[parameterIndex++];
-      }
-    }
+    captureFreeVariables(thenBuilder, elseBuilder, parameters);
 
     ir.Expression branch =
         new ir.LetCont(thenContinuation,
@@ -469,6 +483,49 @@
   }
 
   // ==== Expressions ====
+  ir.Primitive visitConditional(ast.Conditional node) {
+    assert(isOpen);
+    ir.Primitive condition = visit(node.condition);
+
+    // The then and else expressions are delimited.
+    IrBuilder thenBuilder = new IrBuilder.delimited(this);
+    IrBuilder elseBuilder = new IrBuilder.delimited(this);
+    ir.Primitive thenValue = thenBuilder.visit(node.thenExpression);
+    ir.Primitive elseValue = elseBuilder.visit(node.elseExpression);
+
+    List<ir.Primitive> thenArguments = <ir.Primitive>[];
+    List<ir.Primitive> elseArguments = <ir.Primitive>[];
+    List<ir.Parameter> parameters =
+        createJoinParameters(thenBuilder, thenArguments,
+                             elseBuilder, elseArguments);
+    // Add a continuation parameter for the result of the expression.
+    ir.Parameter resultParameter = new ir.Parameter(null);
+    parameters.add(resultParameter);
+    thenArguments.add(thenValue);
+    elseArguments.add(elseValue);
+
+    ir.Continuation joinContinuation = new ir.Continuation(parameters);
+    ir.Continuation thenContinuation = new ir.Continuation([]);
+    ir.Continuation elseContinuation = new ir.Continuation([]);
+    thenBuilder.add(
+        new ir.InvokeContinuation(joinContinuation, thenArguments));
+    elseBuilder.add(
+        new ir.InvokeContinuation(joinContinuation, elseArguments));
+    thenContinuation.body = thenBuilder.root;
+    elseContinuation.body = elseBuilder.root;
+
+    captureFreeVariables(thenBuilder, elseBuilder, parameters);
+
+    ir.Expression branch =
+        new ir.LetCont(thenContinuation,
+            new ir.LetCont(elseContinuation,
+                new ir.Branch(new ir.IsTrue(condition),
+                              thenContinuation,
+                              elseContinuation)));
+    add(new ir.LetCont(joinContinuation, branch));
+    return resultParameter;
+  }
+
   // For all simple literals:
   // Build(Literal(c), C) = C[let val x = Constant(c) in [], x]
   ir.Primitive visitLiteralBool(ast.LiteralBool node) {
@@ -503,9 +560,15 @@
     return constant;
   }
 
-  // TODO(kmillikin): other literals.  Strings require quoting and escaping
-  // in the Dart backend.
-  //   LiteralString
+  ir.Primitive visitLiteralString(ast.LiteralString node) {
+    assert(isOpen);
+    ir.Constant constant =
+        new ir.Constant(constantSystem.createString(node.dartString));
+    add(new ir.LetPrim(constant));
+    return constant;
+  }
+
+  // TODO(kmillikin): other literals.
   //   LiteralList
   //   LiteralMap
   //   LiteralMapEntry
@@ -517,12 +580,37 @@
     return visit(node.expression);
   }
 
+  // Stores the result of visiting a CascadeReceiver, so we can return it from
+  // its enclosing Cascade.
+  ir.Primitive _currentCascadeReceiver;
+
+  ir.Primitive visitCascadeReceiver(ast.CascadeReceiver node) {
+    assert(isOpen);
+    return _currentCascadeReceiver = visit(node.expression);
+  }
+
+  ir.Primitive visitCascade(ast.Cascade node) {
+    assert(isOpen);
+    var oldCascadeReceiver = _currentCascadeReceiver;
+    // Throw away the result of visiting the expression.
+    // Instead we return the result of visiting the CascadeReceiver.
+    this.visit(node.expression);
+    ir.Primitive receiver = _currentCascadeReceiver;
+    _currentCascadeReceiver = oldCascadeReceiver;
+    return receiver;
+  }
+
   // ==== Sends ====
   ir.Primitive visitAssert(ast.Send node) {
     assert(isOpen);
     return giveup();
   }
 
+  ir.Primitive visitNamedArgument(ast.NamedArgument node) {
+    assert(isOpen);
+    return visit(node.expression);
+  }
+
   ir.Primitive visitClosureSend(ast.Send node) {
     assert(isOpen);
     return giveup();
@@ -530,20 +618,145 @@
 
   ir.Primitive visitDynamicSend(ast.Send node) {
     assert(isOpen);
-    return giveup();
+    if (node.receiver == null || node.receiver.isSuper()) {
+      return giveup();
+    }
+    Selector selector = elements.getSelector(node);
+    ir.Primitive receiver = visit(node.receiver);
+    List arguments = node.arguments.toList(growable:false)
+                         .map(visit).toList(growable:false);
+    ir.Parameter v = new ir.Parameter(null);
+    ir.Continuation k = new ir.Continuation([v]);
+    ir.Expression invoke =
+        new ir.InvokeMethod(receiver, selector, k, arguments);
+    add(new ir.LetCont(k, invoke));
+    return v;
   }
 
   ir.Primitive visitGetterSend(ast.Send node) {
     assert(isOpen);
     Element element = elements[node];
-    if (!Elements.isLocal(element)) return giveup();
-    int index = variableIndex[element];
-    ir.Primitive value = assignedVars[index];
-    return value == null ? freeVars[index] : value;
+    if (Elements.isLocal(element)) {
+      int index = variableIndex[element];
+      ir.Primitive value = assignedVars[index];
+      return value == null ? freeVars[index] : value;
+    } else if (Elements.isInstanceField(element)) {
+      ir.Primitive receiver = visit(node.receiver);
+      ir.Parameter v = new ir.Parameter(null);
+      ir.Continuation k = new ir.Continuation([v]);
+      Selector selector = elements.getSelector(node);
+      assert(selector.kind == SelectorKind.GETTER);
+      ir.InvokeMethod invoke = new ir.InvokeMethod(receiver, selector, k, []);
+      add(new ir.LetCont(k, invoke));
+      return v;
+    } else {
+      // TODO(asgerf): static and top-level
+      // NOTE: Index-getters are OperatorSends, not GetterSends
+      return giveup();
+    }
+  }
+
+  ir.Primitive translateLogicalOperator(ast.Operator op,
+                                        ast.Expression left,
+                                        ast.Expression right) {
+    // e0 && e1 is translated as if e0 ? (e1 == true) : false.
+    // e0 || e1 is translated as if e0 ? true : (e1 == true).
+    // The translation must convert both e0 and e1 to booleans and handle
+    // local variable assignments in e1.
+
+    ir.Primitive leftValue = visit(left);
+    IrBuilder rightBuilder = new IrBuilder.delimited(this);
+    ir.Primitive rightValue = rightBuilder.visit(right);
+    // A dummy empty target for the branch on the left subexpression branch.
+    // This enables using the same infrastructure for continuation arguments
+    // and free variable capture as in visitIf and visitConditional.  It will
+    // hold an invocation of the join-point continuation.  It cannot have
+    // assigned variables but may have free variables as arguments to the
+    // join-point continuation.
+    IrBuilder emptyBuilder = new IrBuilder.delimited(this);
+
+    List <ir.Primitive> leftArguments = <ir.Primitive>[];
+    List <ir.Primitive> rightArguments = <ir.Primitive>[];
+    List <ir.Parameter> parameters =
+        createJoinParameters(emptyBuilder, leftArguments,
+                             rightBuilder, rightArguments);
+
+    // Add a continuation parameter for the result of the expression.
+    ir.Parameter resultParameter = new ir.Parameter(null);
+    parameters.add(resultParameter);
+    // If we don't evaluate the right subexpression, the value of the whole
+    // expression is this constant.
+    ir.Constant leftBool =
+        new ir.Constant(constantSystem.createBool(op.source == '||'));
+    leftArguments.add(leftBool);
+    // If we do evaluate the right subexpression, the value of the expression
+    // is a true or false constant.
+    ir.Constant rightTrue = new ir.Constant(constantSystem.createBool(true));
+    ir.Constant rightFalse = new ir.Constant(constantSystem.createBool(false));
+
+    // Wire up two continuations for the left subexpression, two continuations
+    // for the right subexpression, and a three-way join continuation.
+    ir.Continuation joinContinuation = new ir.Continuation(parameters);
+    ir.Continuation leftTrueContinuation = new ir.Continuation([]);
+    ir.Continuation leftFalseContinuation = new ir.Continuation([]);
+    ir.Continuation rightTrueContinuation = new ir.Continuation([]);
+    ir.Continuation rightFalseContinuation = new ir.Continuation([]);
+    // If right is true, invoke the join with a true value for the result.
+    rightArguments.add(rightTrue);
+    rightTrueContinuation.body = new ir.LetPrim(rightTrue)
+        ..plug(new ir.InvokeContinuation(joinContinuation, rightArguments));
+    // And if false, invoke the join continuation with a false value.  The
+    // argument list of definitions can be mutated, because fresh Reference
+    // objects are allocated by the InvokeContinuation constructor.
+    rightArguments[rightArguments.length - 1] = rightFalse;
+    rightFalseContinuation.body = new ir.LetPrim(rightFalse)
+        ..plug(new ir.InvokeContinuation(joinContinuation, rightArguments));
+    // The right subexpression has two continuations.
+    rightBuilder.add(
+        new ir.LetCont(rightTrueContinuation,
+            new ir.LetCont(rightFalseContinuation,
+                new ir.Branch(new ir.IsTrue(rightValue),
+                              rightTrueContinuation,
+                              rightFalseContinuation))));
+    // Depending on the operator, the left subexpression's continuations are
+    // either the right subexpression or an invocation of the join-point
+    // continuation.
+    if (op.source == '&&') {
+      leftTrueContinuation.body = rightBuilder.root;
+      leftFalseContinuation.body = new ir.LetPrim(leftBool)
+          ..plug(new ir.InvokeContinuation(joinContinuation, leftArguments));
+    } else {
+      leftTrueContinuation.body = new ir.LetPrim(leftBool)
+          ..plug(new ir.InvokeContinuation(joinContinuation, leftArguments));
+      leftFalseContinuation.body = rightBuilder.root;
+    }
+
+    // Capture free local variable occurrences in the right subexpression
+    // and update the reaching definitions for the join-point continuation
+    // body to include the continuation's parameters.
+    captureFreeVariables(rightBuilder, emptyBuilder, parameters);
+
+    add(new ir.LetCont(joinContinuation,
+            new ir.LetCont(leftTrueContinuation,
+                new ir.LetCont(leftFalseContinuation,
+                    new ir.Branch(new ir.IsTrue(leftValue),
+                                  leftTrueContinuation,
+                                  leftFalseContinuation)))));
+    return resultParameter;
   }
 
   ir.Primitive visitOperatorSend(ast.Send node) {
     assert(isOpen);
+    ast.Operator op = node.selector;
+    if (isUserDefinableOperator(op.source)) {
+      return visitDynamicSend(node);
+    }
+    if (op.source == '&&' || op.source == '||') {
+      assert(node.receiver != null);
+      assert(!node.arguments.isEmpty);
+      assert(node.arguments.tail.isEmpty);
+      return translateLogicalOperator(op, node.receiver, node.arguments.head);
+    }
     return giveup();
   }
 
@@ -553,35 +766,27 @@
     assert(isOpen);
     Element element = elements[node];
     // TODO(lry): support static fields. (separate IR instruction?)
-    if (element.isField() || element.isGetter()) return giveup();
+    if (element.isField || element.isGetter) return giveup();
     // TODO(kmillikin): support static setters.
-    if (element.isSetter()) return giveup();
+    if (element.isSetter) return giveup();
     // TODO(lry): support constructors / factory calls.
-    if (element.isConstructor()) return giveup();
+    if (element.isConstructor) return giveup();
     // TODO(lry): support foreign functions.
     if (element.isForeign(compiler)) return giveup();
     // TODO(lry): for elements that could not be resolved emit code to throw a
     // [NoSuchMethodError].
-    if (element.isErroneous()) return giveup();
+    if (element.isErroneous) return giveup();
     // TODO(lry): generate IR for object identicality.
     if (element == compiler.identicalFunction) giveup();
 
     Selector selector = elements.getSelector(node);
-    // TODO(lry): support named arguments
-    if (selector.namedArgumentCount != 0) return giveup();
 
     // TODO(kmillikin): support a receiver: A.m().
     if (node.receiver != null) return giveup();
 
-    List arguments = [];
     // TODO(lry): support default arguments, need support for locals.
-    bool succeeded = selector.addArgumentsToList(
-        node.arguments, arguments, element.implementation, visit,
-        (node) => giveup(), compiler);
-    if (!succeeded) {
-      // TODO(lry): generate code to throw a [WrongArgumentCountError].
-      return giveup();
-    }
+    List<ir.Definition> arguments = node.arguments.toList(growable:false)
+                                       .map(visit).toList(growable:false);
     ir.Parameter v = new ir.Parameter(null);
     ir.Continuation k = new ir.Continuation([v]);
     ir.Expression invoke =
@@ -603,14 +808,90 @@
   ir.Primitive visitSendSet(ast.SendSet node) {
     assert(isOpen);
     Element element = elements[node];
-    if (!Elements.isLocal(element)) return giveup();
     if (node.assignmentOperator.source != '=') return giveup();
-    // Exactly one argument expected for a simple assignment.
-    assert(!node.arguments.isEmpty);
-    assert(node.arguments.tail.isEmpty);
-    ir.Primitive result = visit(node.arguments.head);
-    assignedVars[variableIndex[element]] = result;
-    return result;
+    if (Elements.isLocal(element)) {
+      // Exactly one argument expected for a simple assignment.
+      assert(!node.arguments.isEmpty);
+      assert(node.arguments.tail.isEmpty);
+      ir.Primitive result = visit(node.arguments.head);
+      assignedVars[variableIndex[element]] = result;
+      return result;
+    } else if (Elements.isStaticOrTopLevel(element)) {
+      // TODO(asgerf): static and top-level
+      return giveup();
+    } else if (node.receiver == null) {
+      // Nodes that fall in this case:
+      // - Unresolved top-level
+      // - Assignment to final variable (will not be resolved)
+      return giveup();
+    } else {
+      // Setter or index-setter invocation
+      assert(node.receiver != null);
+      if (node.receiver.isSuper()) return giveup();
+
+      ir.Primitive receiver = visit(node.receiver);
+      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> args = node.arguments.toList(growable:false)
+                                     .map(visit).toList(growable:false);
+      ir.InvokeMethod invoke = new ir.InvokeMethod(receiver, selector, k, args);
+      add(new ir.LetCont(k, invoke));
+      return args.last;
+    }
+  }
+
+  ir.Primitive visitNewExpression(ast.NewExpression node) {
+    if (node.isConst) {
+      return giveup(); // TODO(asgerf): Const constructor call.
+    }
+    FunctionElement element = elements[node.send];
+    if (Elements.isUnresolved(element)) {
+      return giveup();
+    }
+    ast.Node selector = node.send.selector;
+    GenericType type = elements.getType(node);
+    ir.Parameter v = new ir.Parameter(null);
+    ir.Continuation k = new ir.Continuation([v]);
+    List<ir.Definition> args = node.send.arguments.toList(growable:false)
+                                        .map(visit).toList(growable:false);
+    ir.InvokeConstructor invoke = new ir.InvokeConstructor(
+        type,
+        element,
+        elements.getSelector(node.send),
+        k,
+        args);
+    add(new ir.LetCont(k, invoke));
+    return v;
+  }
+
+  ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) {
+    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;
+  }
+
+  ir.Primitive visitStringInterpolation(ast.StringInterpolation node) {
+    List<ir.Primitive> arguments = [];
+    arguments.add(visitLiteralString(node.string));
+    var it = node.parts.iterator;
+    while (it.moveNext()) {
+      ast.StringInterpolationPart part = it.current;
+      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;
   }
 
   static final String ABORT_IRNODE_BUILDER = "IrNode builder aborted";
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
index f2159de..4e99e50 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
@@ -8,9 +8,9 @@
 
 import '../dart2jslib.dart' as dart2js show Constant;
 import '../elements/elements.dart'
-    show FunctionElement, LibraryElement, ParameterElement;
-import 'ir_pickler.dart' show Pickler, IrConstantPool;
+    show FunctionElement, LibraryElement, ParameterElement, ClassElement;
 import '../universe/universe.dart' show Selector, SelectorKind;
+import '../dart_types.dart' show DartType, GenericType;
 
 abstract class Node {
   static int hashCount = 0;
@@ -99,8 +99,13 @@
   accept(Visitor visitor) => visitor.visitLetCont(this);
 }
 
+abstract class Invoke {
+  Selector get selector;
+  List<Reference> get arguments;
+}
+
 /// Invoke a static function in tail position.
-class InvokeStatic extends Expression {
+class InvokeStatic extends Expression implements Invoke {
   final FunctionElement target;
 
   /**
@@ -124,6 +129,75 @@
   accept(Visitor visitor) => visitor.visitInvokeStatic(this);
 }
 
+/// Invoke a method, operator, getter, setter, or index getter/setter in
+/// tail position.
+class InvokeMethod extends Expression implements Invoke {
+  final Reference receiver;
+  final Selector selector;
+  final Reference continuation;
+  final List<Reference> arguments;
+
+  InvokeMethod(Definition receiver,
+               this.selector,
+               Continuation cont,
+               List<Definition> args)
+      : receiver = new Reference(receiver),
+        continuation = new Reference(cont),
+        arguments = args.map((t) => new Reference(t)).toList(growable: false) {
+    assert(selector != null);
+    assert(selector.kind == SelectorKind.CALL ||
+           selector.kind == SelectorKind.OPERATOR ||
+           (selector.kind == SelectorKind.GETTER && arguments.isEmpty) ||
+           (selector.kind == SelectorKind.SETTER && arguments.length == 1) ||
+           (selector.kind == SelectorKind.INDEX && arguments.length == 1) ||
+           (selector.kind == SelectorKind.INDEX && arguments.length == 2));
+  }
+
+  accept(Visitor visitor) => visitor.visitInvokeMethod(this);
+}
+
+/// 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 FunctionElement target;
+  final Reference continuation;
+  final List<Reference> arguments;
+  final Selector selector;
+
+  /// The class being instantiated. This is the same as `target.enclosingClass`
+  /// and `type.element`.
+  ClassElement get targetClass => target.enclosingElement;
+
+  /// True if this is an invocation of a factory constructor.
+  bool get isFactory => target.isFactoryConstructor;
+
+  InvokeConstructor(this.type,
+                    this.target,
+                    this.selector,
+                    Continuation cont,
+                    List<Definition> args)
+      : continuation = new Reference(cont),
+        arguments = args.map((t) => new Reference(t)).toList(growable: false) {
+    assert(target.isConstructor);
+    assert(type.element == target.enclosingElement);
+  }
+
+  accept(Visitor visitor) => visitor.visitInvokeConstructor(this);
+}
+
+/// Invoke [toString] on each argument and concatenate the results.
+class ConcatenateStrings extends Expression {
+  final Reference continuation;
+  final List<Reference> arguments;
+
+  ConcatenateStrings(Continuation cont, List<Definition> args)
+      : continuation = new Reference(cont),
+        arguments = args.map((t) => new Reference(t)).toList(growable: false);
+
+  accept(Visitor visitor) => visitor.visitConcatenateStrings(this);
+}
+
 /// Invoke a continuation in tail position.
 class InvokeContinuation extends Expression {
   final Reference continuation;
@@ -199,10 +273,6 @@
 
   FunctionDefinition(this.returnContinuation, this.parameters, this.body);
 
-  List<int> pickle(IrConstantPool constantPool) {
-    return new Pickler(constantPool).pickle(this);
-  }
-
   accept(Visitor visitor) => visitor.visitFunctionDefinition(this);
 }
 
@@ -223,6 +293,9 @@
   T visitLetCont(LetCont node) => visitExpression(node);
   T visitInvokeStatic(InvokeStatic node) => visitExpression(node);
   T visitInvokeContinuation(InvokeContinuation node) => visitExpression(node);
+  T visitInvokeMethod(InvokeMethod node) => visitExpression(node);
+  T visitInvokeConstructor(InvokeConstructor node) => visitExpression(node);
+  T visitConcatenateStrings(ConcatenateStrings node) => visitExpression(node);
   T visitBranch(Branch node) => visitExpression(node);
 
   // Definitions.
@@ -282,13 +355,52 @@
     return '(LetCont ($cont$parameters) $contBody) $body';
   }
 
+  String formatArguments(Invoke node) {
+    int positionalArgumentCount = node.selector.positionalArgumentCount;
+    List<String> args = new List<String>();
+    args.addAll(node.arguments.getRange(0, positionalArgumentCount)
+        .map((v) => names[v.definition.toString()]));
+    for (int i = 0; i < node.selector.namedArgumentCount; ++i) {
+      String name = node.selector.namedArguments[i];
+      Definition arg = node.arguments[positionalArgumentCount + i].definition;
+      args.add("($name: $arg)");
+    }
+    return args.join(' ');
+  }
+
   String visitInvokeStatic(InvokeStatic node) {
     String name = node.target.name;
     String cont = names[node.continuation.definition];
-    String args = node.arguments.map((v) => names[v.definition]).join(' ');
+    String args = formatArguments(node);
     return '(InvokeStatic $name $cont $args)';
   }
 
+  String visitInvokeMethod(InvokeMethod node) {
+    String name = node.selector.name;
+    String rcv = names[node.receiver.definition];
+    String cont = names[node.continuation.definition];
+    String args = formatArguments(node);
+    return '(InvokeMethod $rcv $name $cont $args)';
+  }
+
+  String visitInvokeConstructor(InvokeConstructor node) {
+    String callName;
+    if (node.target.name.isEmpty) {
+      callName = '${node.type}';
+    } else {
+      callName = '${node.type}.${node.target.name}';
+    }
+    String cont = names[node.continuation.definition];
+    String args = formatArguments(node);
+    return '(InvokeConstructor $callName $cont $args)';
+  }
+
+  String visitConcatenateStrings(ConcatenateStrings node) {
+    String cont = names[node.continuation.definition];
+    String args = node.arguments.map((v) => names[v.definition]).join(' ');
+    return '(ConcatenateStrings $cont $args)';
+  }
+
   String visitInvokeContinuation(InvokeContinuation node) {
     String cont = names[node.continuation.definition];
     String args = node.arguments.map((v) => names[v.definition]).join(' ');
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_pickler.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_pickler.dart
deleted file mode 100644
index 563b6b9..0000000
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_pickler.dart
+++ /dev/null
@@ -1,476 +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.
-
-library dart2js.ir_pickler;
-
-import 'ir_nodes.dart' as ir;
-import '../dart2jslib.dart' show
-    Constant, FalseConstant, TrueConstant, IntConstant, DoubleConstant,
-    StringConstant, NullConstant, ListConstant, MapConstant,
-    InterceptorConstant, DummyConstant, FunctionConstant, TypeConstant,
-    ConstructedConstant,
-    ConstantVisitor, ConstantSystem,
-    Compiler, NO_LOCATION_SPANNABLE;
-import 'dart:typed_data' show ByteData, Endianness, Uint8List;
-import 'dart:convert' show UTF8;
-import '../tree/tree.dart' as ast show
-    DartString, LiteralDartString, RawSourceDartString, EscapedSourceDartString,
-    ConsDartString;
-import '../elements/elements.dart' show
-    Element, LibraryElement, FunctionElement;
-import '../universe/universe.dart' show Selector, TypedSelector, SelectorKind;
-
-part 'ir_unpickler.dart';
-
-/* The int(entries) counts expression nodes, which might potentially be
- * referred to in a back reference.
- *
- * pickle   ::= int(entries) function
- *
- * function ::= int(parameter count) {element(parameter)} node(body)
- *
- * int      ::= see [writeInt] for number encoding
- *
- * string   ::= byte(STRING_ASCII) int(length) {byte(ascii)}
- *            | byte(STRING_UTF8) int(length) {byte(utf8)}
- *
- * node      ::= byte(NODE_CONSTANT) constant node(next)
- *             | byte(NODE_LET_CONT) int(parameter count) node(next) node(body)
- *             | byte(NODE_INVOKE_STATIC) element selector
- *                   reference(continuation) {reference(argument)}
- *             | byte(NODE_INVOKE_CONTINUATION) reference(continuation)
- *                   {reference(argument)}
- *
- * reference ::= int(indexDelta)
- *
- * constant   ::= byte(CONST_BOOL) byte(0 or 1)
- *              | byte(CONST_DOUBLE) byte{8}
- *              | byte(CONST_INT) int(value)
- *              | byte(CONST_STRING_LITERAL) string
- *              | byte(CONST_STRING_RAW) string int(length)
- *              | byte(CONST_STRING_ESCAPED) string int(length)
- *              | byte(CONST_STRING_CONS) constant(left) constant(right)
- *              | byte(CONST_NULL)
- *
- * selector   ::= byte(BACKREFERENCE) reference
- *              | byte(SELECTOR_UNTYPED) int(kind) string(name) element(library)
- *                    int(argumentsCount) int(namedArgumentsCount)
- *                    {string(parameterName)}
- *
- * element    ::= int(constantPoolIndex)
- */
-class Pickles {
-  static const int BACKREFERENCE = 1;
-
-  static const int STRING_ASCII = BACKREFERENCE + 1;
-  static const int STRING_UTF8  = STRING_ASCII + 1;
-
-  static const int FIRST_NODE_TAG           = STRING_UTF8 + 1;
-  static const int NODE_CONSTANT            = FIRST_NODE_TAG;
-  static const int NODE_IS_TRUE             = NODE_CONSTANT + 1;
-  static const int NODE_LET_CONT            = NODE_IS_TRUE + 1;
-  static const int NODE_INVOKE_STATIC       = NODE_LET_CONT + 1;
-  static const int NODE_INVOKE_CONTINUATION = NODE_INVOKE_STATIC + 1;
-  static const int NODE_BRANCH              = NODE_INVOKE_CONTINUATION + 1;
-  static const int LAST_NODE_TAG            = NODE_BRANCH;
-
-  static const int FIRST_CONST_TAG      = LAST_NODE_TAG + 1;
-  static const int CONST_BOOL           = FIRST_CONST_TAG;
-  static const int CONST_INT            = CONST_BOOL + 1;
-  static const int CONST_DOUBLE         = CONST_INT + 1;
-  static const int CONST_STRING_LITERAL = CONST_DOUBLE + 1;
-  static const int CONST_STRING_RAW     = CONST_STRING_LITERAL + 1;
-  static const int CONST_STRING_ESCAPED = CONST_STRING_RAW + 1;
-  static const int CONST_STRING_CONS    = CONST_STRING_ESCAPED + 1;
-  static const int CONST_NULL           = CONST_STRING_CONS + 1;
-  static const int LAST_CONST_TAG       = CONST_NULL;
-
-  static const int FIRST_SELECTOR_TAG = LAST_CONST_TAG + 1;
-  static const int SELECTOR_UNTYPED   = FIRST_SELECTOR_TAG;
-  static const int LAST_SELECTOR_TAG  = SELECTOR_UNTYPED;
-
-  static const int LAST_TAG = LAST_SELECTOR_TAG;
-
-  static final List<SelectorKind> selectorKindFromId = _selectorKindFromId();
-
-  static List<SelectorKind> _selectorKindFromId() {
-    List<SelectorKind> result = <SelectorKind>[
-        SelectorKind.GETTER,
-        SelectorKind.SETTER,
-        SelectorKind.CALL,
-        SelectorKind.OPERATOR,
-        SelectorKind.INDEX];
-    for (int i = 0; i < result.length; i++) {
-      assert(result[i].hashCode == i);
-    }
-    return result;
-  }
-}
-
-class IrConstantPool {
-  static Map<LibraryElement, IrConstantPool> _constantPools =
-      <LibraryElement, IrConstantPool>{};
-
-  static IrConstantPool forLibrary(LibraryElement library) {
-    return _constantPools.putIfAbsent(library, () => new IrConstantPool());
-  }
-
-  /**
-   * The entries of the constant pool. Method [add] ensures that an object
-   * is only added once to this list.
-   */
-  List<Object> entries = <Object>[];
-
-  /**
-   * This map is the inverse of [entries], it stores the index of each object.
-   */
-  Map<Object, int> entryIndex = <Object, int>{};
-
-  int add(Object o) {
-    return entryIndex.putIfAbsent(o, () {
-      entries.add(o);
-      return entries.length - 1;
-    });
-  }
-
-  Object get(int index) => entries[index];
-}
-
-/**
- * The [Pickler] serializes [ir.Node]s to a byte array.
- */
-class Pickler extends ir.Visitor {
-  ConstantPickler constantPickler;
-
-  IrConstantPool constantPool;
-
-  Pickler(this.constantPool) {
-    assert(Pickles.LAST_TAG <= 0xff);
-    constantPickler = new ConstantPickler(this);
-  }
-
-  static final int INITIAL_SIZE = 8;
-  static final int MAX_GROW_RATE = 4096;
-
-  List<int> data;
-
-  /** Offset of the next byte that will be written. */
-  int offset;
-
-  /** Stores the index for emitted entries that might be back-referenced. */
-  Map<Object, int> emitted;
-
-  /** A counter for entries in the [emitted] map. */
-  int index;
-
-  /**
-   * This buffer is used in [writeConstDouble] to obtain a byte representation
-   * for doubles.
-   */
-  ByteData doubleData = new ByteData(8);
-
-  List<int> pickle(ir.FunctionDefinition function) {
-    data = new Uint8List(INITIAL_SIZE);
-    offset = 0;
-    emitted = <Object, int>{};
-    index = 0;
-    visit(function);
-
-    int sizeOffset = offset;
-    writeInt(emitted.length);
-    int sizeBytes = offset - sizeOffset;
-
-    // The array is longer than necessary, create a copy with the actual size.
-    Uint8List result = new Uint8List(offset);
-    // Emit the number or entries in the beginning.
-    for (int i = 0, j = sizeOffset; i < sizeBytes; i++, j++) {
-      result[i] = data[j];
-    }
-    for (int i = sizeBytes, j = 0; i < offset; i++, j++) {
-      result[i] = data[j];
-    }
-    return result;
-  }
-
-  void resize(int newSize) {
-    Uint8List newData = new Uint8List(newSize);
-    for (int i = 0; i < data.length; i++) {
-      newData[i] = data[i];
-    }
-    data = newData;
-  }
-
-  void ensureCapacity() {
-    // (offset == data.length-1) is still OK, the byte at [offset] has not yet
-    // been written.
-    int size = data.length;
-    if (offset < size) return;
-    if (size > MAX_GROW_RATE) {
-      size += MAX_GROW_RATE;
-    } else {
-      size *= 2;
-    }
-    resize(size);
-  }
-
-  static isByte(int byte) => 0 <= byte && byte <= 0xff;
-
-  void writeByte(int byte) {
-    assert(isByte(byte));
-    ensureCapacity();
-    data[offset++] = byte;
-  }
-
-  /**
-   * Writes integers to the buffer.
-   *
-   * The least significant bit of the serialized data encodes the sign. Each
-   * byte contains 7 bits of data and one bit indicating if it is the last byte
-   * of the number.
-   */
-  void writeInt(int n) {
-    bool isNegative = n < 0;
-    n = isNegative ? -n : n;
-    // Least significant bit is the sign.
-    int bits = (n << 1) | (isNegative ? 1 : 0);
-    do {
-      int next = bits & 0x7f;
-      bits >>= 7;
-      bool hasMore = bits != 0;
-      next = (next << 1) | (hasMore ? 1 : 0);
-      writeByte(next);
-    } while (bits != 0);
-  }
-
-  void writeString(String s) {
-    int startOffset = offset;
-    writeByte(Pickles.STRING_ASCII);
-    writeInt(s.length);
-    for (int i = 0; i < s.length; i++) {
-      int c = s.codeUnitAt(i);
-      if (c < 0x80) {
-        writeByte(c);
-      } else {
-        // Strings with non-ascii characters are encoded using UTF-8.
-        writeUtf8String(s, startOffset);
-        return;
-      }
-    }
-  }
-
-  void writeUtf8String(String s, int startOffset) {
-    offset = startOffset;
-    writeByte(Pickles.STRING_UTF8);
-    List<int> bytes = UTF8.encode(s);
-    writeInt(bytes.length);
-    for (int i = 0; i < bytes.length; i++) {
-      writeByte(bytes[i]);
-    }
-  }
-
-  /**
-   * This function records [entry] in the [emitted] table. It needs to be
-   * invoked when pickling an object which might later on be used in a back
-   * reference, for example expression nodes or selectors.
-   */
-  void recordForBackReference(Object entry) {
-    assert(emitted[entry] == null);
-    emitted[entry] = index++;
-  }
-
-  void writeBackReference(Object entry) {
-    int entryIndex = emitted[entry];
-    writeInt(index - entryIndex);
-  }
-
-  void writeBackReferenceList(int length, Iterable entries) {
-    writeInt(length);
-    for (var x in entries) {
-      writeBackReference(x);
-    }
-  }
-
-  void writeConstBool(bool b) {
-    writeByte(Pickles.CONST_BOOL);
-    writeByte(b ? 1 : 0);
-  }
-
-  void writeConstInt(int n) {
-    writeByte(Pickles.CONST_INT);
-    writeInt(n);
-  }
-
-  void writeConstDouble(double d) {
-    writeByte(Pickles.CONST_DOUBLE);
-    doubleData.setFloat64(0, d, Endianness.BIG_ENDIAN);
-    for (int i = 0; i < 8; i++) {
-      writeByte(doubleData.getUint8(i));
-    }
-  }
-
-  void writeDartString(ast.DartString s) {
-    if (s is ast.LiteralDartString) {
-      writeByte(Pickles.CONST_STRING_LITERAL);
-      writeString(s.string);
-    } else if (s is ast.RawSourceDartString) {
-      writeByte(Pickles.CONST_STRING_RAW);
-      writeString(s.source);
-      writeInt(s.length);
-    } else if (s is ast.EscapedSourceDartString) {
-      writeByte(Pickles.CONST_STRING_ESCAPED);
-      writeString(s.source);
-      writeInt(s.length);
-    } else if (s is ast.ConsDartString) {
-      writeByte(Pickles.CONST_STRING_CONS);
-      writeDartString(s.left);
-      writeDartString(s.right);
-    } else {
-      throw "Unexpected DartString: $s";
-    }
-  }
-
-  void writeConstNull() {
-    writeByte(Pickles.CONST_NULL);
-  }
-
-  void writeElement(Element element) {
-    writeInt(constantPool.add(element));
-  }
-
-  void writeSelector(Selector selector) {
-    if (emitted.containsKey(selector)) {
-      writeByte(Pickles.BACKREFERENCE);
-      writeBackReference(selector);
-    } else {
-      recordForBackReference(selector);
-      assert(selector is !TypedSelector);
-      writeByte(Pickles.SELECTOR_UNTYPED);
-      writeInt(selector.kind.hashCode);
-      writeString(selector.name);
-      writeElement(selector.library);
-      writeInt(selector.argumentCount);
-      int namedArgumentsCount = selector.namedArguments.length;
-      writeInt(namedArgumentsCount);
-      for (int i = 0; i < namedArgumentsCount; i++) {
-        writeString(selector.namedArguments[i]);
-      }
-    }
-  }
-
-  void visitFunctionDefinition(ir.FunctionDefinition node) {
-    // The continuation parameter is bound in the body.
-    recordForBackReference(node.returnContinuation);
-    writeInt(node.parameters.length);
-    for (var parameter in node.parameters) {
-      recordForBackReference(parameter);
-      writeElement(parameter.element);
-    }
-    visit(node.body);
-  }
-
-  void visitLetPrim(ir.LetPrim node) {
-    visit(node.primitive);
-    // The right-hand side is bound in the body.
-    recordForBackReference(node.primitive);
-    visit(node.body);
-  }
-
-  void visitLetCont(ir.LetCont node) {
-    // There are two choices of which expression tree to write first---the
-    // continuation body or the LetCont body.  The unpickler will unpickle the
-    // the first recursively and the second iteratively.  Since the hole in
-    // LetCont contexts is in the continuation body, the continuation should be
-    // written second.
-    writeByte(Pickles.NODE_LET_CONT);
-    writeInt(node.continuation.parameters.length);
-    // The continuation is bound in the body.
-    recordForBackReference(node.continuation);
-    visit(node.body);
-    // The continuation parameters are bound in the continuation's body.
-    node.continuation.parameters.forEach(recordForBackReference);
-    visit(node.continuation.body);
-  }
-
-  void visitInvokeStatic(ir.InvokeStatic node) {
-    writeByte(Pickles.NODE_INVOKE_STATIC);
-    writeElement(node.target);
-    writeSelector(node.selector);
-    // TODO(lry): compact encoding when the arity of the selector and the
-    // arguments list are the same
-    writeBackReference(node.continuation.definition);
-    writeBackReferenceList(node.arguments.length,
-                           node.arguments.map((a) => a.definition));
-  }
-
-  void visitInvokeContinuation(ir.InvokeContinuation node) {
-    writeByte(Pickles.NODE_INVOKE_CONTINUATION);
-    writeBackReference(node.continuation.definition);
-    writeBackReferenceList(node.arguments.length,
-                           node.arguments.map((a) => a.definition));
-  }
-
-  void visitBranch(ir.Branch node) {
-    writeByte(Pickles.NODE_BRANCH);
-    visit(node.condition);
-    writeBackReference(node.trueContinuation.definition);
-    writeBackReference(node.falseContinuation.definition);
-  }
-
-  void visitConstant(ir.Constant node) {
-    writeByte(Pickles.NODE_CONSTANT);
-    node.value.accept(constantPickler);
-  }
-
-  void visitIsTrue(ir.IsTrue node) {
-    writeByte(Pickles.NODE_IS_TRUE);
-    writeBackReference(node.value.definition);
-  }
-
-  void visitNode(ir.Node node) {
-    throw "Unexpected $node in pickler.";
-  }
-}
-
-/**
- * A visitor for constants which writes the constant values to its [Pickler].
- */
-class ConstantPickler extends ConstantVisitor {
-
-  final Pickler pickler;
-  ConstantPickler(this.pickler);
-
-  void visitFalse(FalseConstant constant) {
-    pickler.writeConstBool(false);
-  }
-
-  void visitTrue(TrueConstant constant) {
-    pickler.writeConstBool(true);
-  }
-
-  void visitInt(IntConstant constant) {
-    pickler.writeConstInt(constant.value);
-  }
-
-  void visitDouble(DoubleConstant constant) {
-    pickler.writeConstDouble(constant.value);
-  }
-
-  void visitString(StringConstant constant) {
-    pickler.writeDartString(constant.value);
-  }
-
-  void visitNull(NullConstant constant) {
-    pickler.writeConstNull();
-  }
-
-  void visitList(ListConstant constant) => abort(constant);
-  void visitMap(MapConstant constant) => abort(constant);
-  void visitInterceptor(InterceptorConstant constant) => abort(constant);
-  void visitDummy(DummyConstant constant) => abort(constant);
-  void visitFunction(FunctionConstant constant) => abort(constant);
-  void visitType(TypeConstant constant) => abort(constant);
-  void visitConstructed(ConstructedConstant constant) => abort(constant);
-
-  void abort(Constant value) => throw "Can not pickle constant $value";
-}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
index f3864d1..7138191 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
@@ -1,3 +1,7 @@
+// 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 dart2js.ir_tracer;
 
 import 'dart:async' show EventSink;
@@ -93,6 +97,36 @@
     printStmt(dummy, "InvokeStatic $callName ($args) $kont");
   }
 
+  visitInvokeMethod(ir.InvokeMethod node) {
+    String dummy = names.name(node);
+    String receiver = formatReference(node.receiver);
+    String callName = node.selector.name;
+    String args = node.arguments.map(formatReference).join(', ');
+    String kont = formatReference(node.continuation);
+    printStmt(dummy,
+        "InvokeMethod $receiver $callName ($args) $kont");
+  }
+
+  visitInvokeConstructor(ir.InvokeConstructor node) {
+    String dummy = names.name(node);
+    String callName;
+    if (node.target.name.isEmpty) {
+      callName = '${node.type}';
+    } else {
+      callName = '${node.type}.${node.target.name}';
+    }
+    String args = node.arguments.map(formatReference).join(', ');
+    String kont = formatReference(node.continuation);
+    printStmt(dummy, "InvokeConstructor $callName ($args) $kont");
+  }
+
+  visitConcatenateStrings(ir.ConcatenateStrings node) {
+    String dummy = names.name(node);
+    String args = node.arguments.map(formatReference).join(', ');
+    String kont = formatReference(node.continuation);
+    printStmt(dummy, "ConcatenateStrings ($args) $kont");
+  }
+
   visitInvokeContinuation(ir.InvokeContinuation node) {
     String dummy = names.name(node);
     String kont = formatReference(node.continuation);
@@ -195,7 +229,7 @@
 
 class BlockCollector extends ir.Visitor {
   Block entry;
-  final Map<ir.Continuation, Block> cont2block = <ir.Continuation, Block> {};
+  final Map<ir.Continuation, Block> cont2block = <ir.Continuation, Block>{};
   Block current_block;
 
   Names names;
@@ -231,6 +265,27 @@
     }
   }
 
+  visitInvokeMethod(ir.InvokeMethod exp) {
+    ir.Definition target = exp.continuation.definition;
+    if (target is ir.Continuation && target.body != null) {
+      current_block.addEdgeTo(getBlock(target));
+    }
+  }
+
+  visitInvokeConstructor(ir.InvokeConstructor exp) {
+    ir.Definition target = exp.continuation.definition;
+    if (target is ir.Continuation && target.body != null) {
+      current_block.addEdgeTo(getBlock(target));
+    }
+  }
+
+  visitConcatenateStrings(ir.ConcatenateStrings exp) {
+    ir.Definition target = exp.continuation.definition;
+    if (target is ir.Continuation && target.body != null) {
+      current_block.addEdgeTo(getBlock(target));
+    }
+  }
+
   visitInvokeContinuation(ir.InvokeContinuation exp) {
     ir.Definition target = exp.continuation.definition;
     if (target is ir.Continuation && target.body != null) {
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
deleted file mode 100644
index 3b29e65..0000000
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
+++ /dev/null
@@ -1,293 +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 dart2js.ir_pickler;
-
-class Unpickler {
-  final Compiler compiler;
-
-  final IrConstantPool constantPool;
-
-  Unpickler(this.compiler, this.constantPool);
-
-  List<int> data;
-
-  int offset;
-
-  /** For each entry index, the corresponding unpickled object. */
-  List<Object> unpickled;
-
-  /** Counter for entries in [unpickled]. */
-  int index;
-
-  /**
-   * This buffer is used in [readConstantValue] to reconstruct a double value
-   * from a sequence of bytes.
-   */
-  ByteData doubleData = new ByteData(8);
-
-  ConstantSystem get constantSystem => compiler.backend.constantSystem;
-
-  // A partially constructed expression is one that has a single 'hole' where
-  // there is an expression missing.  Just like the IR builder, the unpickler
-  // represents such an expression by its root and by the 'current' expression
-  // that immediately contains the hole.  If there is no hole (e.g., an
-  // expression in tail position has been seen), then current is null.
-  ir.Expression root;
-  ir.Expression current;
-
-  ir.FunctionDefinition unpickle(List<int> data) {
-    this.data = data;
-    offset = 0;
-    int numEntries = readInt();
-    unpickled = new List<Object>(numEntries);
-    index = 0;
-    root = current = null;
-    return readFunctionDefinition();
-  }
-
-  int readByte() {
-    return data[offset++];
-  }
-
-  int readInt() {
-    int result = 0;
-    int next;
-    for (int i = 0; true; i += 7) {
-      next = readByte();
-      result |= (next >> 1) << i;
-      if ((next & 1) == 0) break;
-    }
-    bool isNegative = (result & 1) == 1;
-    result >>= 1;
-    return isNegative ? -result : result;
-  }
-
-  String readString() {
-    int tag = readByte();
-    int length = readInt();
-    List<int> bytes = new Uint8List(length);
-    for (int i = 0; i < length; i++) {
-      bytes[i] = readByte();
-    }
-    if (tag == Pickles.STRING_ASCII) {
-      return new String.fromCharCodes(bytes);
-    } else if (tag == Pickles.STRING_UTF8) {
-      return UTF8.decode(bytes);
-    } else {
-      compiler.internalError(NO_LOCATION_SPANNABLE,
-                             "Unexpected string tag: $tag");
-      return null;
-    }
-  }
-
-  Element readElement() {
-    int elementIndex = readInt();
-    return constantPool.get(elementIndex);
-  }
-
-  Selector readSelector() {
-    int tag = readByte();
-    if (tag == Pickles.BACKREFERENCE) {
-      return readBackReference();
-    }
-    assert(tag == Pickles.SELECTOR_UNTYPED);
-    int entryIndex = index++;
-    SelectorKind kind = Pickles.selectorKindFromId[readInt()];
-    String name = readString();
-    Element library = readElement();
-    int argumentsCount = readInt();
-    int namedArgumentsCount = readInt();
-    List<String> namedArguments = new List<String>(namedArgumentsCount);
-    for (int i = 0; i < namedArgumentsCount; i++) {
-      namedArguments[i] = readString();
-    }
-    Selector result = new Selector(
-        kind, name, library, argumentsCount, namedArguments);
-    unpickled[entryIndex] = result;
-    return result;
-  }
-
-  void addExpression(ir.Expression expr) {
-    if (root == null) {
-      root = current = expr;
-    } else {
-      current = current.plug(expr);
-    }
-  }
-
-  // Read a single expression and plug it into the outer context.
-  ir.Expression readExpressionNode() {
-    int tag = readByte();
-    switch (tag) {
-      // Nontail-position expressions.
-      case Pickles.NODE_CONSTANT:
-        ir.Definition constant = readConstant();
-        unpickled[index++] = constant;
-        addExpression(new ir.LetPrim(constant));
-        break;
-      case Pickles.NODE_LET_CONT:
-        int parameterCount = readInt();
-        List<ir.Parameter> parameters = new List<ir.Parameter>.generate(
-            parameterCount, (i) => new ir.Parameter(null));
-        ir.Continuation continuation = new ir.Continuation(parameters);
-        unpickled[index++] = continuation;
-        ir.Expression body = readDelimitedExpressionNode();
-        parameters.forEach((p) => unpickled[index++] = p);
-        addExpression(new ir.LetCont(continuation, body));
-        break;
-
-      // Tail-position expressions.
-      case Pickles.NODE_INVOKE_STATIC:
-        addExpression(readInvokeStatic());
-        current = null;
-        break;
-      case Pickles.NODE_INVOKE_CONTINUATION:
-        addExpression(readInvokeContinuation());
-        current = null;
-        break;
-      case Pickles.NODE_BRANCH:
-        addExpression(readBranch());
-        current = null;
-        break;
-
-      default:
-        compiler.internalError(NO_LOCATION_SPANNABLE,
-                               "Unexpected expression entry tag: $tag");
-        break;
-    }
-  }
-
-  // Iteratively read expressions until an expression in a tail position
-  // (e.g., an invocation) is found.  Do not change the outer context.
-  ir.Expression readDelimitedExpressionNode() {
-    ir.Expression previous_root = root;
-    ir.Expression previous_current = current;
-    root = current = null;
-    do {
-      readExpressionNode();
-    } while (current != null);
-    ir.Expression result = root;
-    root = previous_root;
-    current = previous_current;
-    return result;
-  }
-
-  Object readBackReference() {
-    int indexDelta = readInt();
-    int entryIndex = index - indexDelta;
-    assert(unpickled[entryIndex] != null);
-    return unpickled[entryIndex];
-  }
-
-  List<ir.Definition> readBackReferenceList() {
-    int length = readInt();
-    List<ir.Definition> result = new List<ir.Definition>(length);
-    for (int i = 0; i < length; ++i) {
-      result[i] = readBackReference();
-    }
-    return result;
-  }
-
-  ir.FunctionDefinition readFunctionDefinition() {
-    // There is implicitly a return continuation which can be the target of
-    // back references.
-    ir.Continuation continuation = new ir.Continuation.retrn();
-    unpickled[index++] = continuation;
-
-    int parameterCount = readInt();
-    List<ir.Parameter> parameters = new List<ir.Parameter>.generate(
-        parameterCount,
-        (i) {
-          ir.Parameter parameter = new ir.Parameter(readElement());
-          unpickled[index++] = parameter;
-          return parameter;
-        });
-    ir.Expression body = readDelimitedExpressionNode();
-    return new ir.FunctionDefinition(continuation, parameters, body);
-  }
-
-  ir.Constant readConstant() {
-    Constant constant = readConstantValue();
-    return new ir.Constant(constant);
-  }
-
-  ir.InvokeStatic readInvokeStatic() {
-    FunctionElement functionElement = readElement();
-    Selector selector = readSelector();
-    ir.Continuation continuation = readBackReference();
-    List<ir.Definition> arguments = readBackReferenceList();
-    return new ir.InvokeStatic(functionElement, selector, continuation,
-                               arguments);
-  }
-
-  ir.InvokeContinuation readInvokeContinuation() {
-    ir.Continuation continuation = readBackReference();
-    List<ir.Definition> arguments = readBackReferenceList();
-    return new ir.InvokeContinuation(continuation, arguments);
-  }
-
-  ir.Branch readBranch() {
-    ir.Condition condition = readCondition();
-    ir.Continuation trueContinuation = readBackReference();
-    ir.Continuation falseContinuation = readBackReference();
-    return new ir.Branch(condition, trueContinuation, falseContinuation);
-  }
-
-  ir.Condition readCondition() {
-    int tag = readByte();
-    assert(tag == Pickles.NODE_IS_TRUE);
-    return readIsTrue();
-  }
-
-  ir.IsTrue readIsTrue() {
-    ir.Definition value = readBackReference();
-    return new ir.IsTrue(value);
-  }
-
-  Constant readConstantValue() {
-    int tag = readByte();
-    switch(tag) {
-      case Pickles.CONST_BOOL:
-        return constantSystem.createBool(readByte() == 1);
-      case Pickles.CONST_INT:
-        return constantSystem.createInt(readInt());
-      case Pickles.CONST_DOUBLE:
-        for (int i = 0; i < 8; i++) {
-          doubleData.setUint8(i, readByte());
-        }
-        double value = doubleData.getFloat64(0, Endianness.BIG_ENDIAN);
-        return constantSystem.createDouble(value);
-      case Pickles.CONST_STRING_LITERAL:
-      case Pickles.CONST_STRING_RAW:
-      case Pickles.CONST_STRING_ESCAPED:
-      case Pickles.CONST_STRING_CONS:
-        return constantSystem.createString(readDartString(tag));
-      case Pickles.CONST_NULL:
-        return constantSystem.createNull();
-      default:
-        compiler.internalError(NO_LOCATION_SPANNABLE,
-                               "Unexpected constant tag: $tag");
-        return null;
-    }
-  }
-
-  ast.DartString readDartString(int tag) {
-    switch(tag) {
-      case Pickles.CONST_STRING_LITERAL:
-        return new ast.LiteralDartString(readString());
-      case Pickles.CONST_STRING_RAW:
-        return new ast.RawSourceDartString(readString(), readInt());
-      case Pickles.CONST_STRING_ESCAPED:
-        return new ast.EscapedSourceDartString(readString(), readInt());
-      case Pickles.CONST_STRING_CONS:
-        return new ast.ConsDartString(
-            readDartString(readByte()), readDartString(readByte()));
-      default:
-        compiler.internalError(NO_LOCATION_SPANNABLE,
-                               "Unexpected dart string tag: $tag");
-        return null;
-    }
-  }
-}
diff --git a/sdk/lib/_internal/compiler/implementation/js/builder.dart b/sdk/lib/_internal/compiler/implementation/js/builder.dart
index ea316a7..11347fe 100644
--- a/sdk/lib/_internal/compiler/implementation/js/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/builder.dart
@@ -268,6 +268,16 @@
   }
 
   /**
+   * Creates a Statement template without caching the result.
+   */
+  Template uncachedStatementTemplate(String source) {
+    MiniJsParser parser = new MiniJsParser(source);
+    Statement statement = parser.statement();
+    return new Template(
+        source, statement, isExpression: false, forceCopy: false);
+  }
+
+  /**
    * Create an Expression template which has [ast] as the result.  This is used
    * to wrap a generated AST in a zero-argument Template so it can be passed to
    * context that expects a template.
diff --git a/sdk/lib/_internal/compiler/implementation/js/nodes.dart b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
index d19ae57..db260db 100644
--- a/sdk/lib/_internal/compiler/implementation/js/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
@@ -31,7 +31,6 @@
   T visitBlob(Blob node);
   T visitLiteralExpression(LiteralExpression node);
   T visitVariableDeclarationList(VariableDeclarationList node);
-  T visitSequence(Sequence node);
   T visitAssignment(Assignment node);
   T visitVariableInitialization(VariableInitialization node);
   T visitConditional(Conditional cond);
@@ -113,7 +112,6 @@
   T visitLiteralExpression(LiteralExpression node) => visitExpression(node);
   T visitVariableDeclarationList(VariableDeclarationList node)
       => visitExpression(node);
-  T visitSequence(Sequence node) => visitExpression(node);
   T visitAssignment(Assignment node) => visitExpression(node);
   T visitVariableInitialization(VariableInitialization node) {
     if (node.value != null) {
@@ -205,6 +203,8 @@
 
   VariableUse asVariableUse() => null;
 
+  bool get isCommaOperator => false;
+
   Statement toStatement() {
     throw new UnsupportedError('toStatement');
   }
@@ -601,22 +601,6 @@
   int get precedenceLevel => EXPRESSION;
 }
 
-class Sequence extends Expression {
-  final List<Expression> expressions;
-
-  Sequence(this.expressions);
-
-  accept(NodeVisitor visitor) => visitor.visitSequence(this);
-
-  void visitChildren(NodeVisitor visitor) {
-    for (Expression expr in expressions) expr.accept(visitor);
-  }
-
-  Sequence _clone() => new Sequence(expressions);
-
-  int get precedenceLevel => EXPRESSION;
-}
-
 class Assignment extends Expression {
   final Expression leftHandSide;
   final String op;         // Null, if the assignment is not compound.
@@ -716,6 +700,8 @@
     right.accept(visitor);
   }
 
+  bool get isCommaOperator => op == ',';
+
   int get precedenceLevel {
     // TODO(floitsch): switch to constant map.
     switch (op) {
diff --git a/sdk/lib/_internal/compiler/implementation/js/printer.dart b/sdk/lib/_internal/compiler/implementation/js/printer.dart
index 3f93d3a..c79e80e 100644
--- a/sdk/lib/_internal/compiler/implementation/js/printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/printer.dart
@@ -481,15 +481,6 @@
                         newInForInit: inForInit, newAtStatementBegin: false);
   }
 
-  visitSequence(Sequence sequence) {
-    // Note that we only require that the entries are expressions and not
-    // assignments. This means that nested sequences are not put into
-    // parenthesis.
-    visitCommaSeparated(sequence.expressions, EXPRESSION,
-                        newInForInit: false,
-                        newAtStatementBegin: atStatementBegin);
-  }
-
   visitAssignment(Assignment assignment) {
     visitNestedExpression(assignment.leftHandSide, LEFT_HAND_SIDE,
                           newInForInit: inForInit,
@@ -556,8 +547,9 @@
     bool leftSpace = true;   // left<HERE>op right
     switch (op) {
       case ',':
+        //  x, (y, z) <=> (x, y), z.
         leftPrecedenceRequirement = EXPRESSION;
-        rightPrecedenceRequirement = LOGICAL_OR;
+        rightPrecedenceRequirement = EXPRESSION;
         leftSpace = false;
         break;
       case "||":
diff --git a/sdk/lib/_internal/compiler/implementation/js/template.dart b/sdk/lib/_internal/compiler/implementation/js/template.dart
index f223691..6ac0024 100644
--- a/sdk/lib/_internal/compiler/implementation/js/template.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/template.dart
@@ -181,7 +181,7 @@
         Expression toExpression(item) {
           if (item is Expression) return item;
           if (item is String) return convertStringToVariableUse(item);
-          error('Interpolated value #$position is not '
+          return error('Interpolated value #$position is not '
               'an Expression or List of Expressions: $value');
         }
         if (value is Iterable) return value.map(toExpression);
@@ -196,8 +196,7 @@
     return (arguments) {
       var value = arguments[position];
       if (value is Literal) return value;
-      error('Interpolated value #$position is not a Literal: '
-          '$value  (${value.runtimeType})');
+      error('Interpolated value #$position is not a Literal: $value');
     };
   }
 
@@ -210,7 +209,7 @@
         if (item is Parameter) return item;
         if (item is String) return new Parameter(item);
         error('Interpolated value #$position is not a Parameter or '
-            'List of Parameters: $value  (a ${value.runtimeType})');
+            'List of Parameters: $value');
       }
       if (value is Iterable) return value.map(toParameter);
       return toParameter(value);
@@ -383,7 +382,7 @@
   }
 
   TODO(String name) {
-    throw new UnimplementedError('${this.runtimeType}.$name');
+    throw new UnimplementedError('$this.$name');
   }
 
   Instantiator visitWhile(While node) => TODO('visitWhile');
@@ -454,8 +453,6 @@
     };
   }
 
-  Instantiator visitSequence(Sequence node) => TODO('visitSequence');
-
   Instantiator visitAssignment(Assignment node) {
     Instantiator makeLeftHandSide = visit(node.leftHandSide);
     String op = node.op;
@@ -498,6 +495,8 @@
     Iterable<Instantiator> argumentMakers =
         node.arguments.map(visitSplayableExpression).toList();
 
+    // TODO(sra): Avoid copying call arguments if no interpolation or forced
+    // copying.
     return (arguments) {
       Node target = makeTarget(arguments);
       List<Expression> callArguments = <Expression>[];
@@ -509,7 +508,7 @@
           callArguments.add(result);
         }
       }
-      return finish(target, callArguments);
+      return finish(target, callArguments.toList(growable: false));
     };
   }
 
@@ -591,7 +590,7 @@
 
   Instantiator visitArrayInitializer(ArrayInitializer node) {
     // Assume array has no missing elements.
-    // TODO(sra): Splicing?
+    // TODO(sra): Implement splicing?
     List<Instantiator> elementMakers = node.elements
         .map((ArrayElement element) => visit(element.value))
         .toList();
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index cb0912f..4f1af2b 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -101,8 +101,8 @@
   ClassElement mapLiteralClass;
   ClassElement constMapLiteralClass;
   ClassElement typeVariableClass;
-  Element mapLiteralConstructor;
-  Element mapLiteralConstructorEmpty;
+  ConstructorElement mapLiteralConstructor;
+  ConstructorElement mapLiteralConstructorEmpty;
 
   ClassElement noSideEffectsClass;
   ClassElement noThrowsClass;
@@ -322,22 +322,22 @@
   }
 
   bool usedByBackend(Element element) {
-    if (element.isParameter()
-        || element.isFieldParameter()
-        || element.isField()) {
+    if (element.isParameter
+        || element.isFieldParameter
+        || element.isField) {
       if (usedByBackend(element.enclosingElement)) return true;
     }
     return helpersUsed.contains(element.declaration);
   }
 
   bool invokedReflectively(Element element) {
-    if (element.isParameter() || element.isFieldParameter()) {
+    if (element.isParameter || element.isFieldParameter) {
       if (invokedReflectively(element.enclosingElement)) return true;
     }
 
-    if (element.isField()) {
+    if (element.isField) {
       if (Elements.isStaticOrTopLevel(element)
-          && (element.modifiers.isFinal() || element.modifiers.isConst())) {
+          && (element.isFinal || element.isConst)) {
         return false;
       }
     }
@@ -368,20 +368,20 @@
   }
 
   bool isInterceptedMethod(Element element) {
-    if (!element.isInstanceMember()) return false;
-    if (element.isGenerativeConstructorBody()) {
-      return Elements.isNativeOrExtendsNative(element.getEnclosingClass());
+    if (!element.isInstanceMember) return false;
+    if (element.isGenerativeConstructorBody) {
+      return Elements.isNativeOrExtendsNative(element.enclosingClass);
     }
     return interceptedElements[element.name] != null;
   }
 
   bool fieldHasInterceptedGetter(Element element) {
-    assert(element.isField());
+    assert(element.isField);
     return interceptedElements[element.name] != null;
   }
 
   bool fieldHasInterceptedSetter(Element element) {
-    assert(element.isField());
+    assert(element.isField);
     return interceptedElements[element.name] != null;
   }
 
@@ -407,7 +407,7 @@
           return elements
               .where((element) =>
                   classesMixedIntoInterceptedClasses.contains(
-                      element.getEnclosingClass()))
+                      element.enclosingClass))
               .toSet();
         });
 
@@ -431,7 +431,7 @@
       // determine if the given selector applies to them.
       Set<ClassElement> result = new Set<ClassElement>();
       for (Element element in intercepted) {
-        ClassElement classElement = element.getEnclosingClass();
+        ClassElement classElement = element.enclosingClass;
         if (Elements.isNativeOrExtendsNative(classElement)
             || interceptedClasses.contains(classElement)) {
           result.add(classElement);
@@ -466,7 +466,7 @@
 
   bool operatorEqHandlesNullArgument(FunctionElement operatorEqfunction) {
     return specialOperatorEqClasses.contains(
-        operatorEqfunction.getEnclosingClass());
+        operatorEqfunction.enclosingClass);
   }
 
   void initializeHelperClasses() {
@@ -528,7 +528,7 @@
     jsIndexableClass.ensureResolved(compiler);
     jsIndexableLength = compiler.lookupElementIn(
         jsIndexableClass, 'length');
-    if (jsIndexableLength != null && jsIndexableLength.isAbstractField()) {
+    if (jsIndexableLength != null && jsIndexableLength.isAbstractField) {
       AbstractFieldElement element = jsIndexableLength;
       jsIndexableLength = element.getter;
     }
@@ -581,11 +581,11 @@
     if (interceptorClass == null) return;
     interceptorClass.ensureResolved(compiler);
     compiler.objectClass.forEachMember((_, Element member) {
-      if (member.isGenerativeConstructor()) return;
+      if (member.isGenerativeConstructor) return;
       Element interceptorMember = interceptorClass.lookupMember(member.name);
       // Interceptors must override all Object methods due to calling convention
       // differences.
-      assert(interceptorMember.getEnclosingClass() == interceptorClass);
+      assert(interceptorMember.enclosingClass == interceptorClass);
     });
   }
 
@@ -759,7 +759,7 @@
           ClassElement implementation = cls.patch != null ? cls.patch : cls;
           return implementation.lookupConstructor(
             new Selector.callConstructor(
-                name, mapLiteralClass.getLibrary(), arity),
+                name, mapLiteralClass.library, arity),
             (element) {
               compiler.internalError(mapLiteralClass,
                   "Map literal class $mapLiteralClass missing "
@@ -900,7 +900,7 @@
     // TODO(ahe): Might want to register [element] as an instantiated class
     // when reflection is used.  However, as long as we disable tree-shaking
     // eagerly it doesn't matter.
-    if (element.isTypedef()) {
+    if (element.isTypedef) {
       typedefTypeLiterals.add(element);
     }
     customElementsAnalysis.registerTypeLiteral(element, enqueuer);
@@ -1006,7 +1006,7 @@
       enqueueInResolution(
           compiler.findHelper('functionTypeTestMetaHelper'), elements);
     }
-    if (type.element.isNative()) {
+    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.
@@ -1094,7 +1094,7 @@
     // then the class of the type variable does too.
     ClassElement contextClass = Types.getClassContext(type);
     if (contextClass != null) {
-      assert(contextClass == enclosingElement.getEnclosingClass().declaration);
+      assert(contextClass == enclosingElement.enclosingClass.declaration);
       rti.registerRtiDependency(type.element, contextClass);
     }
   }
@@ -1110,7 +1110,7 @@
 
   bool isDefaultNoSuchMethodImplementation(Element element) {
     assert(element.name == Compiler.NO_SUCH_METHOD);
-    ClassElement classElement = element.getEnclosingClass();
+    ClassElement classElement = element.enclosingClass;
     return classElement == compiler.objectClass
         || classElement == jsInterceptorClass
         || classElement == jsNullClass;
@@ -1118,7 +1118,7 @@
 
   bool isDefaultEqualityImplementation(Element element) {
     assert(element.name == '==');
-    ClassElement classElement = element.getEnclosingClass();
+    ClassElement classElement = element.enclosingClass;
     return classElement == compiler.objectClass
         || classElement == jsInterceptorClass
         || classElement == jsNullClass;
@@ -1178,7 +1178,7 @@
     Element element = work.element;
     var kind = element.kind;
     if (kind == ElementKind.TYPEDEF) return;
-    if (element.isConstructor() && element.getEnclosingClass() == jsNullClass) {
+    if (element.isConstructor && element.enclosingClass == jsNullClass) {
       // Work around a problem compiling JSNull's constructor.
       return;
     }
@@ -1215,7 +1215,7 @@
 
   ClassElement defaultSuperclass(ClassElement element) {
     // Native classes inherit from Interceptor.
-    return element.isNative() ? jsInterceptorClass : compiler.objectClass;
+    return element.isNative ? jsInterceptorClass : compiler.objectClass;
   }
 
   /**
@@ -1321,7 +1321,7 @@
     // that it can be optimized by standard interceptor optimizations.
     nativeCheck = true;
 
-    if (type == compiler.types.voidType) {
+    if (type.isVoid) {
       assert(!typeCast); // Cannot cast to void.
       if (nativeCheckOnly) return null;
       return 'voidTypeCheck';
@@ -1586,7 +1586,7 @@
       mustRetainMetadata = true;
     } else if (element == getIsolateAffinityTagMarker) {
       needToInitializeIsolateAffinityTag = true;
-    } else if (element.isDeferredLoaderGetter()) {
+    } else if (element.isDeferredLoaderGetter) {
       // TODO(sigurdm): Create a function registerLoadLibraryAccess.
       if (compiler.loadLibraryFunction == null) {
         compiler.loadLibraryFunction =
@@ -1673,7 +1673,7 @@
     if (symbols != null) symbolsUsed.addAll(symbols);
     if (targets != null) {
       for (Element target in targets) {
-        if (target.isAbstractField()) {
+        if (target.isAbstractField) {
           AbstractFieldElement field = target;
           targetsUsed.add(field.getter);
           targetsUsed.add(field.setter);
@@ -1713,8 +1713,8 @@
     /// convenience.
     bool registerNameOf(Element element) {
       symbolsUsed.add(element.name);
-      if (element.isConstructor()) {
-        symbolsUsed.add(element.getEnclosingClass().name);
+      if (element.isConstructor) {
+        symbolsUsed.add(element.enclosingClass.name);
       }
       return true;
     }
@@ -1799,9 +1799,9 @@
 
     void addFieldsInContainer(ScopeContainerElement container) {
       container.forEachLocalMember((Element member) {
-        if (!member.isInstanceMember() && member.isField()) {
+        if (!member.isInstanceMember && member.isField) {
           staticFields.add(member);
-        } else if (member.isClass()) {
+        } else if (member.isClass) {
           addFieldsInContainer(member);
         }
       });
@@ -1809,9 +1809,9 @@
 
     for (Element target in targetsUsed) {
       if (target == null) continue;
-      if (target.isField()) {
+      if (target.isField) {
         staticFields.add(target);
-      } else if (target.isLibrary() || target.isClass()) {
+      } else if (target.isLibrary || target.isClass) {
         addFieldsInContainer(target);
       }
     }
@@ -1850,7 +1850,7 @@
   }
 
   void onElementResolved(Element element, TreeElements elements) {
-    LibraryElement library = element.getLibrary();
+    LibraryElement library = element.library;
     if (!library.isPlatformLibrary && !library.canUseNative) return;
     bool hasNoInline = false;
     bool hasNoThrows = false;
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
index d8e9245..aef2abb 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
@@ -4,14 +4,13 @@
 
 part of js_backend;
 
-class ConstantEmitter  {
+class ConstantEmitter {
   ConstantReferenceEmitter _referenceEmitter;
-  ConstantInitializerEmitter _initializerEmitter;
+  ConstantLiteralEmitter _literalEmitter;
 
   ConstantEmitter(Compiler compiler, Namer namer) {
-    _referenceEmitter = new ConstantReferenceEmitter(compiler, namer);
-    _initializerEmitter = new ConstantInitializerEmitter(
-        compiler, namer, _referenceEmitter);
+    _literalEmitter = new ConstantLiteralEmitter(compiler, namer, this);
+    _referenceEmitter = new ConstantReferenceEmitter(compiler, namer, this);
   }
 
   /**
@@ -24,18 +23,27 @@
   }
 
   /**
+   * Constructs a literal expression that evaluates to the constant. Uses a
+   * canonical name unless the constant can be emitted multiple times (as for
+   * numbers and strings).
+   */
+  jsAst.Expression literal(Constant constant) {
+    return _literalEmitter.generate(constant);
+  }
+
+  /**
    * Constructs an expression like [reference], but the expression is valid
    * during isolate initialization.
    */
   jsAst.Expression referenceInInitializationContext(Constant constant) {
-    return _referenceEmitter.generateInInitializationContext(constant);
+    return _referenceEmitter.generate(constant);
   }
 
   /**
    * Constructs an expression used to initialize a canonicalized constant.
    */
   jsAst.Expression initializationExpression(Constant constant) {
-    return _initializerEmitter.generate(constant);
+    return _literalEmitter.generate(constant);
   }
 }
 
@@ -47,13 +55,112 @@
   final Compiler compiler;
   final Namer namer;
 
-  ConstantReferenceEmitter(this.compiler, this.namer);
+  final ConstantEmitter constantEmitter;
+
+  ConstantReferenceEmitter(this.compiler, this.namer, this.constantEmitter);
 
   jsAst.Expression generate(Constant constant) {
     return _visit(constant);
   }
 
-  jsAst.Expression generateInInitializationContext(Constant constant) {
+  jsAst.Expression _visit(Constant constant) {
+    return constant.accept(this);
+  }
+
+  jsAst.Expression emitCanonicalVersion(Constant constant) {
+    String name = namer.constantName(constant);
+    return new jsAst.PropertyAccess.field(
+        new jsAst.VariableUse(namer.globalObjectForConstant(constant)), name);
+  }
+
+  jsAst.Expression literal(Constant constant) {
+      return constantEmitter.literal(constant);
+  }
+
+  jsAst.Expression visitFunction(FunctionConstant constant) {
+    return namer.isolateStaticClosureAccess(constant.element);
+  }
+
+  jsAst.Expression visitNull(NullConstant constant) {
+    return literal(constant);
+  }
+
+  jsAst.Expression visitInt(IntConstant constant) {
+    return literal(constant);
+  }
+
+  jsAst.Expression visitDouble(DoubleConstant constant) {
+    return literal(constant);
+  }
+
+  jsAst.Expression visitTrue(TrueConstant constant) {
+    return literal(constant);
+  }
+
+  jsAst.Expression visitFalse(FalseConstant constant) {
+    return literal(constant);
+  }
+
+  /**
+   * Write the contents of the quoted string to a [CodeBuffer] in
+   * a form that is valid as JavaScript string literal content.
+   * The string is assumed quoted by double quote characters.
+   */
+  jsAst.Expression visitString(StringConstant constant) {
+    // TODO(sra): If the string is long *and repeated* (and not on a hot path)
+    // then it should be assigned to a name.  We don't have reference counts (or
+    // profile information) here, so this is the wrong place.
+    return literal(constant);
+  }
+
+  jsAst.Expression visitList(ListConstant constant) {
+    return emitCanonicalVersion(constant);
+  }
+
+  jsAst.Expression visitMap(MapConstant constant) {
+    return emitCanonicalVersion(constant);
+  }
+
+  jsAst.Expression visitType(TypeConstant constant) {
+    return emitCanonicalVersion(constant);
+  }
+
+  jsAst.Expression visitConstructed(ConstructedConstant constant) {
+    return emitCanonicalVersion(constant);
+  }
+
+  jsAst.Expression visitInterceptor(InterceptorConstant constant) {
+    return emitCanonicalVersion(constant);
+  }
+
+  jsAst.Expression visitDummy(DummyConstant constant) {
+    return literal(constant);
+  }
+
+  jsAst.Expression visitDeferred(DeferredConstant constant) {
+    return emitCanonicalVersion(constant);
+  }
+}
+
+/**
+ * Visitor for generating JavaScript expressions that litterally represent
+ * [Constant]s. These can be used for inlining constants or in initializers.
+ * Do not use directly, use methods from [ConstantEmitter].
+ */
+class ConstantLiteralEmitter implements ConstantVisitor<jsAst.Expression> {
+
+  // Matches blank lines, comment lines and trailing comments that can't be part
+  // of a string.
+  static final RegExp COMMENT_RE =
+      new RegExp(r'''^ *(//.*)?\n|  *//[^''"\n]*$''' , multiLine: true);
+
+  final Compiler compiler;
+  final Namer namer;
+  final ConstantEmitter constantEmitter;
+
+  ConstantLiteralEmitter(this.compiler, this.namer, this.constantEmitter);
+
+  jsAst.Expression generate(Constant constant) {
     return _visit(constant);
   }
 
@@ -62,7 +169,9 @@
   }
 
   jsAst.Expression visitFunction(FunctionConstant constant) {
-    return namer.isolateStaticClosureAccess(constant.element);
+    compiler.internalError(NO_LOCATION_SPANNABLE,
+        "The function constant does not need specific JS code.");
+    return null;
   }
 
   jsAst.Expression visitNull(NullConstant constant) {
@@ -110,109 +219,16 @@
    * The string is assumed quoted by double quote characters.
    */
   jsAst.Expression visitString(StringConstant constant) {
-    // TODO(sra): If the string is long *and repeated* (and not on a hot path)
-    // then it should be assigned to a name.  We don't have reference counts (or
-    // profile information) here, so this is the wrong place.
     StringBuffer sb = new StringBuffer();
     writeJsonEscapedCharsOn(constant.value.slowToString(), sb);
     return new jsAst.LiteralString('"$sb"');
   }
 
-  jsAst.Expression emitCanonicalVersion(Constant constant) {
-    String name = namer.constantName(constant);
-    return new jsAst.PropertyAccess.field(
-        new jsAst.VariableUse(namer.globalObjectForConstant(constant)), name);
-  }
-
-  jsAst.Expression visitList(ListConstant constant) {
-    return emitCanonicalVersion(constant);
-  }
-
-  jsAst.Expression visitMap(MapConstant constant) {
-    return emitCanonicalVersion(constant);
-  }
-
-  jsAst.Expression visitType(TypeConstant constant) {
-    return emitCanonicalVersion(constant);
-  }
-
-  jsAst.Expression visitConstructed(ConstructedConstant constant) {
-    return emitCanonicalVersion(constant);
-  }
-
-  jsAst.Expression visitInterceptor(InterceptorConstant constant) {
-    return emitCanonicalVersion(constant);
-  }
-
-  jsAst.Expression visitDummy(DummyConstant constant) {
-    return new jsAst.LiteralNumber('0');
-  }
-}
-
-/**
- * Visitor for generating JavaScript expressions to initialize [Constant]s.
- * Do not use directly; use methods from [ConstantEmitter].
- */
-class ConstantInitializerEmitter implements ConstantVisitor<jsAst.Expression> {
-  final Compiler compiler;
-  final Namer namer;
-  final ConstantReferenceEmitter referenceEmitter;
-
-  // Matches blank lines, comment lines and trailing comments that can't be part
-  // of a string.
-  static final RegExp COMMENT_RE =
-      new RegExp(r'''^ *(//.*)?\n|  *//[^''"\n]*$''' , multiLine: true);
-
-  ConstantInitializerEmitter(this.compiler, this.namer, this.referenceEmitter);
-
-  jsAst.Expression generate(Constant constant) {
-    return _visit(constant);
-  }
-
-  jsAst.Expression _visit(Constant constant) {
-    return constant.accept(this);
-  }
-
-  jsAst.Expression _reference(Constant constant) {
-    return referenceEmitter.generateInInitializationContext(constant);
-  }
-
-  jsAst.Expression visitFunction(FunctionConstant constant) {
-    compiler.internalError(NO_LOCATION_SPANNABLE,
-        "The function constant does not need specific JS code.");
-    return null;
-  }
-
-  jsAst.Expression visitNull(NullConstant constant) {
-    return _reference(constant);
-  }
-
-  jsAst.Expression visitInt(IntConstant constant) {
-    return _reference(constant);
-  }
-
-  jsAst.Expression visitDouble(DoubleConstant constant) {
-    return _reference(constant);
-  }
-
-  jsAst.Expression visitTrue(TrueConstant constant) {
-    return _reference(constant);
-  }
-
-  jsAst.Expression visitFalse(FalseConstant constant) {
-    return _reference(constant);
-  }
-
-  jsAst.Expression visitString(StringConstant constant) {
-    // TODO(sra): Some larger strings are worth sharing.
-    return _reference(constant);
-  }
-
   jsAst.Expression visitList(ListConstant constant) {
     jsAst.Expression value = new jsAst.Call(
         new jsAst.PropertyAccess.field(
             new jsAst.VariableUse(namer.isolateName),
-            'makeConstantList'),
+            namer.getMappedInstanceName('makeConstantList')),
         [new jsAst.ArrayInitializer.from(_array(constant.entries))]);
     return maybeAddTypeArguments(constant.type, value);
   }
@@ -231,7 +247,7 @@
         // Keys in literal maps must be emitted in place.
         jsAst.Literal keyExpression = _visit(key);
         jsAst.Expression valueExpression =
-            _reference(constant.values[i]);
+            constantEmitter.reference(constant.values[i]);
         properties.add(new jsAst.Property(keyExpression, valueExpression));
       }
       return new jsAst.ObjectInitializer(properties);
@@ -241,9 +257,9 @@
       List<jsAst.Expression> data = <jsAst.Expression>[];
       for (int i = 0; i < constant.keys.entries.length; i++) {
         jsAst.Expression keyExpression =
-            _reference(constant.keys.entries[i]);
+            constantEmitter.reference(constant.keys.entries[i]);
         jsAst.Expression valueExpression =
-            _reference(constant.values[i]);
+            constantEmitter.reference(constant.values[i]);
         data.add(keyExpression);
         data.add(valueExpression);
       }
@@ -266,10 +282,10 @@
           } else if (field.name == MapConstant.JS_OBJECT_NAME) {
             arguments.add(jsMap());
           } else if (field.name == MapConstant.KEYS_NAME) {
-            arguments.add(_reference(constant.keys));
+            arguments.add(constantEmitter.reference(constant.keys));
           } else if (field.name == MapConstant.PROTO_VALUE) {
             assert(constant.protoValue != null);
-            arguments.add(_reference(constant.protoValue));
+            arguments.add(constantEmitter.reference(constant.protoValue));
           } else if (field.name == MapConstant.JS_DATA_NAME) {
             arguments.add(jsGeneralMap());
           } else {
@@ -316,7 +332,7 @@
   }
 
   jsAst.Expression visitDummy(DummyConstant constant) {
-    return _reference(constant);
+    return new jsAst.LiteralNumber('0');
   }
 
   jsAst.Expression visitConstructed(ConstructedConstant constant) {
@@ -340,7 +356,7 @@
   List<jsAst.Expression> _array(List<Constant> values) {
     List<jsAst.Expression> valueList = <jsAst.Expression>[];
     for (int i = 0; i < values.length; i++) {
-      valueList.add(_reference(values[i]));
+      valueList.add(constantEmitter.reference(values[i]));
     }
     return valueList;
   }
@@ -363,4 +379,8 @@
     }
     return value;
   }
+
+  jsAst.Expression visitDeferred(DeferredConstant constant) {
+    return constantEmitter.reference(constant.referenced);
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_handler_javascript.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_handler_javascript.dart
index dab9bee..2ef19a1 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_handler_javascript.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_handler_javascript.dart
@@ -113,10 +113,10 @@
   Iterable<VariableElement> getStaticNonFinalFieldsForEmission() {
     return initialVariableValues.keys.where((element) {
       return element.kind == ElementKind.FIELD &&
-             !element.isInstanceMember() &&
-             !element.modifiers.isFinal() &&
+             !element.isInstanceMember &&
+             !element.modifiers.isFinal &&
              // The const fields are all either emitted elsewhere or inlined.
-             !element.modifiers.isConst();
+             !element.modifiers.isConst;
     });
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart b/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
index 8b8d182..807b896 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
@@ -77,7 +77,7 @@
     // In codegen we see the TypeConstants instead.
     if (!enqueuer.isResolutionQueue) return;
 
-    if (element.isClass()) {
+    if (element.isClass) {
       // TODO(sra): If we had a flow query from the type literal expression to
       // the Type argument of the metadata lookup, we could tell if this type
       // literal is really a demand for the metadata.
@@ -91,7 +91,7 @@
   }
 
   void registerTypeConstant(Element element, Enqueuer enqueuer) {
-    assert(element.isClass());
+    assert(element.isClass);
     assert(!enqueuer.isResolutionQueue);
     codegenJoin.selectedClasses.add(element);
   }
@@ -148,7 +148,7 @@
     if (!demanded) return;
     var newActiveClasses = new Set<ClassElement>();
     for (ClassElement classElement in instantiatedClasses) {
-      bool isNative = classElement.isNative();
+      bool isNative = classElement.isNative;
       bool isExtension =
           !isNative && Elements.isNativeOrExtendsNative(classElement);
       // Generate table entries for native classes that are explicitly named and
@@ -181,10 +181,10 @@
     // Only classes that extend native classes have constructors in the table.
     // We could refine this to classes that extend Element, but that would break
     // the tests and there is no sane reason to subclass other native classes.
-    if (classElement.isNative()) return result;
+    if (classElement.isNative) return result;
 
     selectGenerativeConstructors(ClassElement enclosing, Element member) {
-      if (member.isGenerativeConstructor()) {
+      if (member.isGenerativeConstructor) {
         // Ignore constructors that cannot be called with zero arguments.
         FunctionElement constructor = member;
         FunctionSignature parameters = constructor.functionSignature;
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index c8a58b2..db55415 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -380,8 +380,8 @@
     String name = operatorNameToIdentifier(elementName);
     if (name != elementName) return getMappedOperatorName(name);
 
-    LibraryElement library = element.getLibrary();
-    if (element.isGenerativeConstructorBody()) {
+    LibraryElement library = element.library;
+    if (element.isGenerativeConstructorBody) {
       name = Elements.reconstructConstructorNameSourceString(element);
     }
     FunctionSignature signature = element.functionSignature;
@@ -421,10 +421,10 @@
   }
 
   String invocationName(Selector selector) {
-    if (selector.isGetter()) {
+    if (selector.isGetter) {
       String proposedName = privateName(selector.library, selector.name);
       return '$getterPrefix${getMappedInstanceName(proposedName)}';
-    } else if (selector.isSetter()) {
+    } else if (selector.isSetter) {
       String proposedName = privateName(selector.library, selector.name);
       return '$setterPrefix${getMappedInstanceName(proposedName)}';
     } else {
@@ -444,7 +444,7 @@
       // We don't mangle the closure invoking function name because it
       // is generated by string concatenation in applyFunction from
       // js_helper.dart. We potentially shorten the prefix though.
-      if (selector.isClosureCall()) {
+      if (selector.isClosureCall) {
         return "$callPrefix$suffix";
       } else {
         String proposedName = privateName(selector.library, name);
@@ -464,7 +464,7 @@
    * instance field.
    */
   String fieldAccessorName(Element element) {
-    return element.isInstanceMember()
+    return element.isInstanceMember
         ? instanceFieldAccessorName(element)
         : getNameOfField(element);
   }
@@ -474,7 +474,7 @@
    * field.
    */
   String fieldPropertyName(Element element) {
-    return element.isInstanceMember()
+    return element.isInstanceMember
         ? instanceFieldPropertyName(element)
         : getNameOfField(element);
   }
@@ -483,7 +483,7 @@
    * Returns name of accessor (root to getter and setter) for an instance field.
    */
   String instanceFieldAccessorName(Element element) {
-    String proposedName = privateName(element.getLibrary(), element.name);
+    String proposedName = privateName(element.library, element.name);
     return getMappedInstanceName(proposedName);
   }
 
@@ -495,38 +495,38 @@
    * Returns name of the JavaScript property used to store an instance field.
    */
   String instanceFieldPropertyName(Element element) {
-    if (element.hasFixedBackendName()) {
-      return element.fixedBackendName();
+    if (element.hasFixedBackendName) {
+      return element.fixedBackendName;
     }
     // If a class is used anywhere as a mixin, we must make the name unique so
     // that it does not accidentally shadow.  Also, the mixin name must be
     // constant over all mixins.
-    if (compiler.world.isUsedAsMixin(element.getEnclosingClass()) ||
+    if (compiler.world.isUsedAsMixin(element.enclosingClass) ||
         shadowingAnotherField(element)) {
       // Construct a new name for the element based on the library and class it
       // is in.  The name here is not important, we just need to make sure it is
       // unique.  If we are minifying, we actually construct the name from the
       // minified version of the class name, but the result is minified once
       // again, so that is not visible in the end result.
-      String libraryName = getNameOfLibrary(element.getLibrary());
-      String className = getNameOfClass(element.getEnclosingClass());
-      String instanceName = privateName(element.getLibrary(), element.name);
+      String libraryName = getNameOfLibrary(element.library);
+      String className = getNameOfClass(element.enclosingClass);
+      String instanceName = privateName(element.library, element.name);
       return getMappedInstanceName('$libraryName\$$className\$$instanceName');
     }
 
-    String proposedName = privateName(element.getLibrary(), element.name);
+    String proposedName = privateName(element.library, element.name);
     return getMappedInstanceName(proposedName);
   }
 
 
   bool shadowingAnotherField(Element element) {
-    return element.getEnclosingClass().hasFieldShadowedBy(element);
+    return element.enclosingClass.hasFieldShadowedBy(element);
   }
 
   String setterName(Element element) {
     // We dynamically create setters from the field-name. The setter name must
     // therefore be derived from the instance field-name.
-    LibraryElement library = element.getLibrary();
+    LibraryElement library = element.library;
     String name = getMappedInstanceName(privateName(library, element.name));
     return '$setterPrefix$name';
   }
@@ -546,7 +546,7 @@
   String getterName(Element element) {
     // We dynamically create getters from the field-name. The getter name must
     // therefore be derived from the instance field-name.
-    LibraryElement library = element.getLibrary();
+    LibraryElement library = element.library;
     String name = getMappedInstanceName(privateName(library, element.name));
     return '$getterPrefix$name';
   }
@@ -614,25 +614,25 @@
    * The returned id is guaranteed to be a valid JS-id.
    */
   String _computeGuess(Element element) {
-    assert(!element.isInstanceMember());
+    assert(!element.isInstanceMember);
     String name;
-    if (element.isGenerativeConstructor()) {
-      name = "${element.getEnclosingClass().name}\$"
+    if (element.isGenerativeConstructor) {
+      name = "${element.enclosingClass.name}\$"
              "${element.name}";
-    } else if (element.isFactoryConstructor()) {
+    } else if (element.isFactoryConstructor) {
       // TODO(johnniwinther): Change factory name encoding as to not include
       // the class-name twice.
-      String className = element.getEnclosingClass().name;
+      String className = element.enclosingClass.name;
       name = '${className}_${Elements.reconstructConstructorName(element)}';
     } else if (Elements.isStaticOrTopLevel(element)) {
-      if (element.isMember()) {
-        ClassElement enclosingClass = element.getEnclosingClass();
+      if (element.isMember) {
+        ClassElement enclosingClass = element.enclosingClass;
         name = "${enclosingClass.name}_"
                "${element.name}";
       } else {
         name = element.name.replaceAll('+', '_');
       }
-    } else if (element.isLibrary()) {
+    } else if (element.isLibrary) {
       LibraryElement library = element;
       name = library.getLibraryOrScriptName();
       if (name.contains('.')) {
@@ -715,7 +715,7 @@
       // clash.
       // TODO(sra): Find a way to get the simple name when Object is not in the
       // set of classes for most general variant, e.g. "$lt$n" could be "$lt".
-      if (selector.isGetter() || selector.isSetter()) root = '$root\$';
+      if (selector.isGetter || selector.isSetter) root = '$root\$';
       return getMappedGlobalName(root, ensureSafe: false);
     } else {
       String suffix = getInterceptorSuffix(classes);
@@ -734,13 +734,12 @@
    * guaranteed to be a valid JS-id. Globals and static fields are furthermore
    * guaranteed to be unique.
    *
-   * For accessing statics consider calling
-   * [isolateAccess] or [isolatePropertyAccess] instead.
+   * For accessing statics consider calling [elementAccess] instead.
    */
   // TODO(ahe): This is an internal method to the Namer (and its subclasses)
   // and should not be call from outside.
   String getNameX(Element element) {
-    if (element.isInstanceMember()) {
+    if (element.isInstanceMember) {
       if (element.kind == ElementKind.GENERATIVE_CONSTRUCTOR_BODY
           || element.kind == ElementKind.FUNCTION) {
         return instanceMethodName(element);
@@ -781,7 +780,7 @@
           kind == ElementKind.LIBRARY) {
         bool fixedName = false;
         if (Elements.isInstanceField(element)) {
-          fixedName = element.hasFixedBackendName();
+          fixedName = element.hasFixedBackendName;
         }
         String result = fixedName
             ? guess
@@ -822,17 +821,17 @@
         // TODO(ahe): Re-write these tests to be positive (so it only returns
         // true for static/top-level mutable fields). Right now, a number of
         // other elements, such as bound closures also live in [currentIsolate].
-        !element.isAccessor() &&
-        !element.isClass() &&
-        !element.isConstructor() &&
-        !element.isFunction() &&
-        !element.isLibrary();
+        !element.isAccessor &&
+        !element.isClass &&
+        !element.isConstructor &&
+        !element.isFunction &&
+        !element.isLibrary;
   }
 
   /// Returns [currentIsolate] or one of [reservedGlobalObjectNames].
   String globalObjectFor(Element element) {
     if (isPropertyOfCurrentIsolate(element)) return currentIsolate;
-    LibraryElement library = element.getLibrary();
+    LibraryElement library = element.library;
     if (library == compiler.interceptorsLibrary) return 'J';
     if (library.isInternalLibrary) return 'H';
     if (library.isPlatformLibrary) {
@@ -860,10 +859,6 @@
     return getMappedGlobalName("${getNameX(element)}\$closure");
   }
 
-  String isolateAccess(Element element) {
-    return "${globalObjectFor(element)}.${getNameX(element)}";
-  }
-
   jsAst.Expression isolateLazyInitializerAccess(Element element) {
     return js('#.#',
         [globalObjectFor(element), getLazyInitializerName(element)]);
@@ -1168,6 +1163,10 @@
   visitDummy(DummyConstant constant) {
     add('dummy_receiver');
   }
+
+  visitDeferred(DeferredConstant constant) {
+    addRoot('Deferred');
+  }
 }
 
 /**
@@ -1250,6 +1249,11 @@
         'DummyReceiverConstant should never be named and never be subconstant');
   }
 
+  visitDeferred(DeferredConstant constant) {
+    int hash = constant.prefix.hashCode;
+    return _combine(hash, constant.referenced.accept(this));
+  }
+
   int _hashString(int hash, String s) {
     int length = s.length;
     hash = _combine(hash, length);
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 4c594e0..900823d 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -91,7 +91,7 @@
     Map<ClassElement, ClassBuilder> builders =
         new Map<ClassElement, ClassBuilder>();
     for (ClassElement classElement in classes) {
-      if (classElement.isNative()) {
+      if (classElement.isNative) {
         ClassBuilder builder = generateNativeClass(classElement);
         builders[classElement] = builder;
       }
@@ -136,7 +136,7 @@
       } else if (extensionPoints.containsKey(classElement)) {
         needed = true;
       }
-      if (classElement.isNative() &&
+      if (classElement.isNative &&
           native.nativeTagsForcedNonLeaf(classElement)) {
         needed = true;
         nonleafClasses.add(classElement);
@@ -157,7 +157,7 @@
         new Map<ClassElement, Set<String>>();
 
     for (ClassElement classElement in classes) {
-      if (!classElement.isNative()) continue;
+      if (!classElement.isNative) continue;
       List<String> nativeTags = native.nativeTagsOfClass(classElement);
 
       if (nonleafClasses.contains(classElement) ||
@@ -234,7 +234,7 @@
 
     // Emit the native class interceptors that were actually used.
     for (ClassElement classElement in classes) {
-      if (!classElement.isNative()) continue;
+      if (!classElement.isNative) continue;
       if (neededClasses.contains(classElement)) {
         // Define interceptor class for [classElement].
         emitter.classEmitter.emitClassBuilderWithReflectionData(
@@ -255,7 +255,7 @@
       List<ClassElement> classes) {
     ClassElement nativeSuperclassOf(ClassElement element) {
       if (element == null) return null;
-      if (element.isNative()) return element;
+      if (element.isNative) return element;
       return nativeSuperclassOf(element.superclass);
     }
 
@@ -267,7 +267,7 @@
         new Map<ClassElement, List<ClassElement>>();
 
     for (ClassElement classElement in classes) {
-      if (classElement.isNative()) continue;
+      if (classElement.isNative) continue;
       ClassElement nativeAncestor = nativeAncestorOf(classElement);
       if (nativeAncestor != null) {
         map
@@ -376,7 +376,7 @@
     assert(invariant(member, nativeMethods.contains(member)));
     // When calling a JS method, we call it with the native name, and only the
     // arguments up until the last one provided.
-    target = member.fixedBackendName();
+    target = member.fixedBackendName;
 
     if (isInterceptedMethod) {
       receiver = argumentsBuffer[0];
@@ -394,7 +394,7 @@
   }
 
   bool isSupertypeOfNativeClass(Element element) {
-    if (element.isTypeVariable()) {
+    if (element.isTypeVariable) {
       compiler.internalError(element, "Is check for type variable.");
       return false;
     }
@@ -404,7 +404,7 @@
       return false;
     }
 
-    if (!element.isClass()) {
+    if (!element.isClass) {
       compiler.internalError(element, "Is check does not handle element.");
       return false;
     }
@@ -423,7 +423,7 @@
     // by a native class in case we get a native instance that tries to spoof
     // the type info.  i.e the criteria for whether or not to use an interceptor
     // is whether the receiver can be native, not the type of the test.
-    if (!element.isClass()) return false;
+    if (element == null || !element.isClass) return false;
     ClassElement cls = element;
     if (Elements.isNativeOrExtendsNative(cls)) return true;
     return isSupertypeOfNativeClass(element);
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 55a374b..57c4233 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
@@ -47,7 +47,7 @@
 
   void registerRtiDependency(Element element, Element dependency) {
     // We're not dealing with typedef for now.
-    if (!element.isClass() || !dependency.isClass()) return;
+    if (!element.isClass || !dependency.isClass) return;
     Set<ClassElement> classes =
         rtiDependencies.putIfAbsent(element, () => new Set<ClassElement>());
     classes.add(dependency);
@@ -396,7 +396,7 @@
     JavaScriptBackend backend = compiler.backend;
     Namer namer = backend.namer;
     String name = namer.uniqueNameForTypeConstantElement(type.element);
-    if (!type.element.isClass()) return name;
+    if (!type.element.isClass) return name;
     InterfaceType interface = type;
     Link<DartType> variables = interface.element.typeVariables;
     // Type constants can currently only be raw types, so there is no point
@@ -412,7 +412,7 @@
 
   // TODO(karlklose): maybe precompute this value and store it in typeChecks?
   bool isTrivialSubstitution(ClassElement cls, ClassElement check) {
-    if (cls.isClosure()) {
+    if (cls.isClosure) {
       // TODO(karlklose): handle closures.
       return true;
     }
@@ -584,7 +584,7 @@
   }
 
   static int getTypeVariableIndex(TypeVariableElement variable) {
-    ClassElement classElement = variable.getEnclosingClass();
+    ClassElement classElement = variable.enclosingClass;
     Link<DartType> variables = classElement.typeVariables;
     for (int index = 0; !variables.isEmpty;
          index++, variables = variables.tail) {
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 af53af3..1a05988 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
@@ -17,7 +17,7 @@
         task.typeTestEmitter.rtiNeededClasses.contains(classElement);
 
     assert(invariant(classElement, classElement.isDeclaration));
-    assert(invariant(classElement, !classElement.isNative() || onlyForRti));
+    assert(invariant(classElement, !classElement.isNative || onlyForRti));
 
     task.needsDefineClass = true;
     String className = namer.getNameOfClass(classElement);
@@ -62,7 +62,7 @@
                             ClassBuilder builder,
                             {bool onlyForRti: false}) {
     List<String> fields = <String>[];
-    if (!onlyForRti && !classElement.isNative()) {
+    if (!onlyForRti && !classElement.isNative) {
       visitFields(classElement, false,
                   (Element member,
                    String name,
@@ -116,9 +116,9 @@
                     bool emitStatics: false,
                     bool onlyForRti: false }) {
     assert(!emitStatics || !onlyForRti);
-    if (element.isLibrary()) {
+    if (element.isLibrary) {
       assert(invariant(element, emitStatics));
-    } else if (!element.isClass()) {
+    } else if (!element.isClass) {
       throw new SpannableAssertionFailure(
           element, 'Must be a ClassElement or a LibraryElement');
     }
@@ -178,7 +178,7 @@
                   namer.setterName(field));
             }
             if (needsGetter) {
-              if (field.isInstanceMember()) {
+              if (field.isInstanceMember) {
                 // 01:  function() { return this.field; }
                 // 10:  function(receiver) { return receiver.field; }
                 // 11:  function(receiver) { return this.field; }
@@ -188,7 +188,7 @@
                 // TODO(sra): 'isInterceptorClass' might not be the correct test
                 // for methods forced to use the interceptor convention because
                 // the method's class was elsewhere mixed-in to an interceptor.
-                assert(!field.isInstanceMember() || getterCode != 0);
+                assert(!field.isInstanceMember || getterCode != 0);
                 if (isIntercepted) {
                   task.interceptorEmitter.interceptorInvocationNames.add(
                       namer.getterName(field));
@@ -199,14 +199,14 @@
             }
             int setterCode = 0;
             if (needsSetter) {
-              if (field.isInstanceMember()) {
+              if (field.isInstanceMember) {
                 // 01:  function(value) { this.field = value; }
                 // 10:  function(receiver, value) { receiver.field = value; }
                 // 11:  function(receiver, value) { this.field = value; }
                 bool isIntercepted = backend.fieldHasInterceptedSetter(field);
                 setterCode += isIntercepted ? 2 : 0;
                 setterCode += backend.isInterceptorClass(element) ? 0 : 1;
-                assert(!field.isInstanceMember() || setterCode != 0);
+                assert(!field.isInstanceMember || setterCode != 0);
                 if (isIntercepted) {
                   task.interceptorEmitter.interceptorInvocationNames.add(
                       namer.setterName(field));
@@ -226,7 +226,7 @@
           if (backend.isAccessibleByReflection(field)) {
             reflectionMarker = '-';
             if (backend.isNeededForReflection(field)) {
-              DartType type = field.computeType(compiler);
+              DartType type = field.type;
               reflectionMarker = '-${task.metadataEmitter.reifyType(type)}';
             }
           }
@@ -283,7 +283,7 @@
 
     void visitMember(ClassElement enclosing, Element member) {
       assert(invariant(classElement, member.isDeclaration));
-      if (member.isInstanceMember()) {
+      if (member.isInstanceMember) {
         task.containerBuilder.addMember(member, builder);
       }
     }
@@ -390,9 +390,9 @@
 
     bool isClass = false;
     bool isLibrary = false;
-    if (element.isClass()) {
+    if (element.isClass) {
       isClass = true;
-    } else if (element.isLibrary()) {
+    } else if (element.isLibrary) {
       isLibrary = true;
       assert(invariant(element, visitStatics));
     } else {
@@ -412,7 +412,7 @@
       // Keep track of whether or not we're dealing with a field mixin
       // into a native class.
       bool isMixinNativeField =
-          isClass && element.isNative() && holder.isMixinApplication;
+          isClass && element.isNative && holder.isMixinApplication;
 
       // See if we can dynamically create getters and setters.
       // We can only generate getters and setters for [element] since
@@ -425,7 +425,7 @@
         needsSetter = fieldNeedsSetter(field);
       }
 
-      if ((isInstantiated && !holder.isNative())
+      if ((isInstantiated && !holder.isNative)
           || needsGetter
           || needsSetter) {
         String accessorName = namer.fieldAccessorName(field);
@@ -446,7 +446,7 @@
     if (isLibrary) {
       LibraryElement library = element;
       library.implementation.forEachLocalMember((Element member) {
-        if (member.isField()) visitField(library, member);
+        if (member.isField) visitField(library, member);
       });
     } else if (visitStatics) {
       ClassElement cls = element;
@@ -472,7 +472,7 @@
                           String memberName) {
     if (!backend.shouldRetainGetter(member)) return;
     String previousName;
-    if (member.isInstanceMember()) {
+    if (member.isInstanceMember) {
       previousName = task.mangledFieldNames.putIfAbsent(
           '${namer.getterPrefix}$accessorName',
           () => memberName);
@@ -486,16 +486,16 @@
   }
 
   bool fieldNeedsGetter(VariableElement field) {
-    assert(field.isField());
+    assert(field.isField);
     if (fieldAccessNeverThrows(field)) return false;
     return backend.shouldRetainGetter(field)
         || compiler.codegenWorld.hasInvokedGetter(field, compiler);
   }
 
   bool fieldNeedsSetter(VariableElement field) {
-    assert(field.isField());
+    assert(field.isField);
     if (fieldAccessNeverThrows(field)) return false;
-    return (!field.modifiers.isFinalOrConst())
+    return (!field.isFinal && !field.isConst)
         && (backend.shouldRetainSetter(field)
             || compiler.codegenWorld.hasInvokedSetter(field, compiler));
   }
@@ -509,7 +509,7 @@
 
   bool canAvoidGeneratedCheckedSetter(VariableElement member) {
     // We never generate accessors for top-level/static fields.
-    if (!member.isInstanceMember()) return true;
+    if (!member.isInstanceMember) return true;
     DartType type = member.type;
     return type.treatAsDynamic || (type.element == compiler.objectClass);
   }
@@ -529,7 +529,7 @@
   void generateGetter(Element member, String fieldName, String accessorName,
                       ClassBuilder builder) {
     String getterName = namer.getterNameFromAccessorName(accessorName);
-    ClassElement cls = member.getEnclosingClass();
+    ClassElement cls = member.enclosingClass;
     String className = namer.getNameOfClass(cls);
     String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this';
     List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : [];
@@ -546,7 +546,7 @@
   void generateSetter(Element member, String fieldName, String accessorName,
                       ClassBuilder builder) {
     String setterName = namer.setterNameFromAccessorName(accessorName);
-    ClassElement cls = member.getEnclosingClass();
+    ClassElement cls = member.enclosingClass;
     String className = namer.getNameOfClass(cls);
     String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this';
     List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : [];
@@ -566,8 +566,8 @@
                                                     ClassBuilder builder,
                                                     {bool isGetter}) {
     Selector selector = isGetter
-        ? new Selector.getter(member.name, member.getLibrary())
-        : new Selector.setter(member.name, member.getLibrary());
+        ? new Selector.getter(member.name, member.library)
+        : new Selector.setter(member.name, member.library);
     String reflectionName = task.getReflectionName(selector, name);
     if (reflectionName != null) {
       var reflectable =
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 5d29b6b..6cf0863 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
@@ -33,6 +33,8 @@
   final Set<ClassElement> neededClasses = new Set<ClassElement>();
   final Map<OutputUnit, List<ClassElement>> outputClassLists =
       new Map<OutputUnit, List<ClassElement>>();
+  final Map<OutputUnit, List<Constant>> outputConstantLists =
+      new Map<OutputUnit, List<Constant>>();
   final List<ClassElement> nativeClasses = <ClassElement>[];
   final Map<String, String> mangledFieldNames = <String, String>{};
   final Map<String, String> mangledGlobalFieldNames = <String, String>{};
@@ -135,6 +137,8 @@
   String get lazyInitializerName
       => '${namer.isolateName}.\$lazy';
   String get initName => 'init';
+  String get makeConstListProperty
+      => namer.getMappedInstanceName('makeConstantList');
 
   jsAst.FunctionDeclaration get generateAccessorFunction {
     const RANGE1_SIZE = RANGE1_LAST - RANGE1_FIRST + 1;
@@ -538,7 +542,7 @@
         if (#)
           Isolate.$finishClassesProperty = oldIsolate.$finishClassesProperty;
         if (#)
-          Isolate.makeConstantList = oldIsolate.makeConstantList;
+          Isolate.$makeConstListProperty = oldIsolate.$makeConstListProperty;
         return Isolate;
       }''',
         [ needsDefineClass, hasMakeConstantList ]);
@@ -617,7 +621,7 @@
 
   /// In minified mode we want to keep the name for the most common core types.
   bool _isNativeTypeNeedingReflectionName(Element element) {
-    if (!element.isClass()) return false;
+    if (!element.isClass) return false;
     return (element == compiler.intClass ||
             element == compiler.doubleClass ||
             element == compiler.numClass ||
@@ -658,8 +662,8 @@
 
   String getReflectionNameInternal(elementOrSelector, String mangledName) {
     String name = elementOrSelector.name;
-    if (elementOrSelector.isGetter()) return name;
-    if (elementOrSelector.isSetter()) {
+    if (elementOrSelector.isGetter) return name;
+    if (elementOrSelector.isSetter) {
       if (!mangledName.startsWith(namer.setterPrefix)) return '$name=';
       String base = mangledName.substring(namer.setterPrefix.length);
       String getter = '${namer.getterPrefix}$base';
@@ -670,15 +674,15 @@
       // marking the function as invokable by reflection.
       return '$name=';
     }
-    if (elementOrSelector is Element && elementOrSelector.isClosure()) {
+    if (elementOrSelector is Element && elementOrSelector.isClosure) {
       // Closures are synthesized and their name might conflict with existing
       // globals. Assign an illegal name, and make sure they don't clash
       // with each other.
       return " $mangledName";
     }
     if (elementOrSelector is Selector
-        || elementOrSelector.isFunction()
-        || elementOrSelector.isConstructor()) {
+        || elementOrSelector.isFunction
+        || elementOrSelector.isConstructor) {
       int requiredParameterCount;
       int optionalParameterCount;
       String namedArguments = '';
@@ -690,7 +694,7 @@
         namedArguments = namedParametersAsReflectionNames(selector);
       } else {
         FunctionElement function = elementOrSelector;
-        if (function.isConstructor()) {
+        if (function.isConstructor) {
           isConstructor = true;
           name = Elements.reconstructConstructorName(function);
         }
@@ -704,7 +708,7 @@
           }
           Selector selector = new Selector.call(
               function.name,
-              function.getLibrary(),
+              function.library,
               requiredParameterCount,
               names);
           namedArguments = namedParametersAsReflectionNames(selector);
@@ -726,9 +730,9 @@
       return (isConstructor) ? 'new $suffix' : suffix;
     }
     Element element = elementOrSelector;
-    if (element.isGenerativeConstructorBody()) {
+    if (element.isGenerativeConstructorBody) {
       return null;
-    } else if (element.isClass()) {
+    } else if (element.isClass) {
       ClassElement cls = element;
       if (cls.isUnnamedMixinApplication) return null;
       return cls.name;
@@ -819,7 +823,7 @@
 
   void emitStaticFunctions() {
     bool isStaticFunction(Element element) =>
-        !element.isInstanceMember() && !element.isField();
+        !element.isInstanceMember && !element.isField;
 
     Iterable<Element> elements =
         backend.generatedCode.keys.where(isStaticFunction);
@@ -890,26 +894,9 @@
   }
 
   void emitCompileTimeConstants(CodeBuffer buffer, OutputUnit outputUnit) {
-    JavaScriptConstantCompiler handler = backend.constants;
-    List<Constant> constants = handler.getConstantsForEmission(
-        compareConstants);
-    Set<Constant> outputUnitConstants = null;
-    // TODO(sigurdm): We shouldn't run through all constants for every
-    // outputUnit.
+    List<Constant> constants = outputConstantLists[outputUnit];
+    if (constants == null) return;
     for (Constant constant in constants) {
-      if (isConstantInlinedOrAlreadyEmitted(constant)) continue;
-      OutputUnit constantUnit =
-          compiler.deferredLoadTask.outputUnitForConstant(constant);
-      if (constantUnit != outputUnit && constantUnit != null) continue;
-      if (outputUnit != compiler.deferredLoadTask.mainOutputUnit
-          && constantUnit == null) {
-        // The back-end introduces some constants, like "InterceptorConstant" or
-        // some list constants. They are emitted in the main output-unit, and
-        // ignored otherwise.
-        // TODO(sigurdm): We should track those constants.
-        continue;
-      }
-
       String name = namer.constantName(constant);
       if (constant.isList) emitMakeConstantListIfNotEmitted(buffer);
       jsAst.Expression init = js('#.# = #',
@@ -956,28 +943,28 @@
   void emitMakeConstantListIfNotEmitted(CodeBuffer buffer) {
     if (hasMakeConstantList) return;
     hasMakeConstantList = true;
-    buffer
-        ..write(namer.isolateName)
-        ..write('''.makeConstantList = function(list) {
-  list.immutable\$list = $initName;
-  list.fixed\$length = $initName;
-  return list;
-};
-''');
+    jsAst.Expression value = new jsAst.Assignment(
+            new jsAst.PropertyAccess.field(
+                new jsAst.VariableUse(namer.isolateName),
+                makeConstListProperty),
+            js('''function(list) {
+                    list.immutable\$list = $initName;
+                    list.fixed\$length = $initName;
+                    return list;
+                  }'''));
+    buffer.write(jsAst.prettyPrint(value, compiler));
+    buffer.write(N);
   }
 
   /// Returns the code equivalent to:
   ///   `function(args) { $.startRootIsolate(X.main$closure(), args); }`
-  String buildIsolateSetupClosure(CodeBuffer buffer,
-                                  Element appMain,
-                                  Element isolateMain) {
+  jsAst.Expression buildIsolateSetupClosure(Element appMain,
+                                            Element isolateMain) {
     jsAst.Expression mainAccess = namer.isolateStaticClosureAccess(appMain);
     // Since we pass the closurized version of the main method to
     // the isolate method, we must make sure that it exists.
-    jsAst.Expression setup = js('function(a){ #(#, a); }',
-            [namer.elementAccess(isolateMain), mainAccess]);
-
-    return '(' + jsAst.prettyPrint(setup, compiler).getText() + ')';
+    return js('function(a){ #(#, a); }',
+        [namer.elementAccess(isolateMain), mainAccess]);
   }
 
   /**
@@ -1031,14 +1018,13 @@
   emitMain(CodeBuffer buffer) {
     if (compiler.isMockCompilation) return;
     Element main = compiler.mainFunction;
-    String mainCallClosure = null;
+    jsAst.Expression mainCallClosure = null;
     if (compiler.hasIsolateSupport()) {
       Element isolateMain =
         compiler.isolateHelperLibrary.find(Compiler.START_ROOT_ISOLATE);
-      mainCallClosure = buildIsolateSetupClosure(buffer, main, isolateMain);
+      mainCallClosure = buildIsolateSetupClosure(main, isolateMain);
     } else {
-      // TODO(sra): Replace with AST.
-      mainCallClosure = '${namer.isolateAccess(main)}';
+      mainCallClosure = namer.elementAccess(main);
     }
 
     if (backend.needToInitializeIsolateAffinityTag) {
@@ -1060,8 +1046,8 @@
     // onload event of all script tags and getting the first script which
     // finishes. Since onload is called immediately after execution this should
     // not substantially change execution order.
-    buffer.write('''
-;(function (callback) {
+    jsAst.Statement invokeMain = js.statement('''
+(function (callback) {
   if (typeof document === "undefined") {
     callback(null);
     return;
@@ -1085,15 +1071,41 @@
   init.currentScript = currentScript;
 
   if (typeof dartMainRunner === "function") {
-    dartMainRunner(${mainCallClosure}, []);
+    dartMainRunner(#, []);
   } else {
-    ${mainCallClosure}([]);
+    #([]);
   }
-})$N''');
+})$N''', [mainCallClosure, mainCallClosure]);
+
+    buffer.write(';');
+    buffer.write(jsAst.prettyPrint(invokeMain, compiler));
+    buffer.write(N);
     addComment('END invoke [main].', buffer);
   }
 
   /**
+   * Compute all the constants that must be emitted.
+   */
+  void computeNeededConstants() {
+    JavaScriptConstantCompiler handler = backend.constants;
+    List<Constant> constants = handler.getConstantsForEmission(
+        compareConstants);
+    for (Constant constant in constants) {
+      if (isConstantInlinedOrAlreadyEmitted(constant)) continue;
+      OutputUnit constantUnit =
+          compiler.deferredLoadTask.outputUnitForConstant(constant);
+      if (constantUnit == null) {
+        // The back-end introduces some constants, like "InterceptorConstant" or
+        // some list constants. They are emitted in the main output-unit.
+        // TODO(sigurdm): We should track those constants.
+        constantUnit = compiler.deferredLoadTask.mainOutputUnit;
+      }
+      outputConstantLists.putIfAbsent(constantUnit, () => new List<Constant>())
+          .add(constant);
+    }
+  }
+
+  /**
    * Compute all the classes that must be emitted.
    */
   void computeNeededClasses() {
@@ -1133,7 +1145,7 @@
       String noSuchMethodName = Compiler.NO_SUCH_METHOD;
       Selector noSuchMethodSelector = compiler.noSuchMethodSelector;
       for (ClassElement element in neededClasses) {
-        if (!element.isNative()) continue;
+        if (!element.isNative) continue;
         Element member = element.lookupLocalMember(noSuchMethodName);
         if (member == null) continue;
         if (noSuchMethodSelector.applies(member, compiler)) {
@@ -1186,7 +1198,7 @@
       } else if (Elements.isNativeOrExtendsNative(element)) {
         // For now, native classes and related classes cannot be deferred.
         nativeClasses.add(element);
-        if (!element.isNative()) {
+        if (!element.isNative) {
           assert(invariant(element,
                            !compiler.deferredLoadTask.isDeferred(element)));
           outputClassLists.putIfAbsent(compiler.deferredLoadTask.mainOutputUnit,
@@ -1216,44 +1228,40 @@
   }
 
   void emitConvertToFastObjectFunction() {
-    // Create an instance that uses 'properties' as prototype. This should make
-    // 'properties' a fast object.
-    mainBuffer.add(r'''function convertToFastObject(properties) {
-  function MyClass() {};
-  MyClass.prototype = properties;
-  new MyClass();
-''');
+    List<jsAst.Statement> debugCode = <jsAst.Statement>[];
     if (DEBUG_FAST_OBJECTS) {
-      ClassElement primitives =
-          compiler.findHelper('Primitives');
-      FunctionElement printHelper =
-          compiler.lookupElementIn(
-              primitives, 'printString');
-      // TODO(sra): Replace with AST.
-      String printHelperName = namer.isolateAccess(printHelper);
-      mainBuffer.add('''
-// The following only works on V8 when run with option "--allow-natives-syntax".
-if (typeof $printHelperName === "function") {
-  $printHelperName("Size of global object: "
+      debugCode.add(js.statement(r'''
+        // The following only works on V8 when run with option
+        // "--allow-natives-syntax".  We use'new Function' because the
+         // miniparser does not understand V8 native syntax.
+        if (typeof print === "function") {
+          var HasFastProperties =
+            new Function("a", "return %HasFastProperties(a)");
+          print("Size of global object: "
                    + String(Object.getOwnPropertyNames(properties).length)
-                   + ", fast properties " + %HasFastProperties(properties));
-}
-''');
+                   + ", fast properties " + HasFastProperties(properties));
+        }'''));
     }
-mainBuffer.add(r'''
-  return properties;
-}
-''');
+
+    jsAst.Statement convertToFastObject = js.statement(r'''
+      function convertToFastObject(properties) {
+        // Create an instance that uses 'properties' as prototype. This should
+        // make 'properties' a fast object.
+        function MyClass() {};
+        MyClass.prototype = properties;
+        new MyClass();
+        #;
+        return properties;
+      }''', [debugCode]);
+
+    mainBuffer.add(jsAst.prettyPrint(convertToFastObject, compiler));
+    mainBuffer.add(N);
   }
 
   void writeLibraryDescriptors(LibraryElement library) {
     var uri = library.canonicalUri;
-    if (uri.scheme == 'file' && compiler.sourceMapUri != null) {
-      // TODO(ahe): It is a hack to use compiler.sourceMapUri
-      // here.  It should be relative to the main JavaScript
-      // output file.
-      uri = relativize(
-          compiler.sourceMapUri, library.canonicalUri, false);
+    if (uri.scheme == 'file' && compiler.outputUri != null) {
+      uri = relativize(compiler.outputUri, library.canonicalUri, false);
     }
     Map<OutputUnit, ClassBuilder> descriptors =
         elementDescriptors[library];
@@ -1375,7 +1383,7 @@
         for (Element element in elementDescriptors.keys) {
           // TODO(ahe): Should iterate over all libraries.  Otherwise, we will
           // not see libraries that only have fields.
-          if (element.isLibrary()) {
+          if (element.isLibrary) {
             LibraryElement library = element;
             ClassBuilder builder = new ClassBuilder(namer);
             if (classEmitter.emitFields(
@@ -1433,7 +1441,7 @@
             Elements.sortedByPosition(elementDescriptors.keys);
 
         Iterable<Element> pendingStatics = sortedElements.where((element) {
-            return !element.isLibrary() &&
+            return !element.isLibrary &&
                 elementDescriptors[element].values.any((descriptor) =>
                     descriptor != null);
         });
@@ -1443,7 +1451,7 @@
                 element, MessageKind.GENERIC, {'text': 'Pending statics.'}));
 
         for (LibraryElement library in sortedElements.where((element) =>
-            element.isLibrary())) {
+            element.isLibrary)) {
           writeLibraryDescriptors(library);
           elementDescriptors[library] = const {};
         }
@@ -1464,6 +1472,7 @@
       // which may need getInterceptor (and one-shot interceptor) methods, so
       // we have to make sure that [emitGetInterceptorMethods] and
       // [emitOneShotInterceptors] have been called.
+      computeNeededConstants();
       emitCompileTimeConstants(mainBuffer, mainOutputUnit);
 
       // Write a javascript mapping from Deferred import load ids (derrived from
@@ -1511,44 +1520,40 @@
         mainBuffer.add('$globalObject = convertToFastObject($globalObject)$N');
       }
       if (DEBUG_FAST_OBJECTS) {
-        ClassElement primitives =
-            compiler.findHelper('Primitives');
-        FunctionElement printHelper =
-            compiler.lookupElementIn(
-                primitives, 'printString');
-        // TODO(sra): Replace with AST.
-        String printHelperName = namer.isolateAccess(printHelper);
-
-        mainBuffer.add('''
-// The following only works on V8 when run with option "--allow-natives-syntax".
-if (typeof $printHelperName === "function") {
-  $printHelperName("Size of global helper object: "
+        mainBuffer.add(r'''
+          // The following only works on V8 when run with option
+          // "--allow-natives-syntax".  We use'new Function' because the
+          // miniparser does not understand V8 native syntax.
+          if (typeof print === "function") {
+            var HasFastProperties =
+              new Function("a", "return %HasFastProperties(a)");
+            print("Size of global helper object: "
                    + String(Object.getOwnPropertyNames(H).length)
-                   + ", fast properties " + %HasFastProperties(H));
-  $printHelperName("Size of global platform object: "
+                   + ", fast properties " + HasFastProperties(H));
+            print("Size of global platform object: "
                    + String(Object.getOwnPropertyNames(P).length)
-                   + ", fast properties " + %HasFastProperties(P));
-  $printHelperName("Size of global dart:html object: "
+                   + ", fast properties " + HasFastProperties(P));
+            print("Size of global dart:html object: "
                    + String(Object.getOwnPropertyNames(W).length)
-                   + ", fast properties " + %HasFastProperties(W));
-  $printHelperName("Size of isolate properties object: "
-                   + String(Object.getOwnPropertyNames(\$).length)
-                   + ", fast properties " + %HasFastProperties(\$));
-  $printHelperName("Size of constant object: "
+                   + ", fast properties " + HasFastProperties(W));
+            print("Size of isolate properties object: "
+                   + String(Object.getOwnPropertyNames($).length)
+                   + ", fast properties " + HasFastProperties($));
+           print("Size of constant object: "
                    + String(Object.getOwnPropertyNames(C).length)
-                   + ", fast properties " + %HasFastProperties(C));
-  var names = Object.getOwnPropertyNames(\$);
-  for (var i = 0; i < names.length; i++) {
-    $printHelperName("\$." + names[i]);
-  }
-}
+                   + ", fast properties " + HasFastProperties(C));
+           var names = Object.getOwnPropertyNames($);
+           for (var i = 0; i < names.length; i++) {
+             print("$." + names[i]);
+           }
+         }
 ''');
         for (String object in Namer.userGlobalObjects) {
         mainBuffer.add('''
-if (typeof $printHelperName === "function") {
-  $printHelperName("Size of $object: "
+          if (typeof print === "function") {
+             print("Size of $object: "
                    + String(Object.getOwnPropertyNames($object).length)
-                   + ", fast properties " + %HasFastProperties($object));
+                   + ", fast properties " + HasFastProperties($object));
 }
 ''');
         }
@@ -1588,7 +1593,7 @@
       if (!compiler.useContentSecurityPolicy) {
         mainBuffer.write("""
 {
-  var message = 
+  var message =
       'Deprecation: Automatic generation of output for Content Security\\n' +
       'Policy is deprecated and will be removed with the next development\\n' +
       'release. Use the --csp option to generate CSP restricted output.';
@@ -1645,15 +1650,15 @@
   }
 
   ClassBuilder getElementDecriptor(Element element) {
-    Element owner = element.getLibrary();
-    if (!element.isTopLevel() && !element.isNative()) {
+    Element owner = element.library;
+    if (!element.isTopLevel && !element.isNative) {
       // For static (not top level) elements, record their code in a buffer
       // specific to the class. For now, not supported for native classes and
       // native elements.
       ClassElement cls =
-          element.getEnclosingClassOrCompilationUnit().declaration;
+          element.enclosingClassOrCompilationUnit.declaration;
       if (compiler.codegenWorld.instantiatedClasses.contains(cls)
-          && !cls.isNative()) {
+          && !cls.isNative) {
         owner = cls;
       }
     }
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
index f7184d1..6b5b48f 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
@@ -116,14 +116,14 @@
     });
 
     var body;  // List or jsAst.Statement.
-    if (member.hasFixedBackendName()) {
+    if (member.hasFixedBackendName) {
       body = task.nativeEmitter.generateParameterStubStatements(
           member, isInterceptedMethod, invocationName,
           parametersBuffer, argumentsBuffer,
           indexOfLastOptionalArgumentInParameters);
-    } else if (member.isInstanceMember()) {
+    } else if (member.isInstanceMember) {
       if (needsSuperGetter(member)) {
-        ClassElement superClass = member.getEnclosingClass();
+        ClassElement superClass = member.enclosingClass;
         String methodName = namer.getNameOfInstanceMember(member);
         // When redirecting, we must ensure that we don't end up in a subclass.
         // We thus can't just invoke `this.foo$1.call(filledInArguments)`.
@@ -150,12 +150,12 @@
 
   void addParameterStubs(FunctionElement member, AddStubFunction defineStub,
                          [bool canTearOff = false]) {
-    if (member.enclosingElement.isClosure()) {
+    if (member.enclosingElement.isClosure) {
       ClosureClassElement cls = member.enclosingElement;
       if (cls.supertype.element == compiler.boundClosureClass) {
         compiler.internalError(cls.methodElement, 'Bound closure1.');
       }
-      if (cls.methodElement.isInstanceMember()) {
+      if (cls.methodElement.isInstanceMember) {
         compiler.internalError(cls.methodElement, 'Bound closure2.');
       }
     }
@@ -192,7 +192,7 @@
     // (2) foo$3$c(a, b, c) => MyClass.foo$4$c$d(this, a, b, c, null);
     // (3) foo$3$d(a, b, d) => MyClass.foo$4$c$d(this, a, b, null, d);
 
-    Set<Selector> selectors = member.isInstanceMember()
+    Set<Selector> selectors = member.isInstanceMember
         ? compiler.codegenWorld.invokedNames[member.name]
         : null; // No stubs needed for static methods.
 
@@ -204,7 +204,7 @@
       if (callSelectors == null) return null;
       return callSelectors.map((Selector callSelector) {
         return new Selector.call(
-            member.name, member.getLibrary(),
+            member.name, member.library,
             callSelector.argumentCount, callSelector.namedArguments);
       }).toSet();
     }
@@ -233,7 +233,7 @@
       if (selectors != null) {
         for (Selector selector in selectors) {
           selector = new Selector.call(
-              member.name, member.getLibrary(),
+              member.name, member.library,
               selector.argumentCount, selector.namedArguments);
           if (!selector.appliesUnnamed(member, compiler)) continue;
           if (untypedSelectors.add(selector)) {
@@ -254,19 +254,19 @@
                              Set<Selector> selectors,
                              AddPropertyFunction addProperty) {
     assert(invariant(member, member.isDeclaration));
-    LibraryElement memberLibrary = member.getLibrary();
+    LibraryElement memberLibrary = member.library;
     // If the method is intercepted, the stub gets the
     // receiver explicitely and we need to pass it to the getter call.
     bool isInterceptedMethod = backend.isInterceptedMethod(member);
     bool isInterceptorClass =
-        backend.isInterceptorClass(member.getEnclosingClass());
+        backend.isInterceptorClass(member.enclosingClass);
 
     const String receiverArgumentName = r'$receiver';
 
     jsAst.Expression buildGetter() {
       jsAst.Expression receiver =
           js(isInterceptorClass ? receiverArgumentName : 'this');
-      if (member.isGetter()) {
+      if (member.isGetter) {
         String getterName = namer.getterName(member);
         if (isInterceptedMethod) {
           return js('this.#(#)', [getterName, receiver]);
@@ -320,7 +320,7 @@
    */
   void emitExtraAccessors(Element member, ClassBuilder builder) {
     assert(invariant(member, member.isDeclaration));
-    if (member.isGetter() || member.isField()) {
+    if (member.isGetter || member.isField) {
       Set<Selector> selectors = compiler.codegenWorld.invokedNames[member.name];
       if (selectors != null && !selectors.isEmpty) {
         emitCallStubForGetter(member, selectors, builder.addProperty);
@@ -331,24 +331,18 @@
   void addMember(Element member, ClassBuilder builder) {
     assert(invariant(member, member.isDeclaration));
 
-    if (member.isField()) {
+    if (member.isField) {
       addMemberField(member, builder);
-    } else if (member.isFunction() ||
-               member.isGenerativeConstructorBody() ||
-               member.isGenerativeConstructor() ||
-               member.isAccessor()) {
+    } else if (member.isFunction ||
+               member.isGenerativeConstructorBody ||
+               member.isGenerativeConstructor ||
+               member.isAccessor) {
       addMemberMethod(member, builder);
     } else {
       compiler.internalError(member,
           'Unexpected kind: "${member.kind}".');
     }
-    if (member.isInstanceMember()) emitExtraAccessors(member, builder);
-  }
-
-  bool _isOperator(FunctionElement member) {
-    // TODO(18740): there must be a better way to know if an element is an
-    // operator.
-    return Elements.operatorNameToIdentifier(member.name) != member.name;
+    if (member.isInstanceMember) emitExtraAccessors(member, builder);
   }
 
   void addMemberMethod(FunctionElement member, ClassBuilder builder) {
@@ -361,24 +355,24 @@
     bool needsStubs = !parameters.optionalParameters.isEmpty;
     bool canTearOff = false;
     bool isClosure = false;
-    bool isNotApplyTarget = !member.isFunction() ||
-                            member.isConstructor() ||
-                            member.isAccessor();
+    bool isNotApplyTarget = !member.isFunction ||
+                            member.isConstructor ||
+                            member.isAccessor;
     String tearOffName;
 
     final bool canBeReflected = backend.isAccessibleByReflection(member);
 
     if (isNotApplyTarget) {
       canTearOff = false;
-    } else if (member.isInstanceMember()) {
-      if (member.getEnclosingClass().isClosure()) {
+    } else if (member.isInstanceMember) {
+      if (member.enclosingClass.isClosure) {
         canTearOff = false;
         isClosure = true;
       } else {
         // Careful with operators.
         canTearOff =
             compiler.codegenWorld.hasInvokedGetter(member, compiler) ||
-            (canBeReflected && !_isOperator(member));
+            (canBeReflected && !member.isOperator);
         assert(!needsSuperGetter(member) || canTearOff);
         tearOffName = namer.getterName(member);
       }
@@ -406,9 +400,9 @@
     }
 
     if (canTearOff) {
-      assert(invariant(member, !member.isGenerativeConstructor()));
-      assert(invariant(member, !member.isGenerativeConstructorBody()));
-      assert(invariant(member, !member.isConstructor()));
+      assert(invariant(member, !member.isGenerativeConstructor));
+      assert(invariant(member, !member.isGenerativeConstructorBody));
+      assert(invariant(member, !member.isConstructor));
     }
 
     // This element is needed for reflection or needs additional stubs. So we
@@ -424,7 +418,7 @@
     // M+1. Call name of first stub.
     // ...
     // N.   Getter name for tearOff.
-    // N+1. (Required parameter count << 1) + (member.isAccessor() ? 1 : 0).
+    // N+1. (Required parameter count << 1) + (member.isAccessor ? 1 : 0).
     // N+2. (Optional parameter count << 1) +
     //                      (parameters.optionalParametersAreNamed ? 1 : 0).
     // N+3. Index to function type in constant pool.
@@ -441,7 +435,7 @@
     List<jsAst.Expression> expressions = <jsAst.Expression>[];
 
     String callSelectorString = 'null';
-    if (member.isFunction()) {
+    if (member.isFunction) {
       Selector callSelector =
           new Selector.fromElement(member, compiler).toCallSelector();
       callSelectorString = '"${namer.invocationName(callSelector)}"';
@@ -450,7 +444,7 @@
     // On [requiredParameterCount], the lower bit is set if this method can be
     // called reflectively.
     int requiredParameterCount = parameters.requiredParameterCount << 1;
-    if (member.isAccessor()) requiredParameterCount++;
+    if (member.isAccessor) requiredParameterCount++;
 
     int optionalParameterCount = parameters.optionalParameterCount << 1;
     if (parameters.optionalParametersAreNamed) optionalParameterCount++;
@@ -463,7 +457,7 @@
     if (needsStubs || canTearOff) {
       addParameterStubs(member, (Selector selector, jsAst.Fun function) {
         expressions.add(function);
-        if (member.isInstanceMember()) {
+        if (member.isInstanceMember) {
           Set invokedSelectors =
               compiler.codegenWorld.invokedNames[member.name];
             expressions.add(js.string(namer.invocationName(selector)));
@@ -487,7 +481,7 @@
     jsAst.Expression memberTypeExpression;
     if (canTearOff || canBeReflected) {
       DartType memberType;
-      if (member.isGenerativeConstructorBody()) {
+      if (member.isGenerativeConstructorBody) {
         var body = member;
         memberType = body.constructor.type;
       } else {
@@ -507,7 +501,7 @@
 
     expressions
         ..addAll(tearOffInfo)
-        ..add((tearOffName == null || member.isAccessor())
+        ..add((tearOffName == null || member.isAccessor)
               ? js("null") : js.string(tearOffName))
         ..add(js.number(requiredParameterCount))
         ..add(js.number(optionalParameterCount))
@@ -535,7 +529,7 @@
     }
     if (canBeReflected) {
       jsAst.LiteralString reflectionName;
-      if (member.isConstructor()) {
+      if (member.isConstructor) {
         String reflectionNameString = task.getReflectionName(member, name);
         reflectionName =
             new jsAst.LiteralString(
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart
index f206e60..1338867 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart
@@ -201,7 +201,7 @@
   jsAst.Statement fastPathForOneShotInterceptor(Selector selector,
                                                 Set<ClassElement> classes) {
 
-    if (selector.isOperator()) {
+    if (selector.isOperator) {
       String name = selector.name;
       if (name == '==') {
         return js.statement('''{
@@ -238,7 +238,7 @@
             return (~receiver) >>> 0;
           ''');
       }
-    } else if (selector.isIndex() || selector.isIndexSet()) {
+    } else if (selector.isIndex || selector.isIndexSet) {
       // For an index operation, this code generates:
       //
       //    if (receiver.constructor == Array || typeof receiver == "string") {
@@ -263,7 +263,7 @@
       // The index set operator requires a check on its set value in
       // checked mode, so we don't optimize the interceptor if the
       // compiler has type assertions enabled.
-      if (selector.isIndexSet()
+      if (selector.isIndexSet
           && (compiler.enableTypeAssertions || !containsArray)) {
         return null;
       }
@@ -278,7 +278,7 @@
         return left == null ? right : js('# || #', [left, right]);
       }
 
-      if (selector.isIndex()) {
+      if (selector.isIndex) {
         jsAst.Expression typeCheck;
         if (containsArray) {
           typeCheck = arrayCheck;
@@ -330,7 +330,7 @@
       List<String> parameterNames = <String>[];
       parameterNames.add('receiver');
 
-      if (selector.isSetter()) {
+      if (selector.isSetter) {
         parameterNames.add('value');
       } else {
         for (int i = 0; i < selector.argumentCount; i++) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart
index a667a6a..06e05c8 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart
@@ -19,22 +19,6 @@
                                         JavaScriptBackend backend) {
   Namer namer = backend.namer;
   Compiler compiler = backend.compiler;
-  Element closureFromTearOff = compiler.findHelper('closureFromTearOff');
-  String tearOffAccess;
-  String tearOffGlobalObjectName;
-  String tearOffGlobalObject;
-  if (closureFromTearOff != null) {
-    // TODO(sra): Replace with AST.
-    tearOffAccess = namer.isolateAccess(closureFromTearOff);
-    tearOffGlobalObjectName = tearOffGlobalObject =
-        namer.globalObjectFor(closureFromTearOff);
-  } else {
-    // Default values for mocked-up test libraries.
-    tearOffAccess =
-        r'''function() { throw 'Helper \'closureFromTearOff\' missing.' }''';
-    tearOffGlobalObjectName = 'MissingHelperFunction';
-    tearOffGlobalObject = '($tearOffAccess())';
-  }
 
   String metadataField = '"${namer.metadataField}"';
   String reflectableField = namer.reflectableField;
@@ -54,9 +38,6 @@
 
 
   String header = '''
-(function (reflectionData) {
-  "use strict";
-
 // [map] returns an object literal that V8 shouldn not try to optimize with a
 // hidden class. This prevents a potential performance problem where V8 tries
 // to build a hidden class for an object used as a hashMap.
@@ -219,52 +200,7 @@
   }
 ''';
 
-  String tearOff = '''
-  function tearOffGetterNoCsp(funcs, reflectionInfo, name, isIntercepted) {
-    return isIntercepted
-        ? new Function("funcs", "reflectionInfo", "name",
-                       "$tearOffGlobalObjectName", "c",
-            "return function tearOff_" + name + (functionCounter++)+ "(x) {" +
-              "if (c === null) c = $tearOffAccess(" +
-                  "this, funcs, reflectionInfo, false, [x], name);" +
-              "return new c(this, funcs[0], x, name);" +
-            "}")(funcs, reflectionInfo, name, $tearOffGlobalObject, null)
-        : new Function("funcs", "reflectionInfo", "name",
-                       "$tearOffGlobalObjectName", "c",
-            "return function tearOff_" + name + (functionCounter++)+ "() {" +
-              "if (c === null) c = $tearOffAccess(" +
-                  "this, funcs, reflectionInfo, false, [], name);" +
-              "return new c(this, funcs[0], null, name);" +
-            "}")(funcs, reflectionInfo, name, $tearOffGlobalObject, null);
-  }
-  function tearOffGetterCsp(funcs, reflectionInfo, name, isIntercepted) {
-    var cache = null;
-    return isIntercepted
-        ? function(x) {
-            if (cache === null) cache = $tearOffAccess(
-                this, funcs, reflectionInfo, false, [x], name);
-            return new cache(this, funcs[0], x, name);
-          }
-        : function() {
-            if (cache === null) cache = $tearOffAccess(
-                this, funcs, reflectionInfo, false, [], name);
-            return new cache(this, funcs[0], null, name);
-          };
-  }
-  function tearOff(funcs, reflectionInfo, isStatic, name, isIntercepted) {
-    var cache;
-    return isStatic
-        ? function() {
-            if (cache === void 0) cache = $tearOffAccess(
-                this, funcs, reflectionInfo, true, [], name).prototype;
-            return cache;
-          }
-        : tearOffGetter(funcs, reflectionInfo, name, isIntercepted);
-  }
-''';
-
-
-
+  List<jsAst.Statement> tearOffCode = buildTearOffCode(backend);
 
   String init = '''
   var functionCounter = 0;
@@ -305,19 +241,105 @@
     var fields = descriptor && descriptor["${namer.classDescriptorProperty}"];
     var classes = [];
     var functions = [];
-''';
-
-String footer = '''
     processStatics(descriptor);
     libraries.push([name, uri, classes, functions, metadata, fields, isRoot,
                     globalObject]);
   }
-})
 ''';
 
-  return js('$header$processStatics$addStubs$tearOff$init$footer');
+  return js('''
+(function (reflectionData) {
+  "use strict";
+  $header
+  $processStatics
+  $addStubs
+  #; // tearOffCode
+  $init
+})'''  , [tearOffCode]);
 }
 
+
+List<jsAst.Statement> buildTearOffCode(JavaScriptBackend backend) {
+  Namer namer = backend.namer;
+  Compiler compiler = backend.compiler;
+
+  Element closureFromTearOff = compiler.findHelper('closureFromTearOff');
+  String tearOffAccessText;
+  jsAst.Expression tearOffAccessExpression;
+  String tearOffGlobalObjectName;
+  String tearOffGlobalObject;
+  if (closureFromTearOff != null) {
+    // We need both the AST that references [closureFromTearOff] and a string
+    // for the NoCsp version that constructs a function.
+    tearOffAccessExpression = namer.elementAccess(closureFromTearOff);
+    tearOffAccessText =
+        jsAst.prettyPrint(tearOffAccessExpression, compiler).getText();
+    tearOffGlobalObjectName = tearOffGlobalObject =
+        namer.globalObjectFor(closureFromTearOff);
+  } else {
+    // Default values for mocked-up test libraries.
+    tearOffAccessText =
+        r'''function() { throw 'Helper \'closureFromTearOff\' missing.' }''';
+    tearOffAccessExpression = js(tearOffAccessText);
+    tearOffGlobalObjectName = 'MissingHelperFunction';
+    tearOffGlobalObject = '($tearOffAccessText())';
+  }
+
+  // This template is uncached because it is constructed from code fragments
+  // that can change from compilation to compilation.  Some of these could be
+  // avoided, except for the string literals that contain the compiled access
+  // path to 'closureFromTearOff'.
+  jsAst.Statement tearOffGetterNoCsp = js.uncachedStatementTemplate('''
+    function tearOffGetterNoCsp(funcs, reflectionInfo, name, isIntercepted) {
+      return isIntercepted
+          ? new Function("funcs", "reflectionInfo", "name",
+                         "$tearOffGlobalObjectName", "c",
+              "return function tearOff_" + name + (functionCounter++)+ "(x) {" +
+                "if (c === null) c = $tearOffAccessText(" +
+                    "this, funcs, reflectionInfo, false, [x], name);" +
+                "return new c(this, funcs[0], x, name);" +
+              "}")(funcs, reflectionInfo, name, $tearOffGlobalObject, null)
+          : new Function("funcs", "reflectionInfo", "name",
+                         "$tearOffGlobalObjectName", "c",
+              "return function tearOff_" + name + (functionCounter++)+ "() {" +
+                "if (c === null) c = $tearOffAccessText(" +
+                    "this, funcs, reflectionInfo, false, [], name);" +
+                "return new c(this, funcs[0], null, name);" +
+              "}")(funcs, reflectionInfo, name, $tearOffGlobalObject, null);
+    }''').instantiate([]);
+
+  jsAst.Statement tearOffGetterCsp = js.statement('''
+    function tearOffGetterCsp(funcs, reflectionInfo, name, isIntercepted) {
+      var cache = null;
+      return isIntercepted
+          ? function(x) {
+              if (cache === null) cache = #(
+                  this, funcs, reflectionInfo, false, [x], name);
+              return new cache(this, funcs[0], x, name);
+            }
+          : function() {
+              if (cache === null) cache = #(
+                  this, funcs, reflectionInfo, false, [], name);
+              return new cache(this, funcs[0], null, name);
+            };
+    }''', [tearOffAccessExpression, tearOffAccessExpression]);
+
+  jsAst.Statement tearOff = js.statement('''
+    function tearOff(funcs, reflectionInfo, isStatic, name, isIntercepted) {
+      var cache;
+      return isStatic
+          ? function() {
+              if (cache === void 0) cache = #(
+                  this, funcs, reflectionInfo, true, [], name).prototype;
+              return cache;
+            }
+          : tearOffGetter(funcs, reflectionInfo, name, isIntercepted);
+    }''', tearOffAccessExpression);
+
+  return <jsAst.Statement>[tearOffGetterNoCsp, tearOffGetterCsp, tearOff];
+}
+
+
 String readString(String array, String index) {
   return readChecked(
       array, index, 'result != null && typeof result != "string"', 'string');
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
index af6c82e..63215e1 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
@@ -35,7 +35,7 @@
     if (cachedClassesUsingTypeVariableTests == null) {
       cachedClassesUsingTypeVariableTests = compiler.codegenWorld.isChecks
           .where((DartType t) => t is TypeVariableType)
-          .map((TypeVariableType v) => v.element.getEnclosingClass())
+          .map((TypeVariableType v) => v.element.enclosingClass)
           .toList();
     }
     return cachedClassesUsingTypeVariableTests;
@@ -52,10 +52,11 @@
       builder.addProperty(namer.operatorIs(other), js('true'));
     }
 
-    void generateFunctionTypeSignature(Element method, FunctionType type) {
+    void generateFunctionTypeSignature(FunctionElement method,
+                                       FunctionType type) {
       assert(method.isImplementation);
       jsAst.Expression thisAccess = new jsAst.This();
-      Node node = method.parseNode(compiler);
+      Node node = method.node;
       ClosureClassMap closureData =
           compiler.closureToClassMapper.closureMappingCache[node];
       if (closureData != null) {
@@ -116,7 +117,7 @@
     ClassElement superclass = cls.superclass;
 
     bool haveSameTypeVariables(ClassElement a, ClassElement b) {
-      if (a.isClosure()) return true;
+      if (a.isClosure) return true;
       return backend.rti.isTrivialSubstitution(a, b);
     }
 
@@ -166,7 +167,7 @@
         // If [cls] is a closure, it has a synthetic call operator method.
         call = cls.lookupBackendMember(Compiler.CALL_OPERATOR_NAME);
       }
-      if (call != null && call.isFunction()) {
+      if (call != null && call.isFunction) {
         generateInterfacesIsTests(compiler.functionClass,
                                   emitIsTest,
                                   emitSubstitution,
@@ -372,12 +373,12 @@
     }
 
     bool canTearOff(Element function) {
-      if (!function.isFunction() ||
-          function.isConstructor() ||
-          function.isAccessor()) {
+      if (!function.isFunction ||
+          function.isConstructor ||
+          function.isAccessor) {
         return false;
-      } else if (function.isInstanceMember()) {
-        if (!function.getEnclosingClass().isClosure()) {
+      } else if (function.isInstanceMember) {
+        if (!function.enclosingClass.isClosure) {
           return compiler.codegenWorld.hasInvokedGetter(function, compiler);
         }
       }
diff --git a/sdk/lib/_internal/compiler/implementation/library_loader.dart b/sdk/lib/_internal/compiler/implementation/library_loader.dart
index 6592d2a..7ebe1f31 100644
--- a/sdk/lib/_internal/compiler/implementation/library_loader.dart
+++ b/sdk/lib/_internal/compiler/implementation/library_loader.dart
@@ -551,7 +551,7 @@
       String prefix = import.prefix.source;
       Element existingElement = importingLibrary.find(prefix);
       PrefixElement prefixElement;
-      if (existingElement == null || !existingElement.isPrefix()) {
+      if (existingElement == null || !existingElement.isPrefix) {
         prefixElement = new PrefixElementX(prefix,
             importingLibrary.entryCompilationUnit, import.getBeginToken());
       } else {
@@ -739,7 +739,7 @@
                                Link<Export> duplicateExports,
                                {bool reportError: true}) {
       assert(invariant(library, !duplicateExports.isEmpty,
-          message: "No export for $duplicate from ${duplicate.getLibrary()} "
+          message: "No export for $duplicate from ${duplicate.library} "
                    "in $library."));
       compiler.withCurrentElement(library, () {
         for (Export export in duplicateExports) {
@@ -758,7 +758,7 @@
     void reportDuplicateExportDecl(Element duplicate,
                                    Link<Export> duplicateExports) {
       assert(invariant(library, !duplicateExports.isEmpty,
-          message: "No export for $duplicate from ${duplicate.getLibrary()} "
+          message: "No export for $duplicate from ${duplicate.library} "
                    "in $library."));
       compiler.reportInfo(duplicate, MessageKind.DUPLICATE_EXPORT_DECL,
           {'name': name, 'uriString': duplicateExports.head.uri});
@@ -766,13 +766,13 @@
 
     Element existingElement = exportScope[name];
     if (existingElement != null && existingElement != element) {
-      if (existingElement.isErroneous()) {
+      if (existingElement.isErroneous) {
         reportDuplicateExport(element, exports);
         reportDuplicateExportDecl(element, exports);
         element = existingElement;
-      } else if (existingElement.getLibrary() == library) {
+      } else if (existingElement.library == library) {
         // Do nothing. [existingElement] hides [element].
-      } else if (element.getLibrary() == library) {
+      } else if (element.library == library) {
         // [element] hides [existingElement].
         exportScope[name] = element;
         exporters[element] = exports;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
index 82e593d..260870a 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
@@ -48,7 +48,7 @@
   void _forEachElement(f(Element element)) => _element.forEachLocalMember(f);
 
   Iterable<Dart2JsDeclarationMirror> _getDeclarationMirrors(Element element) {
-    if (element.isClass() || element.isTypedef()) {
+    if (element.isClass || element.isTypedef) {
       return [mirrorSystem._getTypeDeclarationMirror(element)];
     } else {
       return super._getDeclarationMirrors(element);
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
index a959146..2a3bcc1 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
@@ -10,7 +10,7 @@
 
 abstract class Dart2JsMemberMirror extends Dart2JsElementMirror {
 
-  Dart2JsMemberMirror(Dart2JsMirrorSystem system, Element element)
+  Dart2JsMemberMirror(Dart2JsMirrorSystem system, AstElement element)
       : super(system, element);
 
   bool get isStatic => false;
@@ -36,36 +36,6 @@
   String toString() => text;
 }
 
-
-String _getOperatorFromOperatorName(String name) {
-  Map<String, String> mapping = const {
-    'eq': '==',
-    'not': '~',
-    'index': '[]',
-    'indexSet': '[]=',
-    'mul': '*',
-    'div': '/',
-    'mod': '%',
-    'tdiv': '~/',
-    'add': '+',
-    'sub': '-',
-    'shl': '<<',
-    'shr': '>>',
-    'ge': '>=',
-    'gt': '>',
-    'le': '<=',
-    'lt': '<',
-    'and': '&',
-    'xor': '^',
-    'or': '|',
-  };
-  String newName = mapping[name];
-  if (newName == null) {
-    throw new Exception('Unhandled operator name: $name');
-  }
-  return newName;
-}
-
 class Dart2JsMethodMirror extends Dart2JsMemberMirror
     implements MethodMirror {
   final Dart2JsDeclarationMirror owner;
@@ -81,11 +51,9 @@
 
   factory Dart2JsMethodMirror(Dart2JsDeclarationMirror owner,
                               FunctionElement function) {
-    String realName = function.name;
+    String simpleName = function.name;
     // TODO(ahe): This method should not be calling
     // Elements.operatorNameToIdentifier.
-    String simpleName =
-        Elements.operatorNameToIdentifier(function.name);
     Dart2JsMethodKind kind;
     if (function.kind == ElementKind.GETTER) {
       kind = Dart2JsMethodKind.GETTER;
@@ -94,25 +62,16 @@
       simpleName = '$simpleName=';
     } else if (function.kind == ElementKind.GENERATIVE_CONSTRUCTOR) {
       // TODO(johnniwinther): Support detection of redirecting constructors.
-      if (function.modifiers.isConst()) {
+      if (function.isConst) {
         kind = Dart2JsMethodKind.CONST;
       } else {
         kind = Dart2JsMethodKind.GENERATIVE;
       }
-    } else if (function.modifiers.isFactory()) {
+    } else if (function.isFactoryConstructor) {
       // TODO(johnniwinther): Support detection of redirecting constructors.
       kind = Dart2JsMethodKind.FACTORY;
-    } else if (realName == 'unary-') {
-      // TODO(johnniwinther): Use a constant for 'unary-'.
+    } else if (function.isOperator) {
       kind = Dart2JsMethodKind.OPERATOR;
-      // Simple name is 'unary-'.
-      simpleName = 'unary-';
-    } else if (simpleName.startsWith('operator\$')) {
-      // TODO(18740, johnniwinther): this fails for methods like `operator$foo`.
-      String str = simpleName.substring(9);
-      simpleName = 'operator';
-      kind = Dart2JsMethodKind.OPERATOR;
-      simpleName = _getOperatorFromOperatorName(str);
     } else {
       kind = Dart2JsMethodKind.REGULAR;
     }
@@ -133,7 +92,7 @@
 
   bool get isSynthetic => false;
 
-  bool get isStatic => _function.modifiers.isStatic();
+  bool get isStatic => _function.isStatic;
 
   List<ParameterMirror> get parameters {
     return _parametersFromFunctionSignature(this,
@@ -189,11 +148,11 @@
 
   bool get isTopLevel => owner is LibraryMirror;
 
-  bool get isStatic => _variable.modifiers.isStatic();
+  bool get isStatic => _variable.isStatic;
 
-  bool get isFinal => _variable.modifiers.isFinal();
+  bool get isFinal => _variable.isFinal;
 
-  bool get isConst => _variable.modifiers.isConst();
+  bool get isConst => _variable.isConst;
 
   TypeMirror get type => owner._getTypeMirror(_variable.type);
 
@@ -227,9 +186,7 @@
 
   ParameterElement get _element => super._element;
 
-  TypeMirror get type => owner._getTypeMirror(_element.type,
-                                              _element.functionSignature);
-
+  TypeMirror get type => owner._getTypeMirror(_element.type);
 
   bool get isFinal => false;
 
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
index 85199f1..7530c86 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
@@ -97,25 +97,13 @@
 
   Symbol get qualifiedName => symbolOf(_qualifiedNameString, getLibrary(this));
 
-  /**
-   * Returns the first token for the source of this declaration, not including
-   * metadata annotations.
-   */
-  Token getBeginToken();
+  DeclarationMirror lookupInScope(String name) => null;
 
-  /**
-   * Returns the last token for the source of this declaration.
-   */
-  Token getEndToken();
-
-  /**
-   * Returns the script for the source of this declaration.
-   */
-  Script getScript();
+  bool get isNameSynthetic => false;
 
   /// Returns the type mirror for [type] in the context of this declaration.
-  TypeMirror _getTypeMirror(DartType type, [FunctionSignature signature]) {
-    return mirrorSystem._convertTypeToTypeMirror(type, signature);
+  TypeMirror _getTypeMirror(DartType type) {
+    return mirrorSystem._convertTypeToTypeMirror(type);
   }
 
   /// Returns a list of the declaration mirrorSystem for [element].
@@ -141,7 +129,6 @@
         "Unexpected member type $element ${element.kind}.");
     return null;
   }
-
 }
 
 abstract class Dart2JsElementMirror extends Dart2JsDeclarationMirror {
@@ -156,19 +143,19 @@
 
   String get _simpleNameString => _element.name;
 
-  bool get isNameSynthetic => false;
-
   /**
    * Computes the first token for this declaration using the begin token of the
    * element node or element position as indicator.
    */
   Token getBeginToken() {
-    // TODO(johnniwinther): Avoid calling [parseNode].
-    Node node = _element.parseNode(mirrorSystem.compiler);
-    if (node == null) {
-      return _element.position();
+    Element element = _element;
+    if (element is AstElement) {
+      Node node = element.node;
+      if (node != null) {
+        return node.getBeginToken();
+      }
     }
-    return node.getBeginToken();
+    return element.position;
   }
 
   /**
@@ -176,12 +163,14 @@
    * element node or element position as indicator.
    */
   Token getEndToken() {
-    // TODO(johnniwinther): Avoid calling [parseNode].
-    Node node = _element.parseNode(mirrorSystem.compiler);
-    if (node == null) {
-      return _element.position();
+    Element element = _element;
+    if (element is AstElement) {
+      Node node = element.node;
+      if (node != null) {
+        return node.getEndToken();
+      }
     }
-    return node.getEndToken();
+    return element.position;
   }
 
   /**
@@ -199,7 +188,7 @@
     return getBeginToken();
   }
 
-  Script getScript() => _element.getCompilationUnit().script;
+  Script getScript() => _element.compilationUnit.script;
 
   SourceLocation get location {
     Token beginToken = getFirstToken();
@@ -251,7 +240,7 @@
       String prefix = name.substring(0, index);
       String id = name.substring(index+1);
       result = scope.lookup(prefix);
-      if (result != null && result.isPrefix()) {
+      if (result != null && result.isPrefix) {
         PrefixElement prefix = result;
         result = prefix.lookupLocalMember(id);
       } else {
@@ -261,7 +250,7 @@
       // Lookup [: id :].
       result = scope.lookup(name);
     }
-    if (result == null || result.isPrefix()) return null;
+    if (result == null || result.isPrefix) return null;
     return _convertElementToDeclarationMirror(mirrorSystem, result);
   }
 
@@ -322,10 +311,9 @@
       _convertTypeToTypeMirror(compiler.types.dynamicType);
 
   TypeMirror get voidType =>
-      _convertTypeToTypeMirror(compiler.types.voidType);
+      _convertTypeToTypeMirror(const VoidType());
 
-  TypeMirror _convertTypeToTypeMirror(DartType type,
-                                      [FunctionSignature signature]) {
+  TypeMirror _convertTypeToTypeMirror(DartType type) {
     assert(type != null);
     if (type.treatAsDynamic) {
       return new Dart2JsDynamicMirror(this, type);
@@ -338,7 +326,7 @@
     } else if (type is TypeVariableType) {
       return new Dart2JsTypeVariableMirror(this, type);
     } else if (type is FunctionType) {
-      return new Dart2JsFunctionTypeMirror(this, type, signature);
+      return new Dart2JsFunctionTypeMirror(this, type);
     } else if (type is VoidType) {
       return new Dart2JsVoidMirror(this, type);
     } else if (type is TypedefType) {
@@ -354,9 +342,9 @@
   }
 
   DeclarationMirror _getTypeDeclarationMirror(TypeDeclarationElement element) {
-    if (element.isClass()) {
+    if (element.isClass) {
       return new Dart2JsClassDeclarationMirror(this, element.thisType);
-    } else if (element.isTypedef()) {
+    } else if (element.isTypedef) {
       return new Dart2JsTypedefDeclarationMirror(this, element.thisType);
     }
     compiler.internalError(element, "Unexpected element $element.");
@@ -404,27 +392,27 @@
  */
 DeclarationMirror _convertElementToDeclarationMirror(Dart2JsMirrorSystem system,
                                                      Element element) {
-  if (element.isTypeVariable()) {
+  if (element.isTypeVariable) {
     TypeVariableElement typeVariable = element;
     return new Dart2JsTypeVariableMirror(system, typeVariable.type);
   }
 
-  Dart2JsLibraryMirror library = system._libraryMap[element.getLibrary()];
-  if (element.isLibrary()) return library;
-  if (element.isTypedef()) {
+  Dart2JsLibraryMirror library = system._libraryMap[element.library];
+  if (element.isLibrary) return library;
+  if (element.isTypedef) {
     TypedefElement typedefElement = element;
     return new Dart2JsTypedefMirror.fromLibrary(
         library, typedefElement.thisType);
   }
 
   Dart2JsDeclarationMirror container = library;
-  if (element.getEnclosingClass() != null) {
-    container = system._getTypeDeclarationMirror(element.getEnclosingClass());
+  if (element.enclosingClass != null) {
+    container = system._getTypeDeclarationMirror(element.enclosingClass);
   }
-  if (element.isClass()) return container;
-  if (element.isParameter()) {
+  if (element.isClass) return container;
+  if (element.isParameter) {
     Dart2JsMethodMirror method = _convertElementMethodToMethodMirror(
-        container, element.getOutermostEnclosingMemberOrTopLevel());
+        container, element.outermostEnclosingMemberOrTopLevel);
     // TODO(johnniwinther): Find the right info for [isOptional] and [isNamed].
     return new Dart2JsParameterMirror(
         method, element, isOptional: false, isNamed: false);
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 46ac3e5..d8073d0 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
@@ -17,21 +17,14 @@
 }
 
 abstract class Dart2JsTypeMirror
-    extends Dart2JsElementMirror
-    implements TypeSourceMirror {
-  final DartType _type;
-
-  Dart2JsTypeMirror(Dart2JsMirrorSystem system, DartType type)
-    : super(system, type.element),
-      this._type = type;
+    implements Dart2JsDeclarationMirror, TypeSourceMirror {
+  DartType get _type;
 
   String get _simpleNameString => _type.name;
 
   Dart2JsDeclarationMirror get owner => library;
 
-  Dart2JsLibraryMirror get library {
-    return mirrorSystem._getLibrary(_type.element.getLibrary());
-  }
+  Dart2JsLibraryMirror get library;
 
   bool get hasReflectedType => throw new UnimplementedError();
 
@@ -71,6 +64,23 @@
   }
 
   String toString() => _type.toString();
+
+}
+
+/// Base implementations for mirrors on element based types.
+abstract class Dart2JsTypeElementMirror
+    extends Dart2JsElementMirror
+    with Dart2JsTypeMirror
+    implements TypeSourceMirror {
+  final DartType _type;
+
+  Dart2JsTypeElementMirror(Dart2JsMirrorSystem system, DartType type)
+    : super(system, type.element),
+      this._type = type;
+
+  Dart2JsLibraryMirror get library {
+    return mirrorSystem._getLibrary(_type.element.library);
+  }
 }
 
 abstract class DeclarationMixin implements TypeMirror {
@@ -82,7 +92,7 @@
   List<TypeMirror> get typeArguments => const <TypeMirror>[];
 }
 
-abstract class Dart2JsGenericTypeMirror extends Dart2JsTypeMirror {
+abstract class Dart2JsGenericTypeMirror extends Dart2JsTypeElementMirror {
   List<TypeMirror> _typeArguments;
   List<TypeVariableMirror> _typeVariables;
 
@@ -124,7 +134,7 @@
   }
 
   Iterable<Dart2JsMemberMirror> _getDeclarationMirrors(Element element) {
-    if (element.isTypeVariable()) {
+    if (element.isTypeVariable) {
       assert(invariant(_element, _element == element.enclosingElement,
           message: 'Foreigned type variable element $element.'));
       for (Dart2JsTypeVariableMirror mirror in typeVariables) {
@@ -134,10 +144,9 @@
     return super._getDeclarationMirrors(element);
   }
 
-  TypeMirror _getTypeMirror(DartType type, [FunctionSignature signature]) {
+  TypeMirror _getTypeMirror(DartType type) {
     return super._getTypeMirror(
-        type.subst(_type.typeArguments, _type.element.typeVariables),
-        signature);
+        type.subst(_type.typeArguments, _type.element.typeVariables));
   }
 
   TypeSourceMirror createInstantiation(
@@ -198,7 +207,8 @@
 
   bool isSubclassOf(Mirror other) {
     if (other is Dart2JsTypeMirror) {
-      return _element.isSubclassOf(other._type.element);
+      return other._type.element != null &&
+             _element.isSubclassOf(other._type.element);
     } else {
       throw new ArgumentError(other);
     }
@@ -226,7 +236,7 @@
   Map<Symbol, MethodMirror> get instanceMembers => null;
   Map<Symbol, MethodMirror> get staticMembers => null;
 
-  bool get isAbstract => _element.modifiers.isAbstract();
+  bool get isAbstract => _element.isAbstract;
 
   bool operator ==(other) {
     if (identical(this, other)) {
@@ -271,7 +281,7 @@
   var _definition;
 
   Dart2JsTypedefMirror(Dart2JsMirrorSystem system, TypedefType _typedef)
-      : this._library = system._getLibrary(_typedef.element.getLibrary()),
+      : this._library = system._getLibrary(_typedef.element.library),
         super(system, _typedef);
 
   Dart2JsTypedefMirror.fromLibrary(Dart2JsLibraryMirror library,
@@ -287,9 +297,7 @@
 
   FunctionTypeMirror get referent {
     if (_definition == null) {
-      _definition = _getTypeMirror(
-          _typedef.element.alias,
-          _typedef.element.functionSignature);
+      _definition = _getTypeMirror(_typedef.element.alias);
     }
     return _definition;
   }
@@ -311,7 +319,7 @@
   String toString() => 'Mirror on typedef ${_type.name}';
 }
 
-class Dart2JsTypeVariableMirror extends Dart2JsTypeMirror
+class Dart2JsTypeVariableMirror extends Dart2JsTypeElementMirror
     implements TypeVariableMirror {
   Dart2JsDeclarationMirror _owner;
 
@@ -349,16 +357,15 @@
   String toString() => 'Mirror on type variable $_type';
 }
 
-class Dart2JsFunctionTypeMirror extends Dart2JsTypeMirror
+class Dart2JsFunctionTypeMirror extends Dart2JsTypeElementMirror
     with ObjectMirrorMixin, ClassMirrorMixin, DeclarationMixin
     implements FunctionTypeMirror {
-  final FunctionSignature _functionSignature;
   List<ParameterMirror> _parameters;
 
   Dart2JsFunctionTypeMirror(Dart2JsMirrorSystem system,
-                            FunctionType functionType, this._functionSignature)
+                            FunctionType functionType)
       : super(system, functionType) {
-    assert (_functionSignature != null);
+    assert (functionType.element != null);
   }
 
   FunctionType get _type => super._type;
@@ -383,7 +390,7 @@
   bool get isFunction => true;
 
   MethodMirror get callMethod => _convertElementMethodToMethodMirror(
-      mirrorSystem._getLibrary(_type.element.getLibrary()),
+      mirrorSystem._getLibrary(_type.element.library),
       _type.element);
 
   ClassMirror get originalDeclaration =>
@@ -412,8 +419,8 @@
 
   List<ParameterMirror> get parameters {
     if (_parameters == null) {
-      _parameters = _parametersFromFunctionSignature(owner,
-                                                     _functionSignature);
+      _parameters = _parametersFromFunctionSignature(
+          owner, _type.element.functionSignature);
     }
     return _parameters;
   }
@@ -423,12 +430,13 @@
   bool isSubclassOf(ClassMirror other) => false;
 }
 
-class Dart2JsVoidMirror extends Dart2JsTypeMirror {
+class Dart2JsVoidMirror extends Dart2JsDeclarationMirror
+    with Dart2JsTypeMirror
+    implements TypeSourceMirror {
+  final Dart2JsMirrorSystem mirrorSystem;
+  final VoidType _type;
 
-  Dart2JsVoidMirror(Dart2JsMirrorSystem system, VoidType voidType)
-      : super(system, voidType);
-
-  VoidType get _voidType => _type;
+  Dart2JsVoidMirror(Dart2JsMirrorSystem this.mirrorSystem, VoidType this._type);
 
   Symbol get qualifiedName => simpleName;
 
@@ -438,9 +446,14 @@
   SourceLocation get location => null;
 
   /**
+   * The void type has no owner.
+   */
+  Dart2JsDeclarationMirror get owner => null;
+
+  /**
    * The void type has no library.
    */
-  LibraryMirror get library => null;
+  Dart2JsLibraryMirror get library => null;
 
   List<InstanceMirror> get metadata => const <InstanceMirror>[];
 
@@ -456,12 +469,12 @@
     return other.isVoid;
   }
 
-  int get hashCode => 13 * _element.hashCode;
+  int get hashCode => 13 * _type.hashCode;
 
   String toString() => 'Mirror on void';
 }
 
-class Dart2JsDynamicMirror extends Dart2JsTypeMirror {
+class Dart2JsDynamicMirror extends Dart2JsTypeElementMirror {
   Dart2JsDynamicMirror(Dart2JsMirrorSystem system, InterfaceType voidType)
       : super(system, voidType);
 
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
index 3041a42..2a5cefb 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
@@ -117,7 +117,7 @@
   /// the resolver to suppress hints about using new Symbol or
   /// MirrorSystem.getName.
   bool hasMirrorUsage(Element element) {
-    LibraryElement library = element.getLibrary();
+    LibraryElement library = element.library;
     // Internal libraries always have implicit mirror usage.
     return library.isInternalLibrary
         || (librariesWithUsage != null
@@ -136,7 +136,7 @@
 
       MirrorUsageBuilder builder =
           new MirrorUsageBuilder(
-              analyzer, mapping.currentElement.getLibrary(), named.expression,
+              analyzer, mapping.currentElement.library, named.expression,
               value, mapping);
 
       if (named.name.source == 'symbols') {
@@ -435,14 +435,14 @@
   /// Find the first non-implementation interface of constant.
   DartType apiTypeOf(Constant constant) {
     DartType type = constant.computeType(compiler);
-    LibraryElement library = type.element.getLibrary();
+    LibraryElement library = type.element.library;
     if (type.kind == TypeKind.INTERFACE && library.isInternalLibrary) {
       InterfaceType interface = type;
       ClassElement cls = type.element;
       cls.ensureResolved(compiler);
       for (DartType supertype in cls.allSupertypes) {
         if (supertype.kind == TypeKind.INTERFACE
-            && !supertype.element.getLibrary().isInternalLibrary) {
+            && !supertype.element.library.isInternalLibrary) {
           return interface.asInstanceOf(supertype.element);
         }
       }
@@ -526,7 +526,7 @@
     for (String identifier in identifiers) {
       Element e = findLocalMemberIn(current, identifier);
       if (e == null) {
-        if (current.isLibrary()) {
+        if (current.isLibrary) {
           LibraryElement library = current;
           compiler.reportHint(
               spannable, MessageKind.MIRRORS_CANNOT_RESOLVE_IN_LIBRARY,
@@ -549,7 +549,7 @@
   Element findLocalMemberIn(Element element, String name) {
     if (element is ScopeContainerElement) {
       ScopeContainerElement scope = element;
-      if (element.isClass()) {
+      if (element.isClass) {
         ClassElement cls = element;
         cls.ensureResolved(compiler);
       }
diff --git a/sdk/lib/_internal/compiler/implementation/native_handler.dart b/sdk/lib/_internal/compiler/implementation/native_handler.dart
index 20d082f..5f3f466 100644
--- a/sdk/lib/_internal/compiler/implementation/native_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/native_handler.dart
@@ -8,6 +8,7 @@
 import 'dart2jslib.dart';
 import 'dart_types.dart';
 import 'elements/elements.dart';
+import 'elements/modelx.dart' show ClassElementX, FunctionElementX;
 import 'js_backend/js_backend.dart';
 import 'resolution/resolution.dart' show ResolverVisitor;
 import 'scanner/scannerlib.dart';
@@ -137,7 +138,7 @@
   void processNativeClassesInLibrary(LibraryElement library) {
     // Use implementation to ensure the inclusion of injected members.
     library.implementation.forEachLocalMember((Element element) {
-      if (element.isClass() && element.isNative()) {
+      if (element.isClass && element.isNative) {
         processNativeClass(element);
       }
     });
@@ -161,7 +162,7 @@
 
     libraries.forEach((library) {
       library.implementation.forEachLocalMember((element) {
-        if (element.isClass()) {
+        if (element.isClass) {
           String name = element.name;
           String extendsName = findExtendsNameOfClass(element);
           if (extendsName != null) {
@@ -180,7 +181,7 @@
     // fact a subclass of a native class.
 
     ClassElement nativeSuperclassOf(ClassElement classElement) {
-      if (classElement.isNative()) return classElement;
+      if (classElement.isNative) return classElement;
       if (classElement.superclass == null) return null;
       return nativeSuperclassOf(classElement.superclass);
     }
@@ -191,7 +192,7 @@
       ClassElement nativeSuperclass = nativeSuperclassOf(element);
       if (nativeSuperclass != null) {
         nativeClassesAndSubclasses.add(element);
-        if (!element.isNative()) {
+        if (!element.isNative) {
           nonNativeSubclasses.putIfAbsent(nativeSuperclass,
               () => new Set<ClassElement>())
             .add(element);
@@ -264,7 +265,7 @@
     }
 
     return compiler.withCurrentElement(classElement, () {
-      return scanForExtendsName(classElement.position());
+      return scanForExtendsName(classElement.position);
     });
   }
 
@@ -347,7 +348,7 @@
     flushing = false;
   }
 
-  processClass(ClassElement classElement, cause) {
+  processClass(ClassElementX classElement, cause) {
     assert(!registeredClasses.contains(classElement));
 
     bool firstTime = registeredClasses.isEmpty;
@@ -368,14 +369,14 @@
 
   registerElement(Element element) {
     compiler.withCurrentElement(element, () {
-      if (element.isFunction() || element.isGetter() || element.isSetter()) {
+      if (element.isFunction || element.isGetter || element.isSetter) {
         handleMethodAnnotations(element);
-        if (element.isNative()) {
+        if (element.isNative) {
           registerMethodUsed(element);
         }
-      } else if (element.isField()) {
+      } else if (element.isField) {
         handleFieldAnnotations(element);
-        if (element.isNative()) {
+        if (element.isNative) {
           registerFieldLoad(element);
           registerFieldStore(element);
         }
@@ -384,12 +385,12 @@
   }
 
   handleFieldAnnotations(Element element) {
-    if (element.enclosingElement.isNative()) {
+    if (element.enclosingElement.isNative) {
       // Exclude non-instance (static) fields - they not really native and are
       // compiled as isolate globals.  Access of a property of a constructor
       // function or a non-method property in the prototype chain, must be coded
       // using a JS-call.
-      if (element.isInstanceMember()) {
+      if (element.isInstanceMember) {
         setNativeName(element);
       }
     }
@@ -409,8 +410,8 @@
     element.setNative(name);
   }
 
-  bool isNativeMethod(Element element) {
-    if (!element.getLibrary().canUseNative) return false;
+  bool isNativeMethod(FunctionElementX element) {
+    if (!element.library.canUseNative) return false;
     // Native method?
     return compiler.withCurrentElement(element, () {
       Node node = element.parseNode(compiler);
@@ -550,9 +551,10 @@
     for (String tag in nativeTagsOfClass(classElement)) {
       ClassElement owner = tagOwner[tag];
       if (owner != null) {
-        compiler.reportError(classElement,
-            MessageKind.GENERIC,
-            {'text': "Tag '$tag' already in use by '${owner.name}'"});
+        if (owner != classElement) {
+          compiler.internalError(
+              classElement, "Tag '$tag' already in use by '${owner.name}'");
+        }
       } else {
         tagOwner[tag] = classElement;
       }
@@ -596,7 +598,7 @@
   }
 
   void addSubtypes(ClassElement cls, NativeEmitter emitter) {
-    if (!cls.isNative()) return;
+    if (!cls.isNative) return;
     if (doneAddSubtypes.contains(cls)) return;
     doneAddSubtypes.add(cls);
 
@@ -616,7 +618,7 @@
     // natives classes.
     ClassElement superclass = cls.superclass;
     while (superclass != null && superclass.isMixinApplication) {
-      assert(!superclass.isNative());
+      assert(!superclass.isNative);
       superclass = superclass.superclass;
     }
 
@@ -991,7 +993,7 @@
 }
 
 void checkAllowedLibrary(ElementListener listener, Token token) {
-  LibraryElement currentLibrary = listener.compilationUnitElement.getLibrary();
+  LibraryElement currentLibrary = listener.compilationUnitElement.library;
   if (!currentLibrary.canUseNative) {
     listener.recoverableError(token, "Unexpected token");
   }
@@ -1112,8 +1114,8 @@
   // 3) foo() native "return 42";
   //      hasBody = true
   bool hasBody = false;
-  assert(element.isNative());
-  String nativeMethodName = element.fixedBackendName();
+  assert(element.isNative);
+  String nativeMethodName = element.fixedBackendName;
   if (nativeBody != null) {
     LiteralString jsCode = nativeBody.asLiteralString();
     String str = jsCode.dartString.slowToString();
@@ -1133,7 +1135,7 @@
     List<String> arguments = <String>[];
     List<HInstruction> inputs = <HInstruction>[];
     String receiver = '';
-    if (element.isInstanceMember()) {
+    if (element.isInstanceMember) {
       receiver = '#.';
       inputs.add(builder.localsHandler.readThis());
     }
diff --git a/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart b/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart
index 98cc60a..1ec9ff3 100644
--- a/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart
+++ b/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart
@@ -87,6 +87,22 @@
     }
   }
 
+  InterfaceType asInstanceOf(ClassElement cls) {
+    int level = cls.hierarchyDepth;
+    if (level < levels) {
+      Link<DartType> pointer = _levels[level];
+      Link<DartType> end =
+          level > 0 ? _levels[level - 1] : const Link<DartType>();
+      while (!identical(pointer, end)) {
+        if (cls == pointer.head.element) {
+          return pointer.head;
+        }
+        pointer = pointer.tail;
+      }
+    }
+    return null;
+  }
+
   String toString() => types.toString();
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/patch_parser.dart b/sdk/lib/_internal/compiler/implementation/patch_parser.dart
index 0b14e3a..acd97c4 100644
--- a/sdk/lib/_internal/compiler/implementation/patch_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/patch_parser.dart
@@ -334,7 +334,7 @@
     if (isMemberPatch || (isClassPatch && patch is ClassElement)) {
       // Apply patch.
       patch.addMetadata(popMetadataHack());
-      LibraryElement originLibrary = compilationUnitElement.getLibrary();
+      LibraryElement originLibrary = compilationUnitElement.library;
       assert(originLibrary.isPatched);
       Element origin = originLibrary.localLookup(patch.name);
       patchElement(listener, origin, patch);
@@ -404,23 +404,23 @@
         patch, leg.MessageKind.PATCH_NON_EXISTING, {'name': patch.name});
     return;
   }
-  if (!(origin.isClass() ||
-        origin.isConstructor() ||
-        origin.isFunction() ||
-        origin.isAbstractField())) {
+  if (!(origin.isClass ||
+        origin.isConstructor ||
+        origin.isFunction ||
+        origin.isAbstractField)) {
     // TODO(ahe): Remove this error when the parser rejects all bad modifiers.
     listener.reportError(origin, leg.MessageKind.PATCH_NONPATCHABLE);
     return;
   }
-  if (patch.isClass()) {
+  if (patch.isClass) {
     tryPatchClass(listener, origin, patch);
-  } else if (patch.isGetter()) {
+  } else if (patch.isGetter) {
     tryPatchGetter(listener, origin, patch);
-  } else if (patch.isSetter()) {
+  } else if (patch.isSetter) {
     tryPatchSetter(listener, origin, patch);
-  } else if (patch.isConstructor()) {
+  } else if (patch.isConstructor) {
     tryPatchConstructor(listener, origin, patch);
-  } else if(patch.isFunction()) {
+  } else if(patch.isFunction) {
     tryPatchFunction(listener, origin, patch);
   } else {
     // TODO(ahe): Remove this error when the parser rejects all bad modifiers.
@@ -431,7 +431,7 @@
 void tryPatchClass(leg.DiagnosticListener listener,
                     Element origin,
                     ClassElement patch) {
-  if (!origin.isClass()) {
+  if (!origin.isClass) {
     listener.reportError(
         origin, leg.MessageKind.PATCH_NON_CLASS, {'className': patch.name});
     listener.reportInfo(
@@ -454,7 +454,7 @@
 void tryPatchGetter(leg.DiagnosticListener listener,
                     Element origin,
                     FunctionElement patch) {
-  if (!origin.isAbstractField()) {
+  if (!origin.isAbstractField) {
     listener.reportError(
         origin, leg.MessageKind.PATCH_NON_GETTER, {'name': origin.name});
     listener.reportInfo(
@@ -477,7 +477,7 @@
 void tryPatchSetter(leg.DiagnosticListener listener,
                      Element origin,
                      FunctionElement patch) {
-  if (!origin.isAbstractField()) {
+  if (!origin.isAbstractField) {
     listener.reportError(
         origin, leg.MessageKind.PATCH_NON_SETTER, {'name': origin.name});
     listener.reportInfo(
@@ -500,7 +500,7 @@
 void tryPatchConstructor(leg.DiagnosticListener listener,
                           Element origin,
                           FunctionElement patch) {
-  if (!origin.isConstructor()) {
+  if (!origin.isConstructor) {
     listener.reportError(
         origin,
         leg.MessageKind.PATCH_NON_CONSTRUCTOR, {'constructorName': patch.name});
@@ -516,7 +516,7 @@
 void tryPatchFunction(leg.DiagnosticListener listener,
                       Element origin,
                       FunctionElement patch) {
-  if (!origin.isFunction()) {
+  if (!origin.isFunction) {
     listener.reportError(
         origin,
         leg.MessageKind.PATCH_NON_FUNCTION, {'functionName': patch.name});
@@ -531,7 +531,7 @@
 void patchFunction(leg.DiagnosticListener listener,
                    FunctionElementX origin,
                    FunctionElementX patch) {
-  if (!origin.modifiers.isExternal()) {
+  if (!origin.modifiers.isExternal) {
     listener.reportError(origin, leg.MessageKind.PATCH_NON_EXTERNAL);
     listener.reportInfo(
         patch,
@@ -542,10 +542,6 @@
     listener.internalError(origin,
         "Trying to patch a function more than once.");
   }
-  if (origin.cachedNode != null) {
-    listener.internalError(origin,
-        "Trying to patch an already compiled function.");
-  }
   origin.applyPatch(patch);
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart b/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart
index 9a1a085..6c34088 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart
@@ -70,7 +70,7 @@
   /// interface unless it is abstract or declares a `noSuchMethod` method.
   void computeAllMembers() {
     Map<Name, Member> declaredMembers = computeMembers(null, null);
-    if (!cls.modifiers.isAbstract() &&
+    if (!cls.isAbstract &&
         !declaredMembers.containsKey(const PublicName('noSuchMethod'))) {
       // Check for unimplemented members on concrete classes that neither have
       // a `@proxy` annotation nor declare a `noSuchMethod` method.
@@ -160,11 +160,11 @@
         }
       }
     } else {
-      LibraryElement library = cls.getLibrary();
+      LibraryElement library = cls.library;
       InterfaceType thisType = cls.thisType;
 
       void createMember(Element element) {
-        if (element.isConstructor()) return;
+        if (element.isConstructor) return;
         String elementName = element.name;
         if (shouldSkipName(elementName)) return;
         if (nameText != null && elementName != nameText) return;
@@ -187,22 +187,20 @@
         }
 
         Name name = new Name(element.name, library);
-        if (element.isField()) {
+        if (element.isField) {
           DartType type = element.computeType(compiler);
-          addDeclaredMember(name, type,
-              new FunctionType(compiler.functionClass, type));
-          if (!element.modifiers.isConst() &&
-              !element.modifiers.isFinal()) {
+          addDeclaredMember(name, type, new FunctionType.synthesized(type));
+          if (!element.isConst && !element.isFinal) {
             addDeclaredMember(name.setter, type,
-                new FunctionType(compiler.functionClass,
-                                 compiler.types.voidType,
+                new FunctionType.synthesized(
+                                 const VoidType(),
                                  const Link<DartType>().prepend(type)));
           }
-        } else if (element.isGetter()) {
+        } else if (element.isGetter) {
           FunctionType functionType = element.computeType(compiler);
           DartType type = functionType.returnType;
           addDeclaredMember(name, type, functionType);
-        } else if (element.isSetter()) {
+        } else if (element.isSetter) {
           FunctionType functionType = element.computeType(compiler);
           DartType type;
           if (!functionType.parameterTypes.isEmpty) {
@@ -213,7 +211,7 @@
           name = name.setter;
           addDeclaredMember(name, type, functionType);
         } else {
-          assert(invariant(element, element.isFunction()));
+          assert(invariant(element, element.isFunction));
           FunctionType type = element.computeType(compiler);
           addDeclaredMember(name, type, type);
         }
@@ -441,7 +439,7 @@
         errorneousElement,
         errorMessage,
         {'memberName': contextElement.name,
-         'className': contextElement.getEnclosingClass().name});
+         'className': contextElement.enclosingClass.name});
     compiler.reportInfo(contextElement, contextMessage);
   }
 
@@ -450,7 +448,7 @@
                                         ClassMemberMixin cls,
                                         String name) {
     if (cls.isMemberComputed(name)) return;
-    LibraryElement library = cls.getLibrary();
+    LibraryElement library = cls.library;
     _computeClassMember(compiler, cls, name,
         new Setlet<Name>()..add(new Name(name, library))
                           ..add(new Name(name, library, isSetter: true)));
@@ -488,7 +486,7 @@
   }
 
   void checkInterfaceImplementation() {
-    LibraryElement library = cls.getLibrary();
+    LibraryElement library = cls.library;
     classMembers.forEach((Name name, Member classMember) {
       if (!name.isAccessibleFrom(library)) return;
      checkInterfaceMember(name, classMember, classMember.implementation);
@@ -589,7 +587,7 @@
 
   /// Checks that a class member exists for every interface member.
   void checkInterfaceImplementation() {
-    LibraryElement library = cls.getLibrary();
+    LibraryElement library = cls.library;
     interfaceMembers.forEach((Name name, MemberSignature interfaceMember) {
       if (!name.isAccessibleFrom(library)) return;
       Member classMember = classMembers[name];
@@ -745,8 +743,7 @@
         namedParameterTypes =
             namedParameterTypes.prepend(compiler.types.dynamicType);
       }
-      FunctionType memberType = new FunctionType(
-          compiler.functionClass,
+      FunctionType memberType = new FunctionType.synthesized(
           compiler.types.dynamicType,
           requiredParameterTypes,
           optionalParameterTypes,
@@ -812,7 +809,6 @@
   void computeClassMember(Compiler compiler, String name, Setlet<Name> names) {
     if (isMemberComputed(name)) return;
     if (isPrivateName(name)) {
-      LibraryElement library = getLibrary();
       names..add(new Name(name, library))
            ..add(new Name(name, library, isSetter: true));
     }
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/member_impl.dart b/sdk/lib/_internal/compiler/implementation/resolution/member_impl.dart
index 43318ae..6c0bb21 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/member_impl.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/member_impl.dart
@@ -15,15 +15,15 @@
                  this.declarer,
                  this.type, this.functionType);
 
-  bool get isStatic => !element.isInstanceMember();
+  bool get isStatic => !element.isInstanceMember;
 
-  bool get isGetter => element.isGetter() || (!isSetter && element.isField());
+  bool get isGetter => element.isGetter || (!isSetter && element.isField);
 
   bool get isSetter => name.isSetter;
 
-  bool get isMethod => element.isFunction();
+  bool get isMethod => element.isFunction;
 
-  bool get isDeclaredByField => element.isField();
+  bool get isDeclaredByField => element.isField;
 
   bool get isAbstract => false;
 
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 37eec18..b95c031 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -85,15 +85,15 @@
     assert(invariant(node, () {
       FunctionExpression functionExpression = node.asFunctionExpression();
       if (functionExpression != null) {
-        return !functionExpression.modifiers.isExternal();
+        return !functionExpression.modifiers.isExternal;
       }
       return true;
     }));
     // TODO(johnniwinther): Simplify this invariant to use only declarations in
     // [TreeElements].
     assert(invariant(node, () {
-      if (!element.isErroneous() && currentElement != null && element.isPatch) {
-        return currentElement.getImplementationLibrary().isPatch;
+      if (!element.isErroneous && currentElement != null && element.isPatch) {
+        return currentElement.implementationLibrary.isPatch;
       }
       return true;
     }));
@@ -273,11 +273,11 @@
 
       if (identical(kind, ElementKind.FIELD)) return resolveField(element);
 
-      if (element.isClass()) {
+      if (element.isClass) {
         ClassElement cls = element;
         cls.ensureResolved(compiler);
         return null;
-      } else if (element.isTypedef()) {
+      } else if (element.isTypedef) {
         TypedefElement typdef = element;
         return resolveTypedef(typdef);
       }
@@ -444,7 +444,7 @@
       if (elements != null) {
         // TODO(karlklose): Remove the check for [isConstructor]. [elememts]
         // should never be non-null, not even for constructors.
-        assert(invariant(element, element.isConstructor(),
+        assert(invariant(element, element.isConstructor,
             message: 'Non-constructor element $element '
                      'has already been analyzed.'));
         return elements;
@@ -457,13 +457,13 @@
           // resolved. This is the only place where the resolver is
           // seeing this element.
           element.computeSignature(compiler);
-          if (!target.isErroneous()) {
+          if (!target.isErroneous) {
             compiler.enqueuer.resolution.registerStaticUse(target);
             compiler.world.registerImplicitSuperCall(elements, target);
           }
           return elements;
         } else {
-          assert(element.isDeferredLoaderGetter());
+          assert(element.isDeferredLoaderGetter);
           return _ensureTreeElements(element);
         }
       }
@@ -480,15 +480,15 @@
       }
       return compiler.withCurrentElement(element, () {
         FunctionExpression tree = element.node;
-        if (tree.modifiers.isExternal()) {
+        if (tree.modifiers.isExternal) {
           error(tree, MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION);
           return null;
         }
-        if (isConstructor || element.isFactoryConstructor()) {
+        if (isConstructor || element.isFactoryConstructor) {
           if (tree.returnType != null) {
             error(tree, MessageKind.CONSTRUCTOR_WITH_RETURN_TYPE);
           }
-          if (element.modifiers.isConst() &&
+          if (element.modifiers.isConst &&
               tree.hasBody() &&
               !tree.isRedirectingFactory) {
             compiler.reportError(tree, MessageKind.CONST_CONSTRUCTOR_HAS_BODY);
@@ -526,7 +526,7 @@
         // happens when a function is resolved after the mixin
         // application has been performed.
         TreeElements resolutionTree = visitor.mapping;
-        ClassElement enclosingClass = element.getEnclosingClass();
+        ClassElement enclosingClass = element.enclosingClass;
         if (enclosingClass != null) {
           Set<MixinApplicationElement> mixinUses =
               compiler.world.mixinUses[enclosingClass];
@@ -550,7 +550,7 @@
 
   TreeElements resolveField(VariableElementX element) {
     VariableDefinitions tree = element.parseNode(compiler);
-    if(element.modifiers.isStatic() && element.isTopLevel()) {
+    if(element.modifiers.isStatic && element.isTopLevel) {
       error(element.modifiers.getStatic(),
             MessageKind.TOP_LEVEL_VARIABLE_DECLARED_STATIC);
     }
@@ -570,9 +570,9 @@
       // TODO(johnniwinther): Avoid analyzing initializers if
       // [Compiler.analyzeSignaturesOnly] is set.
       visitor.visit(initializer);
-    } else if (modifiers.isConst()) {
+    } else if (modifiers.isConst) {
       compiler.reportError(element, MessageKind.CONST_WITHOUT_INITIALIZER);
-    } else if (modifiers.isFinal() && !element.isInstanceMember()) {
+    } else if (modifiers.isFinal && !element.isInstanceMember) {
       compiler.reportError(element, MessageKind.FINAL_WITHOUT_INITIALIZER);
     } else {
       compiler.enqueuer.resolution.registerInstantiatedClass(
@@ -581,14 +581,14 @@
 
     if (Elements.isStaticOrTopLevelField(element)) {
       visitor.addDeferredAction(element, () {
-        if (element.modifiers.isConst()) {
+        if (element.modifiers.isConst) {
           constantCompiler.compileConstant(element);
         } else {
           constantCompiler.compileVariable(element);
         }
       });
       if (initializer != null) {
-        if (!element.modifiers.isConst()) {
+        if (!element.modifiers.isConst) {
           // TODO(johnniwinther): Determine the const-ness eagerly to avoid
           // unnecessary registrations.
           compiler.backend.registerLazyField(visitor.mapping);
@@ -604,7 +604,7 @@
 
   DartType resolveTypeAnnotation(Element element, TypeAnnotation annotation) {
     DartType type = resolveReturnType(element, annotation);
-    if (type == compiler.types.voidType) {
+    if (type.isVoid) {
       error(annotation, MessageKind.VOID_NOT_ALLOWED);
     }
     return type;
@@ -620,23 +620,24 @@
     return result;
   }
 
-  void resolveRedirectionChain(FunctionElement constructor, Spannable node) {
-    FunctionElementX target = constructor;
+  void resolveRedirectionChain(ConstructorElementX constructor,
+                               Spannable node) {
+    ConstructorElementX target = constructor;
     InterfaceType targetType;
     List<Element> seen = new List<Element>();
     // Follow the chain of redirections and check for cycles.
-    while (target != target.defaultImplementation) {
-      if (target.internalRedirectionTarget != null) {
+    while (target.isRedirectingFactory) {
+      if (target.internalEffectiveTarget != null) {
         // We found a constructor that already has been processed.
-        targetType = target.redirectionTargetType;
+        targetType = target.effectiveTargetType;
         assert(invariant(target, targetType != null,
             message: 'Redirection target type has not been computed for '
                      '$target'));
-        target = target.internalRedirectionTarget;
+        target = target.internalEffectiveTarget;
         break;
       }
 
-      Element nextTarget = target.defaultImplementation;
+      Element nextTarget = target.immediateRedirectionTarget;
       if (seen.contains(nextTarget)) {
         error(node, MessageKind.CYCLIC_REDIRECTING_FACTORY);
         break;
@@ -647,7 +648,7 @@
 
     if (targetType == null) {
       assert(!target.isRedirectingFactory);
-      targetType = target.getEnclosingClass().thisType;
+      targetType = target.enclosingClass.thisType;
     }
 
     // [target] is now the actual target of the redirections.  Run through
@@ -656,7 +657,7 @@
     // compute [redirectionTargetType] for each factory by computing the
     // substitution of the target type with respect to the factory type.
     while (!seen.isEmpty) {
-      FunctionElementX factory = seen.removeLast();
+      ConstructorElementX factory = seen.removeLast();
 
       // [factory] must already be analyzed but the [TreeElements] might not
       // have been stored in the enqueuer cache yet.
@@ -671,8 +672,8 @@
           treeElements.getType(redirectionNode.expression);
 
       targetType = targetType.substByContext(factoryType);
-      factory.redirectionTarget = target;
-      factory.redirectionTargetType = targetType;
+      factory.effectiveTarget = target;
+      factory.effectiveTargetType = targetType;
     }
   }
 
@@ -832,7 +833,7 @@
     // enqueuer.
     // TODO(ahe): Avoid this eager resolution.
     element.forEachMember((_, Element member) {
-      if (!member.isInstanceMember()) {
+      if (!member.isInstanceMember) {
         compiler.withCurrentElement(member, () {
           for (MetadataAnnotation metadata in member.metadata) {
             metadata.ensureResolved(compiler);
@@ -861,7 +862,7 @@
     }
   }
 
-  void checkMixinApplication(MixinApplicationElement mixinApplication) {
+  void checkMixinApplication(MixinApplicationElementX mixinApplication) {
     Modifiers modifiers = mixinApplication.modifiers;
     int illegalFlags = modifiers.flags & ~Modifiers.FLAG_ABSTRACT;
     if (illegalFlags != 0) {
@@ -894,7 +895,7 @@
     // Check that the mixed in class doesn't have any constructors and
     // make sure we aren't mixing in methods that use 'super'.
     mixin.forEachLocalMember((Element member) {
-      if (member.isGenerativeConstructor() && !member.isSynthesized) {
+      if (member.isGenerativeConstructor && !member.isSynthesized) {
         compiler.reportError(member, MessageKind.ILLEGAL_MIXIN_CONSTRUCTOR);
       } else {
         // Get the resolution tree and check that the resolved member
@@ -939,11 +940,11 @@
         member.computeType(compiler);
 
         // Check modifiers.
-        if (member.isFunction() && member.modifiers.isFinal()) {
+        if (member.isFunction && member.modifiers.isFinal) {
           compiler.reportError(
               member, MessageKind.ILLEGAL_FINAL_METHOD_MODIFIER);
         }
-        if (member.isConstructor()) {
+        if (member.isConstructor) {
           final mismatchedFlagsBits =
               member.modifiers.flags &
               (Modifiers.FLAG_STATIC | Modifiers.FLAG_ABSTRACT);
@@ -955,13 +956,13 @@
                 MessageKind.ILLEGAL_CONSTRUCTOR_MODIFIERS,
                 {'modifiers': mismatchedFlags});
           }
-          if (member.modifiers.isConst()) {
+          if (member.modifiers.isConst) {
             constConstructors.add(member);
           }
         }
-        if (member.isField()) {
-          if (!member.modifiers.isStatic() &&
-              !member.modifiers.isFinal()) {
+        if (member.isField) {
+          if (!member.modifiers.isStatic &&
+              !member.modifiers.isFinal) {
             nonFinalInstanceFields.add(member);
           }
         }
@@ -992,10 +993,10 @@
     // Only check for getters. The test can only fail if there is both a setter
     // and a getter with the same name, and we only need to check each abstract
     // field once, so we just ignore setters.
-    if (!member.isGetter()) return;
+    if (!member.isGetter) return;
 
     // Find the associated abstract field.
-    ClassElement classElement = member.getEnclosingClass();
+    ClassElement classElement = member.enclosingClass;
     Element lookupElement = classElement.lookupLocalMember(member.name);
     if (lookupElement == null) {
       compiler.internalError(member,
@@ -1006,10 +1007,12 @@
     }
     AbstractFieldElement field = lookupElement;
 
-    if (field.getter == null) return;
-    if (field.setter == null) return;
-    int getterFlags = field.getter.modifiers.flags | Modifiers.FLAG_ABSTRACT;
-    int setterFlags = field.setter.modifiers.flags | Modifiers.FLAG_ABSTRACT;
+    FunctionElementX getter = field.getter;
+    if (getter == null) return;
+    FunctionElementX setter = field.setter;
+    if (setter == null) return;
+    int getterFlags = getter.modifiers.flags | Modifiers.FLAG_ABSTRACT;
+    int setterFlags = setter.modifiers.flags | Modifiers.FLAG_ABSTRACT;
     if (!identical(getterFlags, setterFlags)) {
       final mismatchedFlags =
         new Modifiers.withFlags(null, getterFlags ^ setterFlags);
@@ -1061,7 +1064,7 @@
 
   void checkOverrideHashCode(FunctionElement operatorEquals) {
     if (operatorEquals.isAbstract) return;
-    ClassElement cls = operatorEquals.getEnclosingClass();
+    ClassElement cls = operatorEquals.enclosingClass;
     Element hashCodeImplementation =
         cls.lookupLocalMember('hashCode');
     if (hashCodeImplementation != null) return;
@@ -1134,14 +1137,14 @@
         errorneousElement,
         errorMessage,
         {'memberName': contextElement.name,
-         'className': contextElement.getEnclosingClass().name});
+         'className': contextElement.enclosingClass.name});
     compiler.reportInfo(contextElement, contextMessage);
   }
 
 
   FunctionSignature resolveSignature(FunctionElementX element) {
     MessageKind defaultValuesError = null;
-    if (element.isFactoryConstructor()) {
+    if (element.isFactoryConstructor) {
       FunctionExpression body = element.parseNode(compiler);
       if (body.isRedirectingFactory) {
         defaultValuesError = MessageKind.REDIRECTING_FACTORY_WITH_DEFAULT;
@@ -1254,13 +1257,13 @@
         MessageKind.ALREADY_INITIALIZED, {'fieldName': field.name});
   }
 
-  void checkForDuplicateInitializers(VariableElement field, Node init) {
+  void checkForDuplicateInitializers(VariableElementX field, Node init) {
     // [field] can be null if it could not be resolved.
     if (field == null) return;
     String name = field.name;
     if (initialized.containsKey(field)) {
       reportDuplicateInitializerError(field, init, initialized[field]);
-    } else if (field.modifiers.isFinal()) {
+    } else if (field.modifiers.isFinal) {
       field.parseNode(visitor.compiler);
       Expression initializer = field.initializer;
       if (initializer != null) {
@@ -1277,12 +1280,12 @@
     // Lookup target field.
     Element target;
     if (isFieldInitializer(init)) {
-      target = constructor.getEnclosingClass().lookupLocalMember(name);
+      target = constructor.enclosingClass.lookupLocalMember(name);
       if (target == null) {
         error(selector, MessageKind.CANNOT_RESOLVE, {'name': name});
       } else if (target.kind != ElementKind.FIELD) {
         error(selector, MessageKind.NOT_A_FIELD, {'fieldName': name});
-      } else if (!target.isInstanceMember()) {
+      } else if (!target.isInstanceMember) {
         error(selector, MessageKind.INIT_STATIC_FIELD, {'fieldName': name});
       }
     } else {
@@ -1298,7 +1301,7 @@
   ClassElement getSuperOrThisLookupTarget(FunctionElement constructor,
                                           bool isSuperCall,
                                           Node diagnosticNode) {
-    ClassElement lookupTarget = constructor.getEnclosingClass();
+    ClassElement lookupTarget = constructor.enclosingClass;
     if (isSuperCall) {
       // Calculate correct lookup target and constructor name.
       if (identical(lookupTarget, visitor.compiler.objectClass)) {
@@ -1348,7 +1351,7 @@
   void resolveImplicitSuperConstructorSend(FunctionElement constructor,
                                            FunctionExpression functionNode) {
     // If the class has a super resolve the implicit super call.
-    ClassElement classElement = constructor.getEnclosingClass();
+    ClassElement classElement = constructor.enclosingClass;
     ClassElement superClass = classElement.superclass;
     if (classElement != visitor.compiler.objectClass) {
       assert(superClass != null);
@@ -1356,7 +1359,7 @@
       String constructorName = '';
       Selector callToMatch = new Selector.call(
           constructorName,
-          classElement.getLibrary(),
+          classElement.library,
           0);
 
       final bool isSuperCall = true;
@@ -1364,7 +1367,7 @@
                                                              isSuperCall,
                                                              functionNode);
       Selector constructorSelector = new Selector.callDefaultConstructor(
-          visitor.enclosingElement.getLibrary());
+          visitor.enclosingElement.library);
       Element calledConstructor = lookupTarget.lookupConstructor(
           constructorSelector);
 
@@ -1392,7 +1395,7 @@
       String className,
       Selector constructorSelector) {
     if (lookedupConstructor == null
-        || !lookedupConstructor.isGenerativeConstructor()) {
+        || !lookedupConstructor.isGenerativeConstructor) {
       var fullConstructorName =
           visitor.compiler.resolver.constructorNameForDiagnostics(
               className,
@@ -1408,8 +1411,8 @@
                            ? MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT
                            : MessageKind.NO_MATCHING_CONSTRUCTOR;
         visitor.compiler.reportError(diagnosticNode, kind);
-      } else if (caller.modifiers.isConst()
-                 && !lookedupConstructor.modifiers.isConst()) {
+      } else if (caller.isConst
+                 && !lookedupConstructor.isConst) {
         visitor.compiler.reportError(
             diagnosticNode, MessageKind.CONST_CALLS_NON_CONST);
       }
@@ -1460,7 +1463,7 @@
           // Check that there is no body (Language specification 7.5.1).  If the
           // constructor is also const, we already reported an error in
           // [resolveMethodElement].
-          if (functionNode.hasBody() && !constructor.modifiers.isConst()) {
+          if (functionNode.hasBody() && !constructor.isConst) {
             error(functionNode, MessageKind.REDIRECTING_CONSTRUCTOR_HAS_BODY);
           }
           // Check that there are no other initializers.
@@ -1471,7 +1474,7 @@
           Compiler compiler = visitor.compiler;
           FunctionSignature signature = constructor.functionSignature;
           signature.forEachParameter((ParameterElement parameter) {
-            if (parameter.isFieldParameter()) {
+            if (parameter.isFieldParameter) {
               Node node = parameter.node;
               error(node, MessageKind.INITIALIZING_FORMAL_NOT_ALLOWED);
             }
@@ -1636,7 +1639,7 @@
     if (prefixName != null) {
       Element prefixElement =
           lookupInScope(compiler, prefixName, scope, prefixName.source);
-      if (prefixElement != null && prefixElement.isPrefix()) {
+      if (prefixElement != null && prefixElement.isPrefix) {
         // The receiver is a prefix. Lookup in the imported members.
         PrefixElement prefix = prefixElement;
         element = prefix.lookupLocalMember(typeName.source);
@@ -1658,9 +1661,7 @@
       }
     } else {
       String stringValue = typeName.source;
-      if (identical(stringValue, 'void')) {
-        element = compiler.types.voidType.element;
-      } else if (identical(stringValue, 'dynamic')) {
+      if (identical(stringValue, 'dynamic')) {
         element = compiler.dynamicClass;
       } else {
         element = lookupInScope(compiler, typeName, scope, typeName.source);
@@ -1673,6 +1674,21 @@
                                  {bool malformedIsError: false,
                                   bool deferredIsMalformed: true}) {
     Identifier typeName;
+    DartType type;
+
+    DartType checkNoTypeArguments(DartType type) {
+      LinkBuilder<DartType> arguments = new LinkBuilder<DartType>();
+      bool hasTypeArgumentMismatch = resolveTypeArguments(
+          visitor, node, const Link<DartType>(), arguments);
+      if (hasTypeArgumentMismatch) {
+        return new MalformedType(
+            new ErroneousElementX(MessageKind.TYPE_ARGUMENT_COUNT_MISMATCH,
+                {'type': node}, typeName.source, visitor.enclosingElement),
+                type, arguments.toLink());
+      }
+      return type;
+    }
+
     Identifier prefixName;
     Send send = node.typeName.asSend();
     if (send != null) {
@@ -1681,6 +1697,12 @@
       typeName = send.selector.asIdentifier();
     } else {
       typeName = node.typeName.asIdentifier();
+      if (identical(typeName.source, 'void')) {
+        type = const VoidType();
+        checkNoTypeArguments(type);
+        visitor.useType(node, type);
+        return type;
+      }
     }
 
     Element element = resolveTypeName(prefixName, typeName, visitor.scope,
@@ -1707,43 +1729,28 @@
               userProvidedBadType, arguments.toLink());
     }
 
-    DartType checkNoTypeArguments(DartType type) {
-      LinkBuilder<DartType> arguments = new LinkBuilder<DartType>();
-      bool hasTypeArgumentMismatch = resolveTypeArguments(
-          visitor, node, const Link<DartType>(), arguments);
-      if (hasTypeArgumentMismatch) {
-        return new MalformedType(
-            new ErroneousElementX(MessageKind.TYPE_ARGUMENT_COUNT_MISMATCH,
-                {'type': node}, typeName.source, visitor.enclosingElement),
-                type, arguments.toLink());
-      }
-      return type;
-    }
-
     // Try to construct the type from the element.
-    DartType type;
     if (element == null) {
       type = reportFailureAndCreateType(
           MessageKind.CANNOT_RESOLVE_TYPE, {'typeName': node.typeName});
-    } else if (element.isAmbiguous()) {
+    } else if (element.isAmbiguous) {
       AmbiguousElement ambiguous = element;
       type = reportFailureAndCreateType(
           ambiguous.messageKind, ambiguous.messageArguments);
       ambiguous.diagnose(visitor.mapping.currentElement, compiler);
-    } else if (element.isErroneous()) {
+    } else if (element.isErroneous) {
       ErroneousElement erroneousElement = element;
       type = reportFailureAndCreateType(
           erroneousElement.messageKind, erroneousElement.messageArguments,
           erroneousElement: erroneousElement);
-    } else if (!element.impliesType()) {
+    } else if (!element.impliesType) {
       type = reportFailureAndCreateType(
           MessageKind.NOT_A_TYPE, {'node': node.typeName});
     } else {
       bool addTypeVariableBoundsCheck = false;
-      if (identical(element, compiler.types.voidType.element) ||
-          identical(element, compiler.dynamicClass)) {
+      if (identical(element, compiler.dynamicClass)) {
         type = checkNoTypeArguments(element.computeType(compiler));
-      } else if (element.isClass()) {
+      } else if (element.isClass) {
         ClassElement cls = element;
         compiler.resolver._ensureClassWillBeResolved(cls);
         element.computeType(compiler);
@@ -1762,7 +1769,7 @@
             addTypeVariableBoundsCheck = true;
           }
         }
-      } else if (element.isTypedef()) {
+      } else if (element.isTypedef) {
         TypedefElement typdef = element;
         // TODO(ahe): Should be [ensureResolved].
         compiler.resolveTypedef(typdef);
@@ -1781,13 +1788,13 @@
             addTypeVariableBoundsCheck = true;
           }
         }
-      } else if (element.isTypeVariable()) {
+      } else if (element.isTypeVariable) {
         Element outer =
-            visitor.enclosingElement.getOutermostEnclosingMemberOrTopLevel();
+            visitor.enclosingElement.outermostEnclosingMemberOrTopLevel;
         bool isInFactoryConstructor =
-            outer != null && outer.isFactoryConstructor();
-        if (!outer.isClass() &&
-            !outer.isTypedef() &&
+            outer != null && outer.isFactoryConstructor;
+        if (!outer.isClass &&
+            !outer.isTypedef &&
             !isInFactoryConstructor &&
             Elements.isInStaticContext(visitor.enclosingElement)) {
           compiler.backend.registerThrowRuntimeError(visitor.mapping);
@@ -1803,11 +1810,7 @@
         compiler.internalError(node,
             "Unexpected element kind ${element.kind}.");
       }
-      // TODO(johnniwinther): We should not resolve type annotations after the
-      // resolution queue has been closed. Currently the dart backend does so.
-      // Remove the guarded when this is fixed.
-      if (!compiler.enqueuer.resolution.queueIsClosed &&
-          addTypeVariableBoundsCheck) {
+      if (addTypeVariableBoundsCheck) {
         visitor.addDeferredAction(
             visitor.enclosingElement,
             () => checkTypeVariableBounds(visitor.mapping, node, type));
@@ -1968,8 +1971,8 @@
 
   bool isPotentiallyMutableTarget(Element target) {
     if (target == null) return false;
-    return (target.isVariable() || target.isParameter()) &&
-      !(target.modifiers.isFinal() || target.modifiers.isConst());
+    return (target.isVariable || target.isParameter) &&
+      !(target.isFinal || target.isConst);
   }
 
   // TODO(ahe): Find a way to share this with runtime implementation.
@@ -2004,18 +2007,18 @@
       // When the element is a field, we are actually resolving its
       // initial value, which should not have access to instance
       // fields.
-      inInstanceContext = (element.isInstanceMember() && !element.isField())
-          || element.isGenerativeConstructor(),
-      this.currentClass = element.isMember() ? element.getEnclosingClass()
+      inInstanceContext = (element.isInstanceMember && !element.isField)
+          || element.isGenerativeConstructor,
+      this.currentClass = element.isMember ? element.enclosingClass
                                              : null,
       this.statementScope = new StatementScope(),
       scope = element.buildScope(),
       // The type annotations on a typedef do not imply type checks.
       // TODO(karlklose): clean this up (dartbug.com/8870).
       inCheckContext = compiler.enableTypeAssertions &&
-          !element.isLibrary() &&
-          !element.isTypedef() &&
-          !element.enclosingElement.isTypedef(),
+          !element.isLibrary &&
+          !element.isTypedef &&
+          !element.enclosingElement.isTypedef,
       inCatchBlock = false,
       super(compiler, mapping);
 
@@ -2023,13 +2026,13 @@
 
   Element reportLookupErrorIfAny(Element result, Node node, String name) {
     if (!Elements.isUnresolved(result)) {
-      if (!inInstanceContext && result.isInstanceMember()) {
+      if (!inInstanceContext && result.isInstanceMember) {
         compiler.reportError(
             node, MessageKind.NO_INSTANCE_AVAILABLE, {'name': name});
         return new ErroneousElementX(MessageKind.NO_INSTANCE_AVAILABLE,
                                      {'name': name},
                                      name, enclosingElement);
-      } else if (result.isAmbiguous()) {
+      } else if (result.isAmbiguous) {
         AmbiguousElement ambiguous = result;
         compiler.reportError(
             node, ambiguous.messageKind, ambiguous.messageArguments);
@@ -2115,7 +2118,7 @@
               {'name': node});
           compiler.backend.registerThrowNoSuchMethod(mapping);
         }
-      } else if (element.isErroneous()) {
+      } else if (element.isErroneous) {
         // Use the erroneous element.
       } else {
         if ((element.kind.category & allowedCategory) == 0) {
@@ -2124,7 +2127,7 @@
                 {'text': "is not an expression $element"});
         }
       }
-      if (!Elements.isUnresolved(element) && element.isClass()) {
+      if (!Elements.isUnresolved(element) && element.isClass) {
         ClassElement classElement = element;
         classElement.ensureResolved(compiler);
       }
@@ -2150,14 +2153,14 @@
       String constructorName = node.selector.asIdentifier().source;
       return new Selector.callConstructor(
           constructorName,
-          enclosingElement.getLibrary());
+          enclosingElement.library);
     } else {
       return new Selector.callDefaultConstructor(
-          enclosingElement.getLibrary());
+          enclosingElement.library);
     }
   }
 
-  FunctionElement resolveConstructorRedirection(FunctionElement constructor) {
+  FunctionElement resolveConstructorRedirection(FunctionElementX constructor) {
     FunctionExpression node = constructor.parseNode(compiler);
 
     // A synthetic constructor does not have a node.
@@ -2168,7 +2171,7 @@
         Initializers.isConstructorRedirect(initializers.head)) {
       Selector selector =
           getRedirectingThisOrSuperConstructorSelector(initializers.head);
-      final ClassElement classElement = constructor.getEnclosingClass();
+      final ClassElement classElement = constructor.enclosingClass;
       return classElement.lookupConstructor(selector);
     }
     return null;
@@ -2176,7 +2179,7 @@
 
   void setupFunction(FunctionExpression node, FunctionElement function) {
     Element enclosingElement = function.enclosingElement;
-    if (node.modifiers.isStatic() &&
+    if (node.modifiers.isStatic &&
         enclosingElement.kind != ElementKind.CLASS) {
       compiler.reportError(node, MessageKind.ILLEGAL_STATIC);
     }
@@ -2293,7 +2296,7 @@
     } else {
       name = node.name.asIdentifier().source;
     }
-    FunctionElementX function = new FunctionElementX.fromNode(
+    FunctionElementX function = new LocalFunctionElementX(
         name, node, ElementKind.FUNCTION, Modifiers.EMPTY,
         enclosingElement);
     function.functionSignatureCache =
@@ -2332,7 +2335,7 @@
     if (node.receiver == null) {
       // If this send is of the form "assert(expr);", then
       // this is an assertion.
-      if (selector.isAssert()) {
+      if (selector.isAssert) {
         if (selector.argumentCount != 1) {
           error(node.selector,
                 MessageKind.WRONG_NUMBER_OF_ARGUMENTS_FOR_ASSERT,
@@ -2394,7 +2397,7 @@
       }
     } else if (Elements.isUnresolved(resolvedReceiver)) {
       return null;
-    } else if (resolvedReceiver.isClass()) {
+    } else if (resolvedReceiver.isClass) {
       ClassElement receiverClass = resolvedReceiver;
       receiverClass.ensureResolved(compiler);
       if (node.isOperator) {
@@ -2409,7 +2412,7 @@
       MembersCreator.computeClassMembersByName(
           compiler, receiverClass.declaration, name);
       target = receiverClass.lookupLocalMember(name);
-      if (target == null || target.isInstanceMember()) {
+      if (target == null || target.isInstanceMember) {
         compiler.backend.registerThrowNoSuchMethod(mapping);
         // TODO(johnniwinther): With the simplified [TreeElements] invariant,
         // try to resolve injected elements if [currentClass] is in the patch
@@ -2497,7 +2500,7 @@
       arity++;
     }
 
-    if (element != null && element.isConstructor()) {
+    if (element != null && element.isConstructor) {
       return new Selector.callConstructor(
           element.name, library, arity, named);
     }
@@ -2509,7 +2512,7 @@
   }
 
   Selector resolveSelector(Send node, Element element) {
-    LibraryElement library = enclosingElement.getLibrary();
+    LibraryElement library = enclosingElement.library;
     Selector selector = computeSendSelector(node, library, element);
     if (selector != null) mapping.setSelector(node, selector);
     return selector;
@@ -2562,7 +2565,7 @@
     }
 
     if (!Elements.isUnresolved(target)) {
-      if (target.isAbstractField()) {
+      if (target.isAbstractField) {
         AbstractFieldElement field = target;
         target = field.getter;
         if (target == null && !inInstanceContext) {
@@ -2571,16 +2574,16 @@
               warnAndCreateErroneousElement(node.selector, field.name,
                                             MessageKind.CANNOT_RESOLVE_GETTER);
         }
-      } else if (target.isTypeVariable()) {
-        ClassElement cls = target.getEnclosingClass();
-        assert(enclosingElement.getEnclosingClass() == cls);
+      } else if (target.isTypeVariable) {
+        ClassElement cls = target.enclosingClass;
+        assert(enclosingElement.enclosingClass == cls);
         compiler.backend.registerClassUsingVariableExpression(cls);
         compiler.backend.registerTypeVariableExpression(mapping);
         // Set the type of the node to [Type] to mark this send as a
         // type variable expression.
         mapping.setType(node, compiler.typeClass.computeType(compiler));
         world.registerTypeLiteral(target, mapping);
-      } else if (target.impliesType() && (!sendIsMemberAccess || node.isCall)) {
+      } else if (target.impliesType && (!sendIsMemberAccess || node.isCall)) {
         // Set the type of the node to [Type] to mark this send as a
         // type literal.
         mapping.setType(node, compiler.typeClass.computeType(compiler));
@@ -2640,15 +2643,15 @@
 
     if (node.isCall) {
       if (Elements.isUnresolved(target) ||
-          target.isGetter() ||
-          target.isField() ||
+          target.isGetter ||
+          target.isField ||
           Elements.isClosureSend(node, target)) {
         // If we don't know what we're calling or if we are calling a getter,
         // we need to register that fact that we may be calling a closure
         // with the same arguments.
         Selector call = new Selector.callClosureFrom(selector);
         world.registerDynamicInvocation(call);
-      } else if (target.impliesType()) {
+      } else if (target.impliesType) {
         // We call 'call()' on a Type instance returned from the reference to a
         // class or typedef literal. We do not need to register this call as a
         // dynamic invocation, because we statically know what the target is.
@@ -2717,7 +2720,7 @@
     String source = operatorName;
     bool isComplex = !identical(source, '=');
     if (!Elements.isUnresolved(target)) {
-      if (target.isAbstractField()) {
+      if (target.isAbstractField) {
         AbstractFieldElement field = target;
         setter = field.setter;
         getter = field.getter;
@@ -2731,16 +2734,16 @@
               node.selector, field.name, MessageKind.CANNOT_RESOLVE_GETTER);
           compiler.backend.registerThrowNoSuchMethod(mapping);
         }
-      } else if (target.impliesType()) {
+      } else if (target.impliesType) {
         setter = warnAndCreateErroneousElement(
             node.selector, target.name, MessageKind.ASSIGNING_TYPE);
         compiler.backend.registerThrowNoSuchMethod(mapping);
-      } else if (target.modifiers.isFinal() ||
-                 target.modifiers.isConst() ||
-                 (target.isFunction() &&
+      } else if (target.isFinal ||
+                 target.isConst ||
+                 (target.isFunction &&
                   Elements.isStaticOrTopLevelFunction(target) &&
-                  !target.isSetter())) {
-        if (target.isFunction()) {
+                  !target.isSetter)) {
+        if (target.isFunction) {
           setter = warnAndCreateErroneousElement(
               node.selector, target.name, MessageKind.ASSIGNING_METHOD);
         } else {
@@ -2765,10 +2768,10 @@
     Selector selector = mapping.getSelector(node);
     if (isComplex) {
       Selector getterSelector;
-      if (selector.isSetter()) {
+      if (selector.isSetter) {
         getterSelector = new Selector.getterFrom(selector);
       } else {
-        assert(selector.isIndexSet());
+        assert(selector.isIndexSet);
         getterSelector = new Selector.index();
       }
       registerSend(getterSelector, getter);
@@ -2807,10 +2810,10 @@
   }
 
   void registerSend(Selector selector, Element target) {
-    if (target == null || target.isInstanceMember()) {
-      if (selector.isGetter()) {
+    if (target == null || target.isInstanceMember) {
+      if (selector.isGetter) {
         world.registerDynamicGetter(selector);
-      } else if (selector.isSetter()) {
+      } else if (selector.isSetter) {
         world.registerDynamicSetter(selector);
       } else {
         world.registerDynamicInvocation(selector);
@@ -2818,7 +2821,7 @@
     } else if (Elements.isStaticOrTopLevel(target)) {
       // Avoid registration of type variables since they are not analyzable but
       // instead resolved through their enclosing type declaration.
-      if (!target.isTypeVariable()) {
+      if (!target.isTypeVariable) {
         // [target] might be the implementation element and only declaration
         // elements may be registered.
         world.registerStaticUse(target.declaration);
@@ -2885,7 +2888,7 @@
     } else {
       Node expression = node.expression;
       if (expression != null &&
-          enclosingElement.isGenerativeConstructor()) {
+          enclosingElement.isGenerativeConstructor) {
         // It is a compile-time error if a return statement of the form
         // `return e;` appears in a generative constructor.  (Dart Language
         // Specification 13.12.)
@@ -2898,24 +2901,24 @@
 
   void handleRedirectingFactoryBody(Return node) {
     final isSymbolConstructor = enclosingElement == compiler.symbolConstructor;
-    if (!enclosingElement.isFactoryConstructor()) {
+    if (!enclosingElement.isFactoryConstructor) {
       compiler.reportError(
           node, MessageKind.FACTORY_REDIRECTION_IN_NON_FACTORY);
       compiler.reportHint(
           enclosingElement, MessageKind.MISSING_FACTORY_KEYWORD);
     }
-    FunctionElement constructor = enclosingElement;
-    bool isConstConstructor = constructor.modifiers.isConst();
-    FunctionElement redirectionTarget = resolveRedirectingFactory(
+    ConstructorElementX constructor = enclosingElement;
+    bool isConstConstructor = constructor.isConst;
+    ConstructorElement redirectionTarget = resolveRedirectingFactory(
         node, inConstContext: isConstConstructor);
-    constructor.defaultImplementation = redirectionTarget;
+    constructor.immediateRedirectionTarget = redirectionTarget;
     useElement(node.expression, redirectionTarget);
     if (Elements.isUnresolved(redirectionTarget)) {
       compiler.backend.registerThrowNoSuchMethod(mapping);
       return;
     } else {
       if (isConstConstructor &&
-          !redirectionTarget.modifiers.isConst()) {
+          !redirectionTarget.isConst) {
         compiler.reportError(node, MessageKind.CONSTRUCTOR_IS_NOT_CONST);
       }
       if (redirectionTarget == constructor) {
@@ -2926,7 +2929,7 @@
 
     // Check that the target constructor is type compatible with the
     // redirecting constructor.
-    ClassElement targetClass = redirectionTarget.getEnclosingClass();
+    ClassElement targetClass = redirectionTarget.enclosingClass;
     InterfaceType type = mapping.getType(node.expression);
     FunctionType targetType = redirectionTarget.computeType(compiler)
         .subst(type.typeArguments, targetClass.typeVariables);
@@ -2974,9 +2977,7 @@
     }
     VariableList variables = new VariableList.node(node, type);
     VariableDefinitionsVisitor visitor =
-        new VariableDefinitionsVisitor(compiler, node, this,
-                                       ElementKind.VARIABLE,
-                                       variables);
+        new VariableDefinitionsVisitor(compiler, node, this, variables);
 
     Modifiers modifiers = node.modifiers;
     void reportExtraModifier(String modifier) {
@@ -2993,17 +2994,17 @@
       compiler.reportError(modifierNode, MessageKind.EXTRANEOUS_MODIFIER,
           {'modifier': modifier});
     }
-    if (modifiers.isFinal() && (modifiers.isConst() || modifiers.isVar())) {
+    if (modifiers.isFinal && (modifiers.isConst || modifiers.isVar)) {
       reportExtraModifier('final');
     }
-    if (modifiers.isVar() && (modifiers.isConst() || node.type != null)) {
+    if (modifiers.isVar && (modifiers.isConst || node.type != null)) {
       reportExtraModifier('var');
     }
-    if (enclosingElement.isFunction()) {
-      if (modifiers.isAbstract()) {
+    if (enclosingElement.isFunction) {
+      if (modifiers.isAbstract) {
         reportExtraModifier('abstract');
       }
-      if (modifiers.isStatic()) {
+      if (modifiers.isStatic) {
         reportExtraModifier('static');
       }
     }
@@ -3031,7 +3032,7 @@
     FunctionElement constructor = resolveConstructor(node);
     final bool isSymbolConstructor = constructor == compiler.symbolConstructor;
     final bool isMirrorsUsedConstant =
-        node.isConst() && (constructor == compiler.mirrorsUsedConstructor);
+        node.isConst && (constructor == compiler.mirrorsUsedConstructor);
     resolveSelector(node.send, constructor);
     resolveArguments(node.send.argumentsNode);
     useElement(node.send, constructor);
@@ -3045,23 +3046,23 @@
     // [constructor] might be the implementation element
     // and only declaration elements may be registered.
     world.registerStaticUse(constructor.declaration);
-    ClassElement cls = constructor.getEnclosingClass();
+    ClassElement cls = constructor.enclosingClass;
     InterfaceType type = mapping.getType(node);
-    if (node.isConst() && type.containsTypeVariables) {
+    if (node.isConst && type.containsTypeVariables) {
       compiler.reportError(node.send.selector,
                            MessageKind.TYPE_VARIABLE_IN_CONSTANT);
     }
     world.registerInstantiatedType(type, mapping);
-    if (constructor.isFactoryConstructor() && !type.typeArguments.isEmpty) {
+    if (constructor.isFactoryConstructor && !type.typeArguments.isEmpty) {
       world.registerFactoryWithTypeArguments(mapping);
     }
-    if (constructor.isGenerativeConstructor() && cls.isAbstract) {
+    if (constructor.isGenerativeConstructor && cls.isAbstract) {
       warning(node, MessageKind.ABSTRACT_CLASS_INSTANTIATION);
       compiler.backend.registerAbstractClassInstantiation(mapping);
     }
 
     if (isSymbolConstructor) {
-      if (node.isConst()) {
+      if (node.isConst) {
         Node argumentNode = node.send.arguments.head;
         Constant name = compiler.resolver.constantCompiler.compileNode(
             argumentNode, mapping);
@@ -3088,7 +3089,7 @@
     } else if (isMirrorsUsedConstant) {
       compiler.mirrorUsageAnalyzerTask.validate(node, mapping);
     }
-    if (node.isConst()) {
+    if (node.isConst) {
       analyzeConstant(node);
     }
 
@@ -3104,7 +3105,7 @@
       ClassElement cls = keyType.element;
       if (cls == compiler.stringClass) continue;
       Element equals = cls.lookupMember('==');
-      if (equals.getEnclosingClass() != compiler.objectClass) {
+      if (equals.enclosingClass != compiler.objectClass) {
         compiler.reportError(spannable,
                              MessageKind.CONST_MAP_KEY_OVERRIDES_EQUALS,
                              {'type': keyType});
@@ -3167,11 +3168,11 @@
    * Note: this function may return an ErroneousFunctionElement instead of
    * [:null:], if there is no corresponding constructor, class or library.
    */
-  FunctionElement resolveConstructor(NewExpression node) {
+  ConstructorElement resolveConstructor(NewExpression node) {
     return node.accept(new ConstructorResolver(compiler, this));
   }
 
-  FunctionElement resolveRedirectingFactory(Return node,
+  ConstructorElement resolveRedirectingFactory(Return node,
                                             {bool inConstContext: false}) {
     return node.accept(new ConstructorResolver(compiler, this,
                                                inConstContext: inConstContext));
@@ -3216,7 +3217,7 @@
     }
     DartType listType;
     if (typeArgument != null) {
-      if (node.isConst() && typeArgument.containsTypeVariables) {
+      if (node.isConst && typeArgument.containsTypeVariables) {
         compiler.reportError(arguments.nodes.head,
             MessageKind.TYPE_VARIABLE_IN_CONSTANT);
       }
@@ -3230,7 +3231,7 @@
     world.registerInstantiatedType(listType, mapping);
     compiler.backend.registerRequiredType(listType, enclosingElement);
     visit(node.elements);
-    if (node.isConst()) {
+    if (node.isConst) {
       analyzeConstant(node);
     }
 
@@ -3319,7 +3320,7 @@
   }
 
   visitForIn(ForIn node) {
-    LibraryElement library = enclosingElement.getLibrary();
+    LibraryElement library = enclosingElement.library;
     mapping.setIteratorSelector(node, compiler.iteratorSelector);
     world.registerDynamicGetter(compiler.iteratorSelector);
     mapping.setCurrentSelector(node, compiler.currentSelector);
@@ -3448,18 +3449,18 @@
       compiler.mapClass.computeType(compiler);
       mapType = compiler.mapClass.rawType;
     }
-    if (node.isConst() && mapType.containsTypeVariables) {
+    if (node.isConst && mapType.containsTypeVariables) {
       compiler.reportError(arguments,
           MessageKind.TYPE_VARIABLE_IN_CONSTANT);
     }
     mapping.setType(node, mapType);
     world.registerInstantiatedType(mapType, mapping);
-    if (node.isConst()) {
+    if (node.isConst) {
       compiler.backend.registerConstantMap(mapping);
     }
     compiler.backend.registerRequiredType(mapType, enclosingElement);
     node.visitChildren(this);
-    if (node.isConst()) {
+    if (node.isConst) {
       analyzeConstant(node);
     }
 
@@ -3489,7 +3490,7 @@
   bool overridesEquals(DartType type) {
     ClassElement cls = type.element;
     Element equals = cls.lookupMember('==');
-    return equals.getEnclosingClass() != compiler.objectClass;
+    return equals.enclosingClass != compiler.objectClass;
   }
 
   void checkCaseExpressions(SwitchStatement node) {
@@ -3795,7 +3796,7 @@
 }
 
 class TypedefResolverVisitor extends TypeDefinitionVisitor {
-  TypedefElement get element => enclosingElement;
+  TypedefElementX get element => enclosingElement;
 
   TypedefResolverVisitor(Compiler compiler,
                          TypedefElement typedefElement,
@@ -3813,8 +3814,8 @@
     element.functionSignature = signature;
 
     scope = new MethodScope(scope, element);
-    signature.forEachParameter((Element element) {
-      defineElement(element.parseNode(compiler), element);
+    signature.forEachParameter((ParameterElement element) {
+      defineElement(element.node, element);
     });
 
     element.alias = signature.type;
@@ -3847,7 +3848,7 @@
   }
 
   visitTypedefType(TypedefType type, _) {
-    TypedefElement typedefElement = type.element;
+    TypedefElementX typedefElement = type.element;
     if (seenTypedefs.contains(typedefElement)) {
       if (!hasCyclicReference && identical(element, typedefElement)) {
         // Only report an error on the checked typedef to avoid generating
@@ -3990,7 +3991,7 @@
 
     if (!element.hasConstructor) {
       Element superMember = element.superclass.localLookup('');
-      if (superMember == null || !superMember.isGenerativeConstructor()) {
+      if (superMember == null || !superMember.isGenerativeConstructor) {
         MessageKind kind = MessageKind.CANNOT_FIND_CONSTRUCTOR;
         Map arguments = {'constructorName': ''};
         // TODO(ahe): Why is this a compile-time error? Or if it is an error,
@@ -4000,7 +4001,7 @@
             kind, arguments, '', element);
         compiler.backend.registerThrowNoSuchMethod(mapping);
       } else {
-        Selector callToMatch = new Selector.call("", element.getLibrary(), 0);
+        Selector callToMatch = new Selector.call("", element.library, 0);
         if (!callToMatch.applies(superMember, compiler)) {
           MessageKind kind = MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT;
           compiler.reportError(node, kind);
@@ -4062,7 +4063,7 @@
     String mixinName = mixinType.name;
     MixinApplicationElementX mixinApplication = new MixinApplicationElementX(
         "${superName}+${mixinName}",
-        element.getCompilationUnit(),
+        element.compilationUnit,
         compiler.getNextFreeClassId(),
         node,
         new Modifiers.withFlags(new NodeList.empty(), Modifiers.FLAG_ABSTRACT));
@@ -4070,7 +4071,7 @@
     LinkBuilder<DartType> typeVariablesBuilder = new LinkBuilder<DartType>();
     element.typeVariables.forEach((TypeVariableType type) {
       TypeVariableElementX typeVariableElement = new TypeVariableElementX(
-          type.name, mixinApplication, type.element.parseNode(compiler));
+          type.name, mixinApplication, type.element.node);
       TypeVariableType typeVariable = new TypeVariableType(typeVariableElement);
       typeVariablesBuilder.addLast(typeVariable);
     });
@@ -4161,7 +4162,7 @@
     // Create forwarding constructors for constructor defined in the superclass
     // because they are now hidden by the mixin application.
     superclass.forEachLocalMember((Element member) {
-      if (!member.isGenerativeConstructor()) return;
+      if (!member.isGenerativeConstructor) return;
       FunctionElement forwarder =
           createForwardingConstructor(member, mixinApplication);
       mixinApplication.addConstructor(forwarder);
@@ -4323,7 +4324,7 @@
   }
 
   isBlackListed(DartType type) {
-    LibraryElement lib = element.getLibrary();
+    LibraryElement lib = element.library;
     return
       !identical(lib, compiler.coreLibrary) &&
       !identical(lib, compiler.jsHelperLibrary) &&
@@ -4388,7 +4389,7 @@
 
   void visitIdentifier(Identifier node) {
     Element element = lookupInScope(compiler, node, context, node.source);
-    if (element != null && element.isClass()) {
+    if (element != null && element.isClass) {
       loadSupertype(element, node);
     }
   }
@@ -4407,7 +4408,7 @@
     PrefixElement prefixElement = element;
     Identifier selector = node.selector.asIdentifier();
     var e = prefixElement.lookupLocalMember(selector.source);
-    if (e == null || !e.impliesType()) {
+    if (e == null || !e.impliesType) {
       error(node.selector, MessageKind.CANNOT_RESOLVE_TYPE,
             {'typeName': node.selector});
       return;
@@ -4419,13 +4420,11 @@
 class VariableDefinitionsVisitor extends CommonResolverVisitor<Identifier> {
   VariableDefinitions definitions;
   ResolverVisitor resolver;
-  ElementKind kind;
   VariableList variables;
 
   VariableDefinitionsVisitor(Compiler compiler,
                              this.definitions,
                              this.resolver,
-                             this.kind,
                              this.variables)
       : super(compiler) {
   }
@@ -4449,10 +4448,10 @@
     // The variable is initialized to null.
     resolver.world.registerInstantiatedClass(compiler.nullClass,
                                              resolver.mapping);
-    if (definitions.modifiers.isConst()) {
+    if (definitions.modifiers.isConst) {
       compiler.reportError(node, MessageKind.CONST_WITHOUT_INITIALIZER);
     }
-    if (definitions.modifiers.isFinal() &&
+    if (definitions.modifiers.isFinal &&
         !resolver.allowFinalWithoutInitializer) {
       compiler.reportError(node, MessageKind.FINAL_WITHOUT_INITIALIZER);
     }
@@ -4462,11 +4461,11 @@
   visitNodeList(NodeList node) {
     for (Link<Node> link = node.nodes; !link.isEmpty; link = link.tail) {
       Identifier name = visit(link.head);
-      VariableElement element = new VariableElementX(
-          name.source, kind, resolver.enclosingElement,
+      VariableElement element = new LocalVariableElementX(
+          name.source, resolver.enclosingElement,
           variables, name.token);
       resolver.defineElement(link.head, element);
-      if (definitions.modifiers.isConst()) {
+      if (definitions.modifiers.isConst) {
         compiler.enqueuer.resolution.addDeferredAction(element, () {
           compiler.resolver.constantCompiler.compileConstant(element);
         });
@@ -4507,10 +4506,10 @@
   Selector createConstructorSelector(String constructorName) {
     return constructorName == ''
         ? new Selector.callDefaultConstructor(
-            resolver.enclosingElement.getLibrary())
+            resolver.enclosingElement.library)
         : new Selector.callConstructor(
             constructorName,
-            resolver.enclosingElement.getLibrary());
+            resolver.enclosingElement.library);
   }
 
   FunctionElement resolveConstructor(ClassElement cls,
@@ -4530,14 +4529,14 @@
           fullConstructorName,
           MessageKind.CANNOT_FIND_CONSTRUCTOR,
           {'constructorName': fullConstructorName});
-    } else if (inConstContext && !result.modifiers.isConst()) {
+    } else if (inConstContext && !result.isConst) {
       error(diagnosticNode, MessageKind.CONSTRUCTOR_IS_NOT_CONST);
     }
     return result;
   }
 
   Element visitNewExpression(NewExpression node) {
-    inConstContext = node.isConst();
+    inConstContext = node.isConst;
     Node selector = node.send.selector;
     Element element = visit(selector);
     assert(invariant(selector, element != null,
@@ -4554,8 +4553,8 @@
         message: 'No element return for $diagnosticNode.'));
     // Find the unnamed constructor if the reference resolved to a
     // class.
-    if (!Elements.isUnresolved(element) && !element.isConstructor()) {
-      if (element.isClass()) {
+    if (!Elements.isUnresolved(element) && !element.isConstructor) {
+      if (element.isClass) {
         ClassElement cls = element;
         cls.ensureResolved(compiler);
         // The unnamed constructor may not exist, so [e] may become unresolved.
@@ -4570,7 +4569,7 @@
       if (Elements.isUnresolved(element)) {
         type = compiler.types.dynamicType;
       } else {
-        type = element.getEnclosingClass().rawType;
+        type = element.enclosingClass.rawType;
       }
     }
     resolver.mapping.setType(expression, type);
@@ -4596,11 +4595,11 @@
     Identifier name = node.selector.asIdentifier();
     if (name == null) internalError(node.selector, 'unexpected node');
 
-    if (element.isClass()) {
+    if (element.isClass) {
       ClassElement cls = element;
       cls.ensureResolved(compiler);
       return resolveConstructor(cls, name, name.source);
-    } else if (element.isPrefix()) {
+    } else if (element.isPrefix) {
       PrefixElement prefix = element;
       element = prefix.lookupLocalMember(name.source);
       element = Elements.unwrap(element, compiler, node);
@@ -4610,7 +4609,7 @@
             name.source,
             MessageKind.CANNOT_RESOLVE,
             {'name': name});
-      } else if (!element.isClass()) {
+      } else if (!element.isClass) {
         error(node, MessageKind.NOT_A_TYPE, {'node': name});
       }
     } else {
@@ -4629,15 +4628,15 @@
       return failOrReturnErroneousElement(resolver.enclosingElement, node, name,
                                           MessageKind.CANNOT_RESOLVE,
                                           {'name': name});
-    } else if (element.isErroneous()) {
+    } else if (element.isErroneous) {
       return element;
-    } else if (element.isTypedef()) {
+    } else if (element.isTypedef) {
       error(node, MessageKind.CANNOT_INSTANTIATE_TYPEDEF,
             {'typedefName': name});
-    } else if (element.isTypeVariable()) {
+    } else if (element.isTypeVariable) {
       error(node, MessageKind.CANNOT_INSTANTIATE_TYPE_VARIABLE,
             {'typeVariableName': name});
-    } else if (!element.isClass() && !element.isPrefix()) {
+    } else if (!element.isClass && !element.isPrefix) {
       error(node, MessageKind.NOT_A_TYPE, {'node': name});
     }
     return element;
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart b/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
index 0b59263..975d897 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
@@ -12,22 +12,24 @@
 import '../elements/elements.dart';
 import '../elements/modelx.dart'
     show BaseClassElementX,
-         FunctionElementX,
+         ConstructorElementX,
          ErroneousElementX,
-         VariableElementX,
          FieldParameterElementX,
-         VariableList,
+         FunctionElementX,
          FunctionSignatureX,
          LabelElementX,
-         TargetElementX,
+         LocalFunctionElementX,
+         LocalVariableElementX,
+         MetadataAnnotationX,
          MixinApplicationElementX,
          ParameterElementX,
-         TypeVariableElementX,
-         TypedefElementX,
-         SynthesizedConstructorElementX,
-         MetadataAnnotationX,
          ParameterMetadataAnnotation,
-         MetadataContainer;
+         SynthesizedConstructorElementX,
+         TargetElementX,
+         TypedefElementX,
+         TypeVariableElementX,
+         VariableElementX,
+         VariableList;
 import '../util/util.dart';
 
 import 'secret_tree_element.dart' show getTreeElement, setTreeElement;
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
index 9a65447..22b7a8b 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
@@ -57,10 +57,10 @@
     if (definition is NodeList) {
       internalError(node, 'optional parameters are not implemented');
     }
-    if (node.modifiers.isConst()) {
+    if (node.modifiers.isConst) {
       compiler.reportError(node, MessageKind.FORMAL_DECLARED_CONST);
     }
-    if (node.modifiers.isStatic()) {
+    if (node.modifiers.isStatic) {
       compiler.reportError(node, MessageKind.FORMAL_DECLARED_STATIC);
     }
 
@@ -175,11 +175,11 @@
       Identifier name = getParameterName(node);
       validateName(name);
       Element fieldElement =
-          enclosingElement.getEnclosingClass().lookupLocalMember(name.source);
+          enclosingElement.enclosingClass.lookupLocalMember(name.source);
       if (fieldElement == null ||
           !identical(fieldElement.kind, ElementKind.FIELD)) {
         error(node, MessageKind.NOT_A_FIELD, {'fieldName': name});
-      } else if (!fieldElement.isInstanceMember()) {
+      } else if (!fieldElement.isInstanceMember) {
         error(node, MessageKind.NOT_INSTANCE_FIELD, {'fieldName': name});
       }
       element = new FieldParameterElementX(enclosingElement,
@@ -208,11 +208,11 @@
   Element visitFunctionExpression(FunctionExpression node) {
     // This is a function typed parameter.
     Modifiers modifiers = currentDefinitions.modifiers;
-    if (modifiers.isFinal()) {
+    if (modifiers.isFinal) {
       compiler.reportError(modifiers,
           MessageKind.FINAL_FUNCTION_TYPE_PARAMETER);
     }
-    if (modifiers.isVar()) {
+    if (modifiers.isVar) {
       compiler.reportError(modifiers, MessageKind.VAR_FUNCTION_TYPE_PARAMETER);
     }
 
@@ -251,12 +251,12 @@
     Link<Element> parameters = const Link<Element>();
     int requiredParameterCount = 0;
     if (formalParameters == null) {
-      if (!element.isGetter()) {
+      if (!element.isGetter) {
         compiler.reportError(element, MessageKind.MISSING_FORMALS);
       }
     } else {
-      if (element.isGetter()) {
-        if (!identical(formalParameters.getEndToken().next.stringValue,
+      if (element.isGetter) {
+        if (!identical(formalParameters.endToken.next.stringValue,
                        // TODO(ahe): Remove the check for native keyword.
                        'native')) {
           compiler.reportError(formalParameters,
@@ -269,8 +269,8 @@
       parameters = parametersBuilder.toLink();
     }
     DartType returnType;
-    if (element.isFactoryConstructor()) {
-      returnType = element.getEnclosingClass().thisType;
+    if (element.isFactoryConstructor) {
+      returnType = element.enclosingClass.thisType;
       // Because there is no type annotation for the return type of
       // this element, we explicitly add one.
       if (compiler.enableTypeAssertions) {
@@ -280,7 +280,7 @@
       returnType = visitor.resolveReturnType(returnNode);
     }
 
-    if (element.isSetter() && (requiredParameterCount != 1 ||
+    if (element.isSetter && (requiredParameterCount != 1 ||
                                visitor.optionalParameterCount != 0)) {
       // If there are no formal parameters, we already reported an error above.
       if (formalParameters != null) {
@@ -336,7 +336,7 @@
 
   DartType resolveTypeAnnotation(TypeAnnotation annotation) {
     DartType type = resolveReturnType(annotation);
-    if (type == compiler.types.voidType) {
+    if (type.isVoid) {
       compiler.reportError(annotation, MessageKind.VOID_NOT_ALLOWED);
     }
     return type;
diff --git a/sdk/lib/_internal/compiler/implementation/resolved_visitor.dart b/sdk/lib/_internal/compiler/implementation/resolved_visitor.dart
index edf4c2c..f966003 100644
--- a/sdk/lib/_internal/compiler/implementation/resolved_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolved_visitor.dart
@@ -17,7 +17,7 @@
     } else if (node.isOperator) {
       return visitOperatorSend(node);
     } else if (node.isPropertyAccess) {
-      if (!Elements.isUnresolved(element) && element.impliesType()) {
+      if (!Elements.isUnresolved(element) && element.impliesType) {
         // A reference to a class literal, typedef or type variable.
         return visitTypeReferenceSend(node);
       } else {
@@ -39,13 +39,13 @@
         } else {
           return visitStaticSend(node);
         }
-      } else if (element.impliesType()) {
+      } else if (element.impliesType) {
         // A reference to a class literal, typedef or type variable.
         return visitTypeReferenceSend(node);
-      } else if (element.isInstanceMember()) {
+      } else if (element.isInstanceMember) {
         // Example: f() with 'f' bound to instance method.
         return visitDynamicSend(node);
-      } else if (!element.isInstanceMember()) {
+      } else if (!element.isInstanceMember) {
         // Example: A.f() or f() with 'f' bound to a static function.
         // Also includes new A() or new A.named() which is treated like a
         // static call to a factory.
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
index 7e6a81b..4eeed62 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
@@ -34,6 +34,12 @@
     super.resolutionState = state;
   }
 
+  ClassNode get node {
+    assert(invariant(this, cachedNode != null,
+        message: "Node has not been computed for $this."));
+    return cachedNode;
+  }
+
   ClassNode parseNode(Compiler compiler) {
     if (cachedNode != null) return cachedNode;
     compiler.withCurrentElement(this, () {
@@ -57,7 +63,7 @@
     return cachedNode;
   }
 
-  Token position() => beginToken;
+  Token get position => beginToken;
 
   // TODO(johnniwinther): Ensure that modifiers are always available.
   Modifiers get modifiers =>
@@ -72,7 +78,7 @@
   MemberListener(DiagnosticListener listener,
                  Element enclosingElement)
       : this.enclosingElement = enclosingElement,
-        super(listener, enclosingElement.getCompilationUnit());
+        super(listener, enclosingElement.compilationUnit);
 
   bool isConstructorName(Node nameNode) {
     if (enclosingElement == null ||
@@ -121,21 +127,27 @@
     pushNode(null);
     bool isConstructor = isConstructorName(method.name);
     String name = getMethodNameHack(method.name);
-    ElementKind kind = ElementKind.FUNCTION;
+    Element memberElement;
     if (isConstructor) {
       if (getOrSet != null) {
         recoverableError(getOrSet, 'illegal modifier');
       }
-      kind = ElementKind.GENERATIVE_CONSTRUCTOR;
-    } else if (getOrSet != null) {
-      kind = (identical(getOrSet.stringValue, 'get'))
-             ? ElementKind.GETTER : ElementKind.SETTER;
+      memberElement = new PartialConstructorElement(
+          name, beginToken, endToken,
+          ElementKind.GENERATIVE_CONSTRUCTOR,
+          method.modifiers,
+          enclosingElement);
+    } else {
+      ElementKind kind = ElementKind.FUNCTION;
+      if (getOrSet != null) {
+        kind = (identical(getOrSet.stringValue, 'get'))
+               ? ElementKind.GETTER : ElementKind.SETTER;
+      }
+      memberElement =
+          new PartialFunctionElement(name, beginToken, getOrSet, endToken,
+                                     kind, method.modifiers, enclosingElement,
+                                     !method.hasBody());
     }
-    bool hasNoBody = !isConstructor && !method.hasBody();
-    Element memberElement =
-        new PartialFunctionElement(name, beginToken, getOrSet, endToken,
-                                   kind, method.modifiers, enclosingElement,
-                                   hasNoBody);
     addMember(memberElement);
   }
 
@@ -153,9 +165,11 @@
       }
     }
     ElementKind kind = ElementKind.FUNCTION;
-    Element memberElement =
-        new PartialFunctionElement(name, beginToken, null, endToken, kind,
-                                   method.modifiers, enclosingElement, false);
+    Element memberElement = new PartialConstructorElement(
+        name, beginToken, endToken,
+        ElementKind.FUNCTION,
+        method.modifiers,
+        enclosingElement);
     addMember(memberElement);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index 23bb0d7..dafeb03 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -799,7 +799,7 @@
   bool allowLibraryTags() {
     // Library tags are only allowed in the library file itself, not
     // in sourced files.
-    LibraryElement library = compilationUnitElement.getLibrary();
+    LibraryElement library = compilationUnitElement.library;
     return !compilationUnitElement.hasMembers
       && library.entryCompilationUnit == compilationUnitElement;
   }
@@ -1219,7 +1219,7 @@
     if (!allowLibraryTags()) {
       recoverableError(tag, 'Library tags not allowed here.');
     }
-    compilationUnitElement.getImplementationLibrary().addTag(tag, listener);
+    compilationUnitElement.implementationLibrary.addTag(tag, listener);
   }
 
   void pushNode(Node node) {
@@ -2072,47 +2072,78 @@
   }
 }
 
-class PartialFunctionElement extends FunctionElementX {
-  final Token beginToken;
-  final Token getOrSet;
-  final Token endToken;
+abstract class PartialFunctionMixin implements FunctionElement {
+  FunctionExpression cachedNode;
+  Modifiers get modifiers;
+  Token beginToken;
+  Token getOrSet;
+  Token endToken;
 
   /**
    * The position is computed in the constructor using [findMyName]. Computing
    * it on demand fails in case tokens are GC'd.
    */
-  final Token _position;
+  Token _position;
 
-  PartialFunctionElement(String name,
-                         Token beginToken,
-                         this.getOrSet,
-                         this.endToken,
-                         ElementKind kind,
-                         Modifiers modifiers,
-                         Element enclosing,
-                         bool hasNoBody)
-    : super(name, kind, modifiers, enclosing, hasNoBody),
-      beginToken = beginToken,
-      _position = ElementX.findNameToken(
-          beginToken,
-          modifiers.isFactory() ||
-            identical(kind, ElementKind.GENERATIVE_CONSTRUCTOR),
-          name, enclosing.name);
+  void init(Token beginToken, Token getOrSet, Token endToken) {
+    this.beginToken = beginToken;
+    this.getOrSet = getOrSet;
+    this.endToken = endToken;
+    _position = ElementX.findNameToken(
+        beginToken,
+        modifiers.isFactory ||
+          identical(kind, ElementKind.GENERATIVE_CONSTRUCTOR),
+        name, enclosingElement.name);
+  }
+
+  FunctionExpression get node {
+    assert(invariant(this, cachedNode != null,
+        message: "Node has not been computed for $this."));
+    return cachedNode;
+  }
 
   FunctionExpression parseNode(DiagnosticListener listener) {
     if (cachedNode != null) return cachedNode;
     parseFunction(Parser p) {
-      if (isMember() && modifiers.isFactory()) {
+      if (isMember && modifiers.isFactory) {
         p.parseFactoryMethod(beginToken);
       } else {
         p.parseFunction(beginToken, getOrSet);
       }
     }
-    cachedNode = parse(listener, getCompilationUnit(), parseFunction);
+    cachedNode = parse(listener, compilationUnit, parseFunction);
     return cachedNode;
   }
 
-  Token position() => _position;
+  Token get position => _position;
+}
+
+class PartialFunctionElement extends FunctionElementX
+    with PartialFunctionMixin {
+  PartialFunctionElement(String name,
+                         Token beginToken,
+                         Token getOrSet,
+                         Token endToken,
+                         ElementKind kind,
+                         Modifiers modifiers,
+                         Element enclosing,
+                         bool hasNoBody)
+      : super(name, kind, modifiers, enclosing, hasNoBody) {
+    init(beginToken, getOrSet, endToken);
+  }
+}
+
+class PartialConstructorElement extends ConstructorElementX
+    with PartialFunctionMixin {
+  PartialConstructorElement(String name,
+                            Token beginToken,
+                            Token endToken,
+                            ElementKind kind,
+                            Modifiers modifiers,
+                            Element enclosing)
+      : super(name, kind, modifiers, enclosing) {
+    init(beginToken, null, endToken);
+  }
 }
 
 class PartialFieldList extends VariableList {
@@ -2122,18 +2153,18 @@
   PartialFieldList(Token this.beginToken,
                    Token this.endToken,
                    Modifiers modifiers)
-    : super(modifiers);
+      : super(modifiers);
 
   VariableDefinitions parseNode(Element element, DiagnosticListener listener) {
     if (definitions != null) return definitions;
     listener.withCurrentElement(element, () {
       definitions = parse(listener,
-                          element.getCompilationUnit(),
+                          element.compilationUnit,
                           (p) => p.parseVariablesDeclaration(beginToken));
 
-      if (!definitions.modifiers.isVar() &&
-          !definitions.modifiers.isFinal() &&
-          !definitions.modifiers.isConst() &&
+      if (!definitions.modifiers.isVar &&
+          !definitions.modifiers.isFinal &&
+          !definitions.modifiers.isConst &&
           definitions.type == null) {
         listener.reportError(
             definitions,
@@ -2170,12 +2201,12 @@
   Node parseNode(DiagnosticListener listener) {
     if (cachedNode != null) return cachedNode;
     cachedNode = parse(listener,
-                       getCompilationUnit(),
+                       compilationUnit,
                        (p) => p.parseTopLevelDeclaration(token));
     return cachedNode;
   }
 
-  Token position() => findMyName(token);
+  Token get position => findMyName(token);
 }
 
 /// A [MetadataAnnotation] which is constructed on demand.
@@ -2199,7 +2230,7 @@
   Node parseNode(DiagnosticListener listener) {
     if (cachedNode != null) return cachedNode;
     Metadata metadata = parse(listener,
-                              annotatedElement.getCompilationUnit(),
+                              annotatedElement.compilationUnit,
                               (p) => p.parseMetadata(beginToken));
     cachedNode = metadata.expression;
     return cachedNode;
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/parser_task.dart b/sdk/lib/_internal/compiler/implementation/scanner/parser_task.dart
index e83e6f5..0a9b849 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/parser_task.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/parser_task.dart
@@ -8,7 +8,7 @@
   ParserTask(Compiler compiler) : super(compiler);
   String get name => 'Parser';
 
-  Node parse(Element element) {
+  Node parse(ElementX element) {
     return measure(() => element.parseNode(compiler));
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart b/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
index b27bd15..5f3ddbe 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
@@ -9,6 +9,7 @@
 import '../elements/elements.dart';
 import '../elements/modelx.dart'
     show ElementX,
+         ConstructorElementX,
          FunctionElementX,
          TypedefElementX,
          VariableElementX,
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index efbad80..fcef110 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -47,7 +47,7 @@
                    kind == ElementKind.SETTER) {
           graph = builder.buildMethod(element);
         } else if (kind == ElementKind.FIELD) {
-          if (element.isInstanceMember()) {
+          if (element.isInstanceMember) {
             assert(compiler.enableTypeAssertions);
             graph = builder.buildCheckedSetter(element);
           } else {
@@ -70,11 +70,11 @@
         }
         if (compiler.tracer.enabled) {
           String name;
-          if (element.isMember()) {
-            String className = element.getEnclosingClass().name;
+          if (element.isMember) {
+            String className = element.enclosingClass.name;
             String memberName = element.name;
             name = "$className.$memberName";
-            if (element.isGenerativeConstructorBody()) {
+            if (element.isGenerativeConstructorBody) {
               name = "$name (body)";
             }
           } else {
@@ -115,9 +115,26 @@
   SsaBuilder builder;
   ClosureClassMap closureData;
 
-  LocalsHandler(this.builder)
-      : directLocals = new Map<Element, HInstruction>(),
-        redirectionMapping = new Map<Element, Element>();
+  /// The class that defines the current type environment or null if no type
+  /// variables are in scope.
+  final ClassElement contextClass;
+
+  LocalsHandler(this.builder, this.contextClass)
+      : redirectionMapping = new Map<Element, Element>(),
+        directLocals = new Map<Element, HInstruction>();
+
+  /// Substituted type variables occurring in [type] into the context of
+  /// [contextClass].
+  DartType substInContext(DartType type) {
+    if (contextClass != null) {
+      ClassElement typeContext = Types.getClassContext(type);
+      if (typeContext != null) {
+        type = type.substByContext(
+            contextClass.asInstanceOf(typeContext));
+      }
+    }
+    return type;
+  }
 
   get typesTask => builder.compiler.typesTask;
 
@@ -129,6 +146,7 @@
   LocalsHandler.from(LocalsHandler other)
       : directLocals = new Map<Element, HInstruction>.from(other.directLocals),
         redirectionMapping = other.redirectionMapping,
+        contextClass = other.contextClass,
         builder = other.builder,
         closureData = other.closureData;
 
@@ -164,7 +182,7 @@
     if (scopeData == null) return;
     HInstruction box;
     // The scope has captured variables.
-    if (element != null && element.isGenerativeConstructorBody()) {
+    if (element != null && element.isGenerativeConstructorBody) {
       // The box is passed as a parameter to a generative
       // constructor body.
       JavaScriptBackend backend = builder.backend;
@@ -179,7 +197,7 @@
     scopeData.capturedVariableMapping.forEach((Element from, Element to) {
       // The [from] can only be a parameter for function-scopes and not
       // loop scopes.
-      if (from.isParameter() && !element.isGenerativeConstructorBody()) {
+      if (from.isParameter && !element.isGenerativeConstructorBody) {
         // Now that the redirection is set up, the update to the local will
         // write the parameter value into the box.
         // Store the captured parameter in the box. Get the current value
@@ -231,7 +249,7 @@
       FunctionElement functionElement = element;
       FunctionSignature params = functionElement.functionSignature;
       params.orderedForEachParameter((Element parameterElement) {
-        if (element.isGenerativeConstructorBody()) {
+        if (element.isGenerativeConstructorBody) {
           ClosureScope scopeData = closureData.capturingScopes[node];
           if (scopeData != null
               && scopeData.capturedVariableMapping.containsKey(
@@ -258,14 +276,14 @@
       redirectElement(from, to);
     });
     JavaScriptBackend backend = compiler.backend;
-    if (closureData.isClosure()) {
+    if (closureData.isClosure) {
       // Inside closure redirect references to itself to [:this:].
       HThis thisInstruction = new HThis(closureData.thisElement,
                                         backend.nonNullType);
       builder.graph.thisInstruction = thisInstruction;
       builder.graph.entry.addAtEntry(thisInstruction);
       updateLocal(closureData.closureElement, thisInstruction);
-    } else if (element.isInstanceMember()) {
+    } else if (element.isInstanceMember) {
       // Once closures have been mapped to classes their instance members might
       // not have any thisElement if the closure was created inside a static
       // context.
@@ -279,13 +297,13 @@
     // If this method is an intercepted method, add the extra
     // parameter to it, that is the actual receiver for intercepted
     // classes, or the same as [:this:] for non-intercepted classes.
-    ClassElement cls = element.getEnclosingClass();
+    ClassElement cls = element.enclosingClass;
 
     // When the class extends a native class, the instance is pre-constructed
     // and passed to the generative constructor factory function as a parameter.
     // Instead of allocating and initializing the object, the constructor
     // 'upgrades' the native subclass object by initializing the Dart fields.
-    bool isNativeUpgradeFactory = element.isGenerativeConstructor()
+    bool isNativeUpgradeFactory = element.isGenerativeConstructor
         && Elements.isNativeOrExtendsNative(cls);
     if (backend.isInterceptedMethod(element)) {
       bool isInterceptorClass = backend.isInterceptorClass(cls.declaration);
@@ -328,7 +346,7 @@
     if (isAccessedDirectly(element)) return false;
     Element redirectTarget = redirectionMapping[element];
     if (redirectTarget == null) return false;
-    if (redirectTarget.isMember()) {
+    if (redirectTarget.isMember) {
       assert(redirectTarget is ClosureFieldElement);
       return true;
     }
@@ -353,7 +371,7 @@
   HInstruction readLocal(Element element) {
     if (isAccessedDirectly(element)) {
       if (directLocals[element] == null) {
-        if (element.isTypeVariable()) {
+        if (element.isTypeVariable) {
           builder.compiler.internalError(builder.compiler.currentElement,
               "Runtime type information not available for $element.");
         } else {
@@ -410,7 +428,7 @@
     // it could then have another name than the real parameter. And
     // the other one would not know it is just a copy of the real
     // parameter.
-    if (element.isParameter()) return builder.parameters[element];
+    if (element.isParameter) return builder.parameters[element];
 
     return builder.activationVariables.putIfAbsent(element, () {
       JavaScriptBackend backend = builder.backend;
@@ -969,7 +987,7 @@
       this.work = work,
       this.rti = backend.rti,
       super(work.resolutionTree, backend.compiler) {
-    localsHandler = new LocalsHandler(this);
+    localsHandler = new LocalsHandler(this, work.element.contextClass);
     sourceElementStack.add(work.element);
   }
 
@@ -1038,7 +1056,7 @@
       FunctionElement functionElement = element;
       if (functionElement.patch != null) element = functionElement.patch;
     }
-    Script script = element.getCompilationUnit().script;
+    Script script = element.compilationUnit.script;
     return script.file;
   }
 
@@ -1063,14 +1081,14 @@
     assert(invariant(function, function.isImplementation));
     assert(providedArguments != null);
 
-    bool isInstanceMember = function.isInstanceMember();
+    bool isInstanceMember = function.isInstanceMember;
     // For static calls, [providedArguments] is complete, default arguments
     // have been included if necessary, see [addStaticSendArgumentsToList].
     if (!isInstanceMember
         || currentNode == null // In erroneous code, currentNode can be null.
         || providedArgumentsKnownToBeComplete(currentNode)
-        || function.isGenerativeConstructorBody()
-        || selector.isGetter()) {
+        || function.isGenerativeConstructorBody
+        || selector.isGetter) {
       // For these cases, the provided argument list is known to be complete.
       return providedArguments;
     } else {
@@ -1180,14 +1198,14 @@
 
       assert(selector != null
              || Elements.isStaticOrTopLevel(element)
-             || element.isGenerativeConstructorBody());
+             || element.isGenerativeConstructorBody);
       if (selector != null && !selector.applies(function, compiler)) {
         return false;
       }
 
       // Don't inline operator== methods if the parameter can be null.
       if (element.name == '==') {
-        if (element.getEnclosingClass() != compiler.objectClass
+        if (element.enclosingClass != compiler.objectClass
             && providedArguments[1].canBeNull()) {
           return false;
         }
@@ -1195,14 +1213,14 @@
 
       // Generative constructors of native classes should not be called directly
       // and have an extra argument that causes problems with inlining.
-      if (element.isGenerativeConstructor()
-          && Elements.isNativeOrExtendsNative(element.getEnclosingClass())) {
+      if (element.isGenerativeConstructor
+          && Elements.isNativeOrExtendsNative(element.enclosingClass)) {
         return false;
       }
 
       // A generative constructor body is not seen by global analysis,
       // so we should not query for its type.
-      if (!element.isGenerativeConstructorBody()) {
+      if (!element.isGenerativeConstructorBody) {
         // Don't inline if the return type was inferred to be non-null empty.
         // This means that the function always throws an exception.
         TypeMask returnType =
@@ -1251,7 +1269,7 @@
         useMaxInliningNodes = false;
       }
       bool canInline;
-      ast.FunctionExpression functionNode = function.parseNode(compiler);
+      ast.FunctionExpression functionNode = function.node;
       canInline = InlineWeeder.canBeInlined(
           functionNode, maxInliningNodes, useMaxInliningNodes);
       if (canInline) {
@@ -1266,8 +1284,8 @@
       // Add an explicit null check on the receiver before doing the
       // inlining. We use [element] to get the same name in the
       // NoSuchMethodError message as if we had called it.
-      if (element.isInstanceMember()
-          && !element.isGenerativeConstructorBody()
+      if (element.isInstanceMember
+          && !element.isGenerativeConstructorBody
           && (selector.mask == null || selector.mask.isNullable)) {
         addWithPosition(
             new HFieldGet(null, providedArguments[0], backend.dynamicType,
@@ -1315,10 +1333,10 @@
   }
 
   Element get currentNonClosureClass {
-    ClassElement cls = sourceElement.getEnclosingClass();
-    if (cls != null && cls.isClosure()) {
+    ClassElement cls = sourceElement.enclosingClass;
+    if (cls != null && cls.isClosure) {
       var closureClass = cls;
-      return closureClass.methodElement.getEnclosingClass();
+      return closureClass.methodElement.enclosingClass;
     } else {
       return cls;
     }
@@ -1370,7 +1388,7 @@
     TypeMask result = cachedTypeOfThis;
     if (result == null) {
       Element element = localsHandler.closureData.thisElement;
-      ClassElement cls = element.enclosingElement.getEnclosingClass();
+      ClassElement cls = element.enclosingElement.enclosingClass;
       if (compiler.world.isUsedAsMixin(cls)) {
         // If the enclosing class is used as a mixin, [:this:] can be
         // of the class that mixins the enclosing class. These two
@@ -1389,7 +1407,7 @@
       new Map<Element, TypeMask>();
 
   TypeMask getTypeOfCapturedVariable(Element element) {
-    assert(element.isField());
+    assert(element.isField);
     return cachedTypesOfCapturedVariables.putIfAbsent(element, () {
       return TypeMaskFactory.inferredTypeForElement(element, compiler);
     });
@@ -1403,9 +1421,9 @@
   HGraph buildMethod(FunctionElement functionElement) {
     assert(invariant(functionElement, functionElement.isImplementation));
     graph.calledInLoop = compiler.world.isCalledInLoop(functionElement);
-    ast.FunctionExpression function = functionElement.parseNode(compiler);
+    ast.FunctionExpression function = functionElement.node;
     assert(function != null);
-    assert(!function.modifiers.isExternal());
+    assert(!function.modifiers.isExternal);
     assert(elements[function] != null);
     openFunction(functionElement, function);
     String name = functionElement.name;
@@ -1434,7 +1452,7 @@
   }
 
   HGraph buildCheckedSetter(VariableElement field) {
-    openFunction(field, field.parseNode(compiler));
+    openFunction(field, field.node);
     HInstruction thisInstruction = localsHandler.readThis();
     // Use dynamic type because the type computed by the inferrer is
     // narrowed to the type annotation.
@@ -1450,7 +1468,7 @@
   }
 
   HGraph buildLazyInitializer(VariableElement variable) {
-    ast.Node node = variable.parseNode(compiler);
+    ast.Node node = variable.node;
     openFunction(variable, node);
     assert(variable.initializer != null);
     visit(variable.initializer);
@@ -1467,17 +1485,17 @@
    * Returns [:null:] if the constructor does not have a body.
    */
   ConstructorBodyElement getConstructorBody(FunctionElement constructor) {
-    assert(constructor.isGenerativeConstructor());
+    assert(constructor.isGenerativeConstructor);
     assert(invariant(constructor, constructor.isImplementation));
     if (constructor.isSynthesized) return null;
-    ast.FunctionExpression node = constructor.parseNode(compiler);
+    ast.FunctionExpression node = constructor.node;
     // If we know the body doesn't have any code, we don't generate it.
     if (!node.hasBody()) return null;
     if (node.hasEmptyBody()) return null;
-    ClassElement classElement = constructor.getEnclosingClass();
+    ClassElement classElement = constructor.enclosingClass;
     ConstructorBodyElement bodyElement;
     classElement.forEachBackendMember((Element backendMember) {
-      if (backendMember.isGenerativeConstructorBody()) {
+      if (backendMember.isGenerativeConstructorBody) {
         ConstructorBodyElement body = backendMember;
         if (body.constructor == constructor) {
           // TODO(kasperl): Find a way of stopping the iteration
@@ -1499,7 +1517,7 @@
         classElement.origin.addBackendMember(bodyElement.origin);
       }
     }
-    assert(bodyElement.isGenerativeConstructorBody());
+    assert(bodyElement.isGenerativeConstructorBody);
     return bodyElement;
   }
 
@@ -1526,10 +1544,10 @@
    */
   void setupStateForInlining(FunctionElement function,
                              List<HInstruction> compiledArguments) {
-    localsHandler = new LocalsHandler(this);
+    localsHandler = new LocalsHandler(this, function.contextClass);
     localsHandler.closureData =
         compiler.closureToClassMapper.computeClosureToClassMapping(
-            function, function.parseNode(compiler), elements);
+            function, function.node, elements);
     // TODO(kasperl): Bad smell. We shouldn't be constructing elements here.
     returnElement = new VariableElementX.synthetic("result",
         ElementKind.VARIABLE, function);
@@ -1539,7 +1557,7 @@
     inTryStatement = false; // TODO(lry): why? Document.
 
     int argumentIndex = 0;
-    if (function.isInstanceMember()) {
+    if (function.isInstanceMember) {
       localsHandler.updateLocal(localsHandler.closureData.thisElement,
           compiledArguments[argumentIndex++]);
     }
@@ -1550,8 +1568,8 @@
       localsHandler.updateLocal(parameter, argument);
     });
 
-    ClassElement enclosing = function.getEnclosingClass();
-    if ((function.isConstructor() || function.isGenerativeConstructorBody())
+    ClassElement enclosing = function.enclosingClass;
+    if ((function.isConstructor || function.isGenerativeConstructorBody)
         && backend.classNeedsRti(enclosing)) {
       enclosing.typeVariables.forEach((TypeVariableType typeVariable) {
         HInstruction argument = compiledArguments[argumentIndex++];
@@ -1581,10 +1599,10 @@
    */
   void visitInlinedFunction(FunctionElement function) {
     potentiallyCheckInlinedParameterTypes(function);
-    if (function.isGenerativeConstructor()) {
+    if (function.isGenerativeConstructor) {
       buildFactory(function);
     } else {
-      ast.FunctionExpression functionNode = function.parseNode(compiler);
+      ast.FunctionExpression functionNode = function.node;
       functionNode.body.accept(this);
     }
   }
@@ -1620,31 +1638,9 @@
     if (!compiler.enableTypeAssertions) return;
 
     FunctionSignature signature = function.functionSignature;
-
-    InterfaceType contextType;
-    if (function.isSynthesized && function.isGenerativeConstructor()) {
-      // Synthesized constructors reuse the parameters from the
-      // [targetConstructor]. In face of generic types, the type variables
-      // occurring in the parameter types must be substituted by the type
-      // arguments of the enclosing class.
-      FunctionElement target = function;
-      while (target.targetConstructor != null) {
-        target = target.targetConstructor;
-      }
-      if (target != function) {
-        ClassElement functionClass = function.getEnclosingClass();
-        ClassElement targetClass = target.getEnclosingClass();
-        contextType = functionClass.thisType.asInstanceOf(targetClass);
-      }
-    }
-
     signature.orderedForEachParameter((ParameterElement parameter) {
       HInstruction argument = localsHandler.readLocal(parameter);
-      DartType parameterType = parameter.type;
-      if (contextType != null) {
-        parameterType = parameterType.substByContext(contextType);
-      }
-      potentiallyCheckType(argument, parameterType);
+      potentiallyCheckType(argument, parameter.type);
     });
   }
 
@@ -1661,16 +1657,17 @@
     callee = callee.implementation;
     compiler.withCurrentElement(callee, () {
       constructors.add(callee);
-      ClassElement enclosingClass = callee.getEnclosingClass();
+      ClassElement enclosingClass = callee.enclosingClass;
       if (backend.classNeedsRti(enclosingClass)) {
         // If [enclosingClass] needs RTI, we have to give a value to its
         // type parameters.
-        ClassElement currentClass = caller.getEnclosingClass();
+        ClassElement currentClass = caller.enclosingClass;
         // For a super constructor call, the type is the supertype of
         // [currentClass]. For a redirecting constructor, the type is
         // the current type. [InterfaceType.asInstanceOf] takes care
         // of both.
         InterfaceType type = currentClass.thisType.asInstanceOf(enclosingClass);
+        type = localsHandler.substInContext(type);
         Link<DartType> typeVariables = enclosingClass.typeVariables;
         type.typeArguments.forEach((DartType argument) {
           localsHandler.updateLocal(
@@ -1691,7 +1688,7 @@
 
       // For redirecting constructors, the fields have already been
       // initialized by the caller.
-      if (callee.getEnclosingClass() != caller.getEnclosingClass()) {
+      if (callee.enclosingClass != caller.enclosingClass) {
         inlinedFrom(callee, () {
           buildFieldInitializers(callee.enclosingElement.implementation,
                                fieldValues);
@@ -1719,7 +1716,7 @@
       TreeElements oldElements = elements;
       elements = compiler.enqueuer.resolution.getCachedElements(callee);
       ClosureClassMap oldClosureData = localsHandler.closureData;
-      ast.Node node = callee.parseNode(compiler);
+      ast.Node node = callee.node;
       ClosureClassMap newClosureData =
           compiler.closureToClassMapper.computeClosureToClassMapping(
               callee, node, elements);
@@ -1767,7 +1764,7 @@
           constructor);
       return;
     }
-    ast.FunctionExpression functionNode = constructor.parseNode(compiler);
+    ast.FunctionExpression functionNode = constructor.node;
 
     bool foundSuperOrRedirect = false;
     if (functionNode.initializers != null) {
@@ -1811,13 +1808,13 @@
     if (!foundSuperOrRedirect) {
       // No super initializer found. Try to find the default constructor if
       // the class is not Object.
-      ClassElement enclosingClass = constructor.getEnclosingClass();
+      ClassElement enclosingClass = constructor.enclosingClass;
       ClassElement superClass = enclosingClass.superclass;
       if (!enclosingClass.isObject(compiler)) {
         assert(superClass != null);
         assert(superClass.resolutionState == STATE_DONE);
         Selector selector =
-            new Selector.callDefaultConstructor(enclosingClass.getLibrary());
+            new Selector.callDefaultConstructor(enclosingClass.library);
         // TODO(johnniwinther): Should we find injected constructors as well?
         FunctionElement target = superClass.lookupConstructor(selector);
         if (target == null) {
@@ -1853,7 +1850,7 @@
         (ClassElement enclosingClass, VariableElement member) {
           compiler.withCurrentElement(member, () {
             TreeElements definitions = member.treeElements;
-            ast.Node node = member.parseNode(compiler);
+            ast.Node node = member.node;
             ast.Expression initializer = member.initializer;
             if (initializer == null) {
               // Unassigned fields of native classes are not initialized to
@@ -1889,10 +1886,10 @@
   HGraph buildFactory(FunctionElement functionElement) {
     functionElement = functionElement.implementation;
     ClassElement classElement =
-        functionElement.getEnclosingClass().implementation;
+        functionElement.enclosingClass.implementation;
     bool isNativeUpgradeFactory =
         Elements.isNativeOrExtendsNative(classElement);
-    ast.FunctionExpression function = functionElement.parseNode(compiler);
+    ast.FunctionExpression function = functionElement.node;
     // Note that constructors (like any other static function) do not need
     // to deal with optional arguments. It is the callers job to provide all
     // arguments as if they were positional.
@@ -1938,14 +1935,7 @@
             assert(isNativeUpgradeFactory);
           } else {
             fields.add(member);
-            DartType type = member.type;
-            if (enclosingClass.isMixinApplication) {
-              // TODO(johnniwinther): Add a member-like abstraction for fields
-              // that normalizes this.
-              type = type.substByContext(
-                  enclosingClass.thisType.asInstanceOf(
-                      member.enclosingElement));
-            }
+            DartType type = localsHandler.substInContext(member.type);
             constructorArguments.add(potentiallyCheckType(value, type));
           }
         },
@@ -2018,7 +2008,7 @@
           // variables and get the list of type variables to keep track of how
           // many arguments we need to process.
           source = newSource;
-          contextClass = source.sourceElement.getEnclosingClass();
+          contextClass = source.sourceElement.enclosingClass;
           typeVariables = contextClass.typeVariables;
         } else {
           assert(source == newSource);
@@ -2069,7 +2059,7 @@
       bodyCallInputs.add(newObject);
       TreeElements elements =
           compiler.enqueuer.resolution.getCachedElements(constructor);
-      ast.Node node = constructor.parseNode(compiler);
+      ast.Node node = constructor.node;
       ClosureClassMap parameterClosureData =
           compiler.closureToClassMapper.getMappingForNestedFunction(node);
 
@@ -2083,11 +2073,13 @@
         }
       });
 
-      ClassElement currentClass = constructor.getEnclosingClass();
+      ClassElement currentClass = constructor.enclosingClass;
       if (backend.classNeedsRti(currentClass)) {
         // If [currentClass] needs RTI, we add the type variables as
         // parameters of the generative constructor body.
         currentClass.typeVariables.forEach((DartType argument) {
+          // TODO(johnniwinther): Substitute [argument] with
+          // `localsHandler.substInContext(argument)`.
           bodyCallInputs.add(localsHandler.readLocal(argument.element));
         });
       }
@@ -2138,7 +2130,7 @@
     // must be done before adding the normal parameters, because their types
     // may contain references to type variables.
     var enclosing = element.enclosingElement;
-    if ((element.isConstructor() || element.isGenerativeConstructorBody())
+    if ((element.isConstructor || element.isGenerativeConstructorBody)
         && backend.classNeedsRti(enclosing)) {
       enclosing.typeVariables.forEach((TypeVariableType typeVariable) {
         HParameterValue param = addParameter(
@@ -2156,7 +2148,7 @@
       // This way we ensure that a type guard will dominate the type
       // check.
       signature.orderedForEachParameter((ParameterElement parameterElement) {
-        if (element.isGenerativeConstructorBody()) {
+        if (element.isGenerativeConstructorBody) {
           ClosureScope scopeData =
               localsHandler.closureData.capturingScopes[node];
           if (scopeData != null
@@ -2180,11 +2172,29 @@
     }
   }
 
+  /// Check that [type] is valid in the context of `localsHandler.contextClass`.
+  /// This should only be called in assertions.
+  bool assertTypeInContext(DartType type, [Spannable spannable]) {
+    return invariant(spannable == null ? CURRENT_ELEMENT_SPANNABLE : spannable,
+        () {
+          ClassElement contextClass = Types.getClassContext(type);
+          return contextClass == null ||
+                 contextClass == localsHandler.contextClass;
+        },
+        message: "Type '$type' is not valid context of "
+                 "${localsHandler.contextClass}.");
+  }
+
+  /// Build a [HTypeConversion] for convertion [original] to type [type].
+  ///
+  /// Invariant: [type] must be valid in the context.
+  /// See [LocalsHandler.substInContext].
   HInstruction buildTypeConversion(HInstruction original,
                                    DartType type,
                                    int kind) {
     if (type == null) return original;
     type = type.unalias(compiler);
+    assert(assertTypeInContext(type, original));
     if (type.kind == TypeKind.INTERFACE && !type.treatAsRaw) {
       TypeMask subtype = new TypeMask.subtype(type.element);
       HInstruction representations = buildTypeArgumentRepresentations(type);
@@ -2215,6 +2225,7 @@
   HInstruction potentiallyCheckType(HInstruction original, DartType type,
       { int kind: HTypeConversion.CHECKED_MODE_CHECK }) {
     if (!compiler.enableTypeAssertions) return original;
+    type = localsHandler.substInContext(type);
     HInstruction other = buildTypeConversion(original, type, kind);
     if (other != original) add(other);
     compiler.enqueuer.codegen.registerIsCheck(type, work.resolutionTree);
@@ -2223,8 +2234,10 @@
 
   void assertIsSubtype(ast.Node node, DartType subtype, DartType supertype,
                        String message) {
-    HInstruction subtypeInstruction = analyzeTypeArgument(subtype);
-    HInstruction supertypeInstruction = analyzeTypeArgument(supertype);
+    HInstruction subtypeInstruction =
+        analyzeTypeArgument(localsHandler.substInContext(subtype));
+    HInstruction supertypeInstruction =
+        analyzeTypeArgument(localsHandler.substInContext(supertype));
     HInstruction messageInstruction =
         graph.addConstantString(new ast.DartString.literal(message), compiler);
     Element element = backend.getAssertIsSubtype();
@@ -2821,7 +2834,7 @@
     closureClassElement.forEachMember((_, Element member) {
       // The backendMembers also contains the call method(s). We are only
       // interested in the fields.
-      if (member.isField()) {
+      if (member.isField) {
         Element capturedLocal = nestedClosureData.capturedFieldMapping[member];
         assert(capturedLocal != null);
         capturedVariables.add(localsHandler.readLocal(capturedLocal));
@@ -2950,7 +2963,7 @@
                                                   Selector selector,
                                                   HInstruction receiver) {
     assert(Elements.isInstanceSend(send, elements));
-    assert(selector.isGetter());
+    assert(selector.isGetter);
     pushInvokeDynamic(send, selector, [receiver]);
   }
 
@@ -2977,13 +2990,22 @@
       visitForeignGetter(send);
     } else if (Elements.isStaticOrTopLevelField(element)) {
       Constant value;
-      if (element.isField() && !element.isAssignable()) {
+      if (element.isField && !element.isAssignable) {
         // A static final or const. Get its constant value and inline it if
         // the value can be compiled eagerly.
         value = backend.constants.getConstantForVariable(element);
       }
       if (value != null) {
-        HConstant instruction = graph.addConstant(value, compiler);
+        HConstant instruction;
+        // Constants that are referred via a deferred prefix should be referred
+        // by reference.
+        PrefixElement prefix = compiler.deferredLoadTask
+            .deferredPrefixElement(send, elements);
+        if (prefix != null) {
+          instruction = graph.addDeferredConstant(value, prefix, compiler);
+        } else {
+          instruction = graph.addConstant(value, compiler);
+        }
         stack.add(instruction);
         // The inferrer may have found a better type than the constant
         // handler in the case of lists, because the constant handler
@@ -2995,13 +3017,13 @@
           // cannot be null.
           instruction.instructionType = type.nonNullable();
         }
-      } else if (element.isField() && isLazilyInitialized(element)) {
+      } else if (element.isField && isLazilyInitialized(element)) {
         HInstruction instruction = new HLazyStatic(
             element,
             TypeMaskFactory.inferredTypeForElement(element, compiler));
         push(instruction);
       } else {
-        if (element.isGetter()) {
+        if (element.isGetter) {
           pushInvokeStatic(send, element, <HInstruction>[]);
         } else {
           // TODO(5346): Try to avoid the need for calling [declaration] before
@@ -3047,7 +3069,7 @@
       assert(send != null);
       location = send;
     }
-    assert(selector.isSetter());
+    assert(selector.isSetter);
     pushInvokeDynamic(location, selector, [receiver, value]);
     pop();
     stack.add(value);
@@ -3063,7 +3085,7 @@
       location = send;
     }
     if (Elements.isStaticOrTopLevelField(element)) {
-      if (element.isSetter()) {
+      if (element.isSetter) {
         pushInvokeStatic(location, element, <HInstruction>[value]);
         pop();
       } else {
@@ -3119,7 +3141,7 @@
     if (type.kind == TypeKind.TYPE_VARIABLE) {
       return buildLiteralList(<HInstruction>[addTypeVariableReference(type)]);
     } else {
-      assert(type.element.isClass());
+      assert(type.element.isClass);
       InterfaceType interface = type;
       List<HInstruction> inputs = <HInstruction>[];
       bool first = true;
@@ -3162,7 +3184,9 @@
         generateTypeError(node, element.message);
       } else {
         HInstruction converted = buildTypeConversion(
-            expression, type, HTypeConversion.CAST_TYPE_CHECK);
+            expression,
+            localsHandler.substInContext(type),
+            HTypeConversion.CAST_TYPE_CHECK);
         if (converted != expression) add(converted);
         stack.add(converted);
       }
@@ -3180,7 +3204,6 @@
     HInstruction expression = pop();
     bool isNot = node.isIsNotCheck;
     DartType type = elements.getType(node.typeAnnotationFromIsCheckOrCast);
-    type = type.unalias(compiler);
     HInstruction instruction = buildIsNode(node, type, expression);
     if (isNot) {
       add(instruction);
@@ -3189,8 +3212,10 @@
     push(instruction);
   }
 
-  HInstruction buildIsNode(ast.Node node, DartType type, HInstruction expression) {
-    type = type.unalias(compiler);
+  HInstruction buildIsNode(ast.Node node,
+                           DartType type,
+                           HInstruction expression) {
+    type = localsHandler.substInContext(type).unalias(compiler);
     if (type.kind == TypeKind.FUNCTION) {
       List arguments = [buildFunctionType(type), expression];
       pushInvokeDynamic(
@@ -3317,7 +3342,7 @@
     addDynamicSendArgumentsToList(node, inputs);
 
     pushInvokeDynamic(node, selector, inputs);
-    if (selector.isSetter() || selector.isIndexSet()) {
+    if (selector.isSetter || selector.isIndexSet) {
       pop();
       stack.add(inputs.last);
     }
@@ -3683,7 +3708,7 @@
   visitForeignGetter(ast.Send node) {
     Element element = elements[node];
     // Until now we only handle these as getters.
-    invariant(node, element.isDeferredLoaderGetter());
+    invariant(node, element.isDeferredLoaderGetter);
     FunctionElement deferredLoader = element;
     Element loadFunction = compiler.loadLibraryFunction;
     PrefixElement prefixElement = deferredLoader.enclosingElement;
@@ -3711,7 +3736,7 @@
       compiler.enqueuer.codegen.registerSelectorUse(selector.asUntyped);
     }
     String publicName = name;
-    if (selector.isSetter()) publicName += '=';
+    if (selector.isSetter) publicName += '=';
 
     Constant nameConstant = constantSystem.createString(
         new ast.DartString.literal(publicName));
@@ -3762,7 +3787,7 @@
     List<HInstruction> inputs = <HInstruction>[];
     if (node.isPropertyAccess) {
       push(buildInvokeSuper(selector, element, inputs));
-    } else if (element.isFunction() || element.isGenerativeConstructor()) {
+    } else if (element.isFunction || element.isGenerativeConstructor) {
       if (selector.applies(element, compiler)) {
         // TODO(5347): Try to avoid the need for calling [implementation] before
         // calling [addStaticSendArgumentsToList].
@@ -3771,7 +3796,7 @@
                                                       function, inputs);
         assert(succeeded);
         push(buildInvokeSuper(selector, element, inputs));
-      } else if (element.isGenerativeConstructor()) {
+      } else if (element.isGenerativeConstructor) {
         generateWrongArgumentCountError(node, element, node.arguments);
       } else {
         addGenericSendArgumentsToList(node.arguments, inputs);
@@ -3804,7 +3829,7 @@
    */
   HInstruction readTypeVariable(ClassElement cls,
                                 TypeVariableElement variable) {
-    assert(sourceElement.isInstanceMember());
+    assert(sourceElement.isInstanceMember);
 
     HInstruction target = localsHandler.readThis();
     HConstant index = graph.addConstantInt(
@@ -3842,31 +3867,32 @@
    * Helper to create an instruction that gets the value of a type variable.
    */
   HInstruction addTypeVariableReference(TypeVariableType type) {
+    assert(assertTypeInContext(type));
     Element member = sourceElement;
-    bool isClosure = member.enclosingElement.isClosure();
+    bool isClosure = member.enclosingElement.isClosure;
     if (isClosure) {
       ClosureClassElement closureClass = member.enclosingElement;
       member = closureClass.methodElement;
-      member = member.getOutermostEnclosingMemberOrTopLevel();
+      member = member.outermostEnclosingMemberOrTopLevel;
     }
-    bool isInConstructorContext = member.isConstructor() ||
-        member.isGenerativeConstructorBody();
+    bool isInConstructorContext = member.isConstructor ||
+        member.isGenerativeConstructorBody;
     if (isClosure) {
-      if (member.isFactoryConstructor() ||
+      if (member.isFactoryConstructor ||
           (isInConstructorContext && hasDirectLocal(type.element))) {
         // The type variable is used from a closure in a factory constructor.
         // The value of the type argument is stored as a local on the closure
         // itself.
         return localsHandler.readLocal(type.element);
-      } else if (member.isFunction() ||
-          member.isGetter() ||
-          member.isSetter() ||
+      } else if (member.isFunction ||
+          member.isGetter ||
+          member.isSetter ||
           isInConstructorContext) {
         // The type variable is stored on the "enclosing object" and needs to be
         // accessed using the this-reference in the closure.
-        return readTypeVariable(member.getEnclosingClass(), type.element);
+        return readTypeVariable(member.enclosingClass, type.element);
       } else {
-        assert(member.isField());
+        assert(member.isField);
         // The type variable is stored in a parameter of the method.
         return localsHandler.readLocal(type.element);
       }
@@ -3876,12 +3902,12 @@
                // initializer in a constructor. An initializer is
                // never built standalone, so [isBuildingFor] will
                // always return true when seeing one.
-               (member.isField() && !isBuildingFor(member))) {
+               (member.isField && !isBuildingFor(member))) {
       // The type variable is stored in a parameter of the method.
       return localsHandler.readLocal(type.element);
-    } else if (member.isInstanceMember()) {
+    } else if (member.isInstanceMember) {
       // The type variable is stored on the object.
-      return readTypeVariable(member.getEnclosingClass(),
+      return readTypeVariable(member.enclosingClass,
                               type.element);
     } else {
       // TODO(ngeoffray): Match the VM behavior and throw an
@@ -3893,6 +3919,7 @@
   }
 
   HInstruction analyzeTypeArgument(DartType argument) {
+    assert(assertTypeInContext(argument));
     if (argument.treatAsDynamic) {
       // Represent [dynamic] as [null].
       return graph.addConstantNull(compiler);
@@ -3921,6 +3948,7 @@
       return newObject;
     }
     List<HInstruction> inputs = <HInstruction>[];
+    type = localsHandler.substInContext(type);
     type.typeArguments.forEach((DartType argument) {
       inputs.add(analyzeTypeArgument(argument));
     });
@@ -3993,13 +4021,13 @@
         isFixedList = true;
         TypeMask inferred =
             TypeMaskFactory.inferredForNode(sourceElement, send, compiler);
-        ClassElement cls = element.getEnclosingClass();
-        assert(cls.thisType.element.isNative());
+        ClassElement cls = element.enclosingClass;
+        assert(cls.thisType.element.isNative);
         return inferred.containsAll(compiler)
             ? new TypeMask.nonNullExact(cls.thisType.element)
             : inferred;
-      } else if (element.isGenerativeConstructor()) {
-        ClassElement cls = element.getEnclosingClass();
+      } else if (element.isGenerativeConstructor) {
+        ClassElement cls = element.enclosingClass;
         return new TypeMask.nonNullExact(cls.thisType.element);
       } else {
         return TypeMaskFactory.inferredReturnTypeForElement(
@@ -4009,13 +4037,13 @@
 
     Element constructor = elements[send];
     Selector selector = elements.getSelector(send);
-    FunctionElement functionElement = constructor;
-    constructor = functionElement.redirectionTarget;
+    ConstructorElement constructorDeclaration = constructor;
+    constructor = constructorDeclaration.effectiveTarget;
 
     final bool isSymbolConstructor =
-        functionElement == compiler.symbolConstructor;
+        constructorDeclaration == compiler.symbolConstructor;
     final bool isJSArrayTypedConstructor =
-        functionElement == backend.jsArrayTypedConstructor;
+        constructorDeclaration == backend.jsArrayTypedConstructor;
 
     if (isSymbolConstructor) {
       constructor = compiler.symbolValidatedConstructor;
@@ -4026,15 +4054,17 @@
                        message: 'Constructor Symbol.validated is missing'));
     }
 
-    bool isRedirected = functionElement.isRedirectingFactory;
+    bool isRedirected = constructorDeclaration.isRedirectingFactory;
     InterfaceType type = elements.getType(node);
-    InterfaceType expectedType = functionElement.computeTargetType(type);
+    InterfaceType expectedType =
+        constructorDeclaration.computeEffectiveTargetType(type);
+    expectedType = localsHandler.substInContext(expectedType);
 
     if (checkTypeVariableBounds(node, type)) return;
 
     var inputs = <HInstruction>[];
-    if (constructor.isGenerativeConstructor() &&
-        Elements.isNativeOrExtendsNative(constructor.getEnclosingClass())) {
+    if (constructor.isGenerativeConstructor &&
+        Elements.isNativeOrExtendsNative(constructor.enclosingClass)) {
       // Native class generative constructors take a pre-constructed object.
       inputs.add(graph.addConstantNull(compiler));
     }
@@ -4048,7 +4078,7 @@
       return;
     }
 
-    if (constructor.isFactoryConstructor() &&
+    if (constructor.isFactoryConstructor &&
         !expectedType.typeArguments.isEmpty) {
       compiler.enqueuer.codegen.registerFactoryWithTypeArguments(elements);
     }
@@ -4088,8 +4118,8 @@
       push(buildLiteralList(<HInstruction>[]));
       stack.last.instructionType = elementType;
     } else {
-      ClassElement cls = constructor.getEnclosingClass();
-      if (cls.isAbstract && constructor.isGenerativeConstructor()) {
+      ClassElement cls = constructor.enclosingClass;
+      if (cls.isAbstract && constructor.isGenerativeConstructor) {
         generateAbstractClassInstantiationError(send, cls.name);
         return;
       }
@@ -4203,11 +4233,11 @@
   visitStaticSend(ast.Send node) {
     Selector selector = elements.getSelector(node);
     Element element = elements[node];
-    if (element.isForeign(compiler) && element.isFunction()) {
+    if (element.isForeign(compiler) && element.isFunction) {
       visitForeignSend(node);
       return;
     }
-    if (element.isErroneous()) {
+    if (element.isErroneous) {
       // An erroneous element indicates that the funciton could not be resolved
       // (a warning has been issued).
       generateThrowNoSuchMethod(node,
@@ -4215,9 +4245,9 @@
                                 argumentNodes: node.arguments);
       return;
     }
-    invariant(element, !element.isGenerativeConstructor());
+    invariant(element, !element.isGenerativeConstructor);
     generateIsDeferredLoadedCheckIfNeeded(node);
-    if (element.isFunction()) {
+    if (element.isFunction) {
       var inputs = <HInstruction>[];
       // TODO(5347): Try to avoid the need for calling [implementation] before
       // calling [addStaticSendArgumentsToList].
@@ -4255,7 +4285,7 @@
 
   visitTypeReferenceSend(ast.Send node) {
     Element element = elements[node];
-    if (element.isClass() || element.isTypedef()) {
+    if (element.isClass || element.isTypedef) {
       // TODO(karlklose): add type representation
       if (node.isCall) {
         // The node itself is not a constant but we register the selector (the
@@ -4264,9 +4294,10 @@
       } else {
         stack.add(addConstant(node));
       }
-    } else if (element.isTypeVariable()) {
+    } else if (element.isTypeVariable) {
       TypeVariableElement typeVariable = element;
-      HInstruction value = addTypeVariableReference(typeVariable.type);
+      DartType type = localsHandler.substInContext(typeVariable.type);
+      HInstruction value = analyzeTypeArgument(type);
       pushInvokeStatic(node,
                        backend.getRuntimeTypeToString(),
                        [value],
@@ -4383,8 +4414,8 @@
     Element element = elements[node.send];
     final bool isSymbolConstructor = element == compiler.symbolConstructor;
     if (!Elements.isErroneousElement(element)) {
-      FunctionElement function = element;
-      element = function.redirectionTarget;
+      ConstructorElement function = element;
+      element = function.effectiveTarget;
     }
     if (Elements.isErroneousElement(element)) {
       ErroneousElement error = element;
@@ -4396,7 +4427,7 @@
         Message message = error.messageKind.message(error.messageArguments);
         generateRuntimeError(node.send, message.toString());
       }
-    } else if (node.isConst()) {
+    } else if (node.isConst) {
       stack.add(addConstant(node));
       if (isSymbolConstructor) {
         ConstructedConstant symbol = getConstantForNode(node);
@@ -4420,15 +4451,15 @@
     // them into simpler instructions that allow further
     // optimizations.
     bool isOptimizableOperationOnIndexable(Selector selector, Element element) {
-      bool isLength = selector.isGetter()
+      bool isLength = selector.isGetter
           && selector.name == "length";
-      if (isLength || selector.isIndex()) {
+      if (isLength || selector.isIndex) {
         TypeMask type = new TypeMask.nonNullExact(
-            element.getEnclosingClass().declaration);
+            element.enclosingClass.declaration);
         return type.satisfies(backend.jsIndexableClass, compiler);
-      } else if (selector.isIndexSet()) {
+      } else if (selector.isIndexSet) {
         TypeMask type = new TypeMask.nonNullExact(
-            element.getEnclosingClass().declaration);
+            element.enclosingClass.declaration);
         return type.satisfies(backend.jsMutableIndexableClass, compiler);
       } else {
         return false;
@@ -4436,13 +4467,13 @@
     }
 
     bool isOptimizableOperation(Selector selector, Element element) {
-      ClassElement cls = element.getEnclosingClass();
+      ClassElement cls = element.enclosingClass;
       if (isOptimizableOperationOnIndexable(selector, element)) return true;
       if (!backend.interceptedClasses.contains(cls)) return false;
-      if (selector.isOperator()) return true;
-      if (selector.isSetter()) return true;
-      if (selector.isIndex()) return true;
-      if (selector.isIndexSet()) return true;
+      if (selector.isOperator) return true;
+      if (selector.isSetter) return true;
+      if (selector.isIndex) return true;
+      if (selector.isIndexSet) return true;
       if (element == backend.jsArrayAdd
           || element == backend.jsArrayRemoveLast
           || element == backend.jsStringSplit) {
@@ -4453,9 +4484,9 @@
 
     Element element = compiler.world.locateSingleElement(selector);
     if (element != null
-        && !element.isField()
-        && !(element.isGetter() && selector.isCall())
-        && !(element.isFunction() && selector.isGetter())
+        && !element.isField
+        && !(element.isGetter && selector.isCall)
+        && !(element.isFunction && selector.isGetter)
         && !isOptimizableOperation(selector, element)) {
       if (tryInlineMethod(element, selector, arguments, node)) {
         return;
@@ -4470,11 +4501,11 @@
     }
     inputs.addAll(arguments);
     TypeMask type = TypeMaskFactory.inferredTypeForSelector(selector, compiler);
-    if (selector.isGetter()) {
+    if (selector.isGetter) {
       pushWithPosition(
           new HInvokeDynamicGetter(selector, null, inputs, type),
           location);
-    } else if (selector.isSetter()) {
+    } else if (selector.isSetter) {
       pushWithPosition(
           new HInvokeDynamicSetter(selector, null, inputs, type),
           location);
@@ -4529,7 +4560,7 @@
     inputs.add(receiver);
     inputs.addAll(arguments);
     TypeMask type;
-    if (!element.isGetter() && selector.isGetter()) {
+    if (!element.isGetter && selector.isGetter) {
       type = TypeMaskFactory.inferredTypeForElement(element, compiler);
     } else {
       type = TypeMaskFactory.inferredReturnTypeForElement(element, compiler);
@@ -4540,7 +4571,7 @@
         selector,
         inputs,
         type,
-        isSetter: selector.isSetter() || selector.isIndexSet());
+        isSetter: selector.isSetter || selector.isIndexSet);
     instruction.sideEffects = compiler.world.getSideEffectsOfSelector(selector);
     return instruction;
   }
@@ -4563,7 +4594,7 @@
   visitSendSet(ast.SendSet node) {
     generateIsDeferredLoadedCheckIfNeeded(node);
     Element element = elements[node];
-    if (!Elements.isUnresolved(element) && element.impliesType()) {
+    if (!Elements.isUnresolved(element) && element.impliesType) {
       ast.Identifier selector = node.selector;
       generateThrowNoSuchMethod(node, selector.source,
                                 argumentNodes: node.arguments);
@@ -4678,7 +4709,7 @@
       HInstruction receiver = null;
       Element getter = elements[node.selector];
 
-      if (!Elements.isUnresolved(getter) && getter.impliesType()) {
+      if (!Elements.isUnresolved(getter) && getter.impliesType) {
         ast.Identifier selector = node.selector;
         generateThrowNoSuchMethod(node, selector.source,
                                   argumentNodes: node.arguments);
@@ -4797,7 +4828,7 @@
   }
 
   visitReturn(ast.Return node) {
-    if (identical(node.getBeginToken().stringValue, 'native')) {
+    if (identical(node.beginToken.stringValue, 'native')) {
       native.handleSsaNative(this, node.expression);
       return;
     }
@@ -4805,7 +4836,7 @@
     if (node.isRedirectingFactoryBody) {
       FunctionElement targetConstructor =
           elements[node.expression].implementation;
-      FunctionElement redirectingConstructor = sourceElement;
+      ConstructorElement redirectingConstructor = sourceElement;
       List<HInstruction> inputs = <HInstruction>[];
       FunctionSignature targetSignature = targetConstructor.functionSignature;
       FunctionSignature redirectingSignature =
@@ -4825,11 +4856,12 @@
         inputs.add(handleConstantForOptionalParameter(targetOptionals[i]));
       }
 
-      ClassElement targetClass = targetConstructor.getEnclosingClass();
+      ClassElement targetClass = targetConstructor.enclosingClass;
       if (backend.classNeedsRti(targetClass)) {
-        ClassElement cls = redirectingConstructor.getEnclosingClass();
+        ClassElement cls = redirectingConstructor.enclosingClass;
         InterfaceType targetType =
-            redirectingConstructor.computeTargetType(cls.thisType);
+            redirectingConstructor.computeEffectiveTargetType(cls.thisType);
+        targetType = localsHandler.substInContext(targetType);
         targetType.typeArguments.forEach((DartType argument) {
           inputs.add(analyzeTypeArgument(argument));
         });
@@ -4880,7 +4912,7 @@
   }
 
   HInstruction setRtiIfNeeded(HInstruction object, ast.Node node) {
-    InterfaceType type = elements.getType(node);
+    InterfaceType type = localsHandler.substInContext(elements.getType(node));
     if (!backend.classNeedsRti(type.element) || type.treatAsRaw) {
       return object;
     }
@@ -4896,7 +4928,7 @@
   visitLiteralList(ast.LiteralList node) {
     HInstruction instruction;
 
-    if (node.isConst()) {
+    if (node.isConst) {
       instruction = addConstant(node);
     } else {
       List<HInstruction> inputs = <HInstruction>[];
@@ -5095,7 +5127,7 @@
   }
 
   visitLiteralMap(ast.LiteralMap node) {
-    if (node.isConst()) {
+    if (node.isConst) {
       stack.add(addConstant(node));
       return;
     }
@@ -5108,7 +5140,7 @@
       listInputs.add(pop());
     }
 
-    Element constructor;
+    ConstructorElement constructor;
     List<HInstruction> inputs = <HInstruction>[];
 
     if (listInputs.isEmpty) {
@@ -5120,19 +5152,21 @@
       inputs.add(keyValuePairs);
     }
 
-    assert(constructor.isFactoryConstructor());
+    assert(constructor.isFactoryConstructor);
 
-    FunctionElement functionElement = constructor;
-    constructor = functionElement.redirectionTarget;
+    ConstructorElement functionElement = constructor;
+    constructor = functionElement.effectiveTarget;
 
     InterfaceType type = elements.getType(node);
-    InterfaceType expectedType = functionElement.computeTargetType(type);
+    InterfaceType expectedType =
+        functionElement.computeEffectiveTargetType(type);
+    expectedType = localsHandler.substInContext(expectedType);
 
-    if (constructor.isFactoryConstructor()) {
+    if (constructor.isFactoryConstructor) {
       compiler.enqueuer.codegen.registerFactoryWithTypeArguments(elements);
     }
 
-    ClassElement cls = constructor.getEnclosingClass();
+    ClassElement cls = constructor.enclosingClass;
 
     if (backend.classNeedsRti(cls)) {
       Link<DartType> typeVariable = cls.typeVariables;
@@ -5944,7 +5978,7 @@
   void visitReturn(ast.Return node) {
     if (!registerNode()) return;
     if (seenReturn
-        || identical(node.getBeginToken().stringValue, 'native')
+        || identical(node.beginToken.stringValue, 'native')
         || node.isRedirectingFactoryBody) {
       tooDifficult = true;
       return;
@@ -6247,8 +6281,8 @@
                              SsaBuilder builder) {
     ClassElement cls = builder.compiler.findHelper('RuntimeType');
     TypeMask instructionType = new TypeMask.subclass(cls);
-    if (!builder.sourceElement.enclosingElement.isClosure() &&
-        builder.sourceElement.isInstanceMember()) {
+    if (!builder.sourceElement.enclosingElement.isClosure &&
+        builder.sourceElement.isInstanceMember) {
       HInstruction receiver = builder.localsHandler.readThis();
       builder.push(new HReadTypeVariable(type, receiver, instructionType));
     } else {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index 48407f6..021b088 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -15,16 +15,17 @@
   NativeEmitter get nativeEmitter => backend.emitter.nativeEmitter;
 
 
-  js.Node attachPosition(js.Node node, Element element) {
+  js.Node attachPosition(js.Node node, AstElement element) {
     // TODO(sra): Attaching positions might be cleaner if the source position
     // was on a wrapping node.
     SourceFile sourceFile = sourceFileOfElement(element);
-    ast.Node expression = element.implementation.parseNode(backend.compiler);
+    AstElement implementation = element.implementation;
+    ast.Node expression = implementation.node;
     Token beginToken;
     Token endToken;
     if (expression == null) {
       // Synthesized node. Use the enclosing element for the location.
-      beginToken = endToken = element.position();
+      beginToken = endToken = element.position;
     } else {
       beginToken = expression.getBeginToken();
       endToken = expression.getEndToken();
@@ -47,7 +48,7 @@
     if (functionElement != null && functionElement.patch != null) {
       element = functionElement.patch;
     }
-    return element.getCompilationUnit().script.file;
+    return element.compilationUnit.script.file;
   }
 
   js.Fun buildJavaScriptFunction(FunctionElement element,
@@ -57,7 +58,7 @@
   }
 
   js.Expression generateCode(CodegenWorkItem work, HGraph graph) {
-    if (work.element.isField()) {
+    if (work.element.isField) {
       return generateLazyInitializer(work, graph);
     } else {
       return generateMethod(work, graph);
@@ -464,7 +465,11 @@
     } else if (sequenceElements.length == 1) {
       return sequenceElements[0];
     } else {
-      return new js.Sequence(sequenceElements);
+      js.Expression result = sequenceElements.removeLast();
+      while (sequenceElements.isNotEmpty) {
+        result = new js.Binary(',', sequenceElements.removeLast(), result);
+      }
+      return result;
     }
   }
 
@@ -474,10 +479,10 @@
   List<js.Expression> visitArguments(List<HInstruction> inputs,
                                      {int start: HInvoke.ARGUMENTS_OFFSET}) {
     assert(inputs.length >= start);
-    List<js.Expression> result = <js.Expression>[];
+    List<js.Expression> result = new List<js.Expression>(inputs.length - start);
     for (int i = start; i < inputs.length; i++) {
       use(inputs[i]);
-      result.add(pop());
+      result[i - start] = pop();
     }
     return result;
   }
@@ -779,35 +784,35 @@
             jsInitialization = generateExpression(initialization);
             if (!shouldGroupVarDeclarations &&
                 delayedVariablesCount < collectedVariableDeclarations.length) {
-              // We just added a new delayed variable-declaration. See if we
-              // can put in a 'var' in front of the initialization to make it
-              // go away.
-              List<js.Expression> expressions;
-              if (jsInitialization is js.Sequence) {
-                js.Sequence sequence = jsInitialization;
-                expressions = sequence.expressions;
-              } else {
-                expressions = <js.Expression>[jsInitialization];
-              }
-              bool canTransformToVariableDeclaration = true;
-              for (js.Expression expression in expressions) {
-                bool expressionIsVariableAssignment = false;
+              // We just added a new delayed variable-declaration. See if we can
+              // put in a 'var' in front of the initialization to make it go
+              // away. We walk the 'tree' of comma-operators to find the
+              // expressions and see if they are all assignments that can be
+              // converted into declarations.
+
+              List<js.Assignment> assignments;
+
+              bool allSimpleAssignments(js.Expression expression) {
                 if (expression is js.Assignment) {
                   js.Assignment assignment = expression;
                   if (assignment.leftHandSide is js.VariableUse &&
                       !assignment.isCompound) {
-                    expressionIsVariableAssignment = true;
+                    if (assignments == null) assignments = <js.Assignment>[];
+                    assignments.add(expression);
+                    return true;
                   }
+                } else if (expression.isCommaOperator) {
+                  js.Binary binary = expression;
+                  return allSimpleAssignments(binary.left)
+                      && allSimpleAssignments(binary.right);
                 }
-                if (!expressionIsVariableAssignment) {
-                  canTransformToVariableDeclaration = false;
-                  break;
-                }
+                return false;
               }
-              if (canTransformToVariableDeclaration) {
+
+              if (allSimpleAssignments(jsInitialization)) {
                 List<js.VariableInitialization> inits =
                     <js.VariableInitialization>[];
-                for (js.Assignment assignment in expressions) {
+                for (js.Assignment assignment in assignments) {
                   String id = (assignment.leftHandSide as js.VariableUse).name;
                   js.Node declaration = new js.VariableDeclaration(id);
                   inits.add(new js.VariableInitialization(declaration,
@@ -1490,12 +1495,12 @@
         // list class is instantiated.
         world.registerInstantiatedClass(
             compiler.listClass, work.resolutionTree);
-      } else if (target.isNative() && target.isFunction()
+      } else if (target.isNative && target.isFunction
                  && !node.isInterceptedCall) {
         // A direct (i.e. non-interceptor) native call is the result of
         // optimization.  The optimization ensures any type checks or
         // conversions have been satisified.
-        methodName = target.fixedBackendName();
+        methodName = target.fixedBackendName;
       }
     }
 
@@ -1522,9 +1527,9 @@
     Selector selector = getOptimizedSelectorFor(node, node.selector);
     String methodName = backend.registerOneShotInterceptor(selector);
     push(jsPropertyCall(isolate, methodName, arguments), node);
-    if (selector.isGetter()) {
+    if (selector.isGetter) {
       registerGetter(node);
-    } else if (selector.isSetter()) {
+    } else if (selector.isSetter) {
       registerSetter(node);
     } else {
       registerMethodInvoke(node);
@@ -1538,7 +1543,7 @@
       // [node.element] will be enqueued. We're not using the receiver
       // type because our optimizations might end up in a state where the
       // invoke dynamic knows more than the receiver.
-      ClassElement enclosing = node.element.getEnclosingClass();
+      ClassElement enclosing = node.element.enclosingClass;
       TypeMask receiverType = new TypeMask.nonNullExact(enclosing.declaration);
       return new TypedSelector(receiverType, selector);
     }
@@ -1554,7 +1559,7 @@
     // we need to register that fact that we may be calling a closure
     // with the same arguments.
     Element target = node.element;
-    if (target == null || target.isGetter()) {
+    if (target == null || target.isGetter) {
       // TODO(kasperl): If we have a typed selector for the call, we
       // may know something about the types of closures that need
       // the specific closure call method.
@@ -1600,7 +1605,7 @@
 
   visitInvokeStatic(HInvokeStatic node) {
     Element element = node.element;
-    ClassElement cls = element.getEnclosingClass();
+    ClassElement cls = element.enclosingClass;
     List<DartType> instantiatedTypes = node.instantiatedTypes;
 
     world.registerStaticUse(element);
@@ -1618,7 +1623,7 @@
   visitInvokeSuper(HInvokeSuper node) {
     Element superMethod = node.element;
     world.registerStaticUse(superMethod);
-    ClassElement superClass = superMethod.getEnclosingClass();
+    ClassElement superClass = superMethod.enclosingClass;
     if (superMethod.kind == ElementKind.FIELD) {
       String fieldName = backend.namer.instanceFieldPropertyName(superMethod);
       use(node.inputs[0]);
@@ -1633,7 +1638,7 @@
     } else {
       Selector selector = node.selector;
       String methodName;
-      if (selector.isGetter()) {
+      if (selector.isGetter) {
         // If the selector we need to register a typed getter to the
         // [world]. The emitter needs to know if it needs to emit a
         // bound closure for a method.
@@ -1647,9 +1652,10 @@
       } else {
         methodName = backend.namer.getNameOfInstanceMember(superMethod);
       }
-      push(js.js('#.prototype.#.call(#)', [
-          backend.namer.elementAccess(superClass),
-          methodName, visitArguments(node.inputs, start: 0)]),
+      push(
+          js.js('#.prototype.#.call(#)', [
+              backend.namer.elementAccess(superClass),
+              methodName, visitArguments(node.inputs, start: 0)]),
           node);
     }
   }
@@ -1774,7 +1780,7 @@
       // available to 'upgrade' the native object.
       TypeConstant type = constant;
       Element element = type.representedType.element;
-      if (element != null && element.isClass()) {
+      if (element != null && element.isClass) {
         backend.customElementsAnalysis.registerTypeConstant(element, world);
       }
     }
@@ -1995,7 +2001,7 @@
       use(argument);
       arguments.add(pop());
     }
-    js.Call value = new js.Call(jsHelper, arguments);
+    js.Call value = new js.Call(jsHelper, arguments.toList(growable: false));
     value = attachLocation(value, location);
     // BUG(4906): Using throw/return here adds to the size of the generated code
     // but it has the advantage of explicitly telling the JS engine that
@@ -2026,7 +2032,7 @@
 
   void visitStatic(HStatic node) {
     Element element = node.element;
-    if (element.isFunction()) {
+    if (element.isFunction) {
       push(backend.namer.isolateStaticClosureAccess(node.element));
     } else {
       push(backend.namer.elementAccess(node.element));
@@ -2629,7 +2635,7 @@
 
     use(node.inputs[0]);
     if (node.hasReceiver) {
-      if (backend.isInterceptorClass(element.getEnclosingClass())) {
+      if (backend.isInterceptorClass(element.enclosingClass)) {
         int index = RuntimeTypes.getTypeVariableIndex(element);
         js.Expression receiver = pop();
         js.Expression helper = backend.namer.elementAccess(helperElement);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
index 2caf641..c92fd60 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
@@ -116,14 +116,10 @@
         HInstruction interceptor = node.inputs[0];
         HInstruction receiverArgument = node.inputs[1];
 
-        // TODO(15720): The test here should be
-        //
-        //     interceptor.nonCheck() == receiverArgument.nonCheck()
-        //
-        if (interceptor == receiverArgument) {
+        if (interceptor.nonCheck() == receiverArgument.nonCheck()) {
           // TODO(15933): Make automatically generated property extraction
           // closures work with the dummy receiver optimization.
-          if (!selector.isGetter()) {
+          if (!selector.isGetter) {
             Constant constant = new DummyConstant(
                 receiverArgument.instructionType);
             HConstant dummy = graph.addConstant(constant, compiler);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
index f3c3098..7a1b241 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
@@ -130,7 +130,7 @@
       // code is completely insensitive to the specific instance subclasses, we
       // can use the non-leaf class directly.
       ClassElement element = input.instructionType.singleClass(compiler);
-      if (element != null && element.isNative()) {
+      if (element != null && element.isNative) {
         constantInterceptor = element;
       }
     }
@@ -139,7 +139,7 @@
 
     // If we just happen to be in an instance method of the constant
     // interceptor, `this` is a shorter alias.
-    if (constantInterceptor == work.element.getEnclosingClass() &&
+    if (constantInterceptor == work.element.enclosingClass &&
         graph.thisInstruction != null) {
       return graph.thisInstruction;
     }
@@ -251,7 +251,18 @@
   }
 
   bool rewriteToUseSelfAsInterceptor(HInterceptor node, HInstruction receiver) {
-    node.block.rewrite(node, receiver);
+    for (HInstruction user in node.usedBy.toList()) {
+      if (user is HIs) {
+        user.changeUse(node, receiver);
+      } else {
+        // Use the potentially self-argument as new receiver. Note that the
+        // self-argument could potentially have a tighter type than the
+        // receiver which was the input to the interceptor.
+        assert(user.inputs[0] == node);
+        assert(receiver.nonCheck() == user.inputs[1].nonCheck());
+        user.changeUse(node, user.inputs[1]);
+      }
+    }
     return false;
   }
 
@@ -263,13 +274,13 @@
 
     Selector selector = node.selector;
     HInstruction instruction;
-    if (selector.isGetter()) {
+    if (selector.isGetter) {
       instruction = new HInvokeDynamicGetter(
           selector,
           node.element,
           <HInstruction>[constant, node.inputs[1]],
           node.instructionType);
-    } else if (selector.isSetter()) {
+    } else if (selector.isSetter) {
       instruction = new HInvokeDynamicSetter(
           selector,
           node.element,
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index 0c9f354..a8107f4 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -184,6 +184,13 @@
     return result;
   }
 
+  HConstant addDeferredConstant(Constant constant, PrefixElement prefix,
+                                Compiler compiler) {
+    Constant wrapper = new DeferredConstant(constant, prefix);
+    compiler.deferredLoadTask.registerConstantDeferredUse(wrapper, prefix);
+    return addConstant(wrapper, compiler);
+  }
+
   HConstant addConstantInt(int i, Compiler compiler) {
     return addConstant(compiler.backend.constantSystem.createInt(i), compiler);
   }
@@ -830,14 +837,14 @@
         && !canThrow();
   }
 
-  // Overridden by [HCheck] to return the actual non-[HCheck]
-  // instruction it checks against.
+  /// Overridden by [HCheck] to return the actual non-[HCheck]
+  /// instruction it checks against.
   HInstruction nonCheck() => this;
 
-  // Can this node throw an exception?
+  /// Can this node throw an exception?
   bool canThrow() => false;
 
-  // Does this node potentially affect control flow.
+  /// Does this node potentially affect control flow.
   bool isControlFlow() => false;
 
   bool isExact() => instructionType.isExact || isNull();
@@ -1392,7 +1399,7 @@
 class HInvokeClosure extends HInvokeDynamic {
   HInvokeClosure(Selector selector, List<HInstruction> inputs, TypeMask type)
     : super(selector, null, inputs, type) {
-    assert(selector.isClosureCall());
+    assert(selector.isClosureCall);
   }
   accept(HVisitor visitor) => visitor.visitInvokeClosure(this);
 }
@@ -1505,7 +1512,7 @@
             {bool isAssignable})
       : this.isAssignable = (isAssignable != null)
             ? isAssignable
-            : element.isAssignable(),
+            : element.isAssignable,
         super(element, <HInstruction>[receiver], type) {
     sideEffects.clearAllSideEffects();
     sideEffects.clearAllDependencies();
@@ -1522,7 +1529,7 @@
     // [HFieldGet].
     JavaScriptBackend backend = compiler.backend;
     bool interceptor =
-        backend.isInterceptorClass(sourceElement.getEnclosingClass());
+        backend.isInterceptorClass(sourceElement.enclosingClass);
     return interceptor && sourceElement is ThisElement;
   }
 
@@ -2055,7 +2062,7 @@
   bool isCodeMotionInvariant() => true;
   bool isInterceptor(Compiler compiler) {
     JavaScriptBackend backend = compiler.backend;
-    return backend.isInterceptorClass(sourceElement.getEnclosingClass());
+    return backend.isInterceptorClass(sourceElement.enclosingClass);
   }
 }
 
@@ -2183,7 +2190,7 @@
     assert(invariant(this, element.isDeclaration));
     sideEffects.clearAllSideEffects();
     sideEffects.clearAllDependencies();
-    if (element.isAssignable()) {
+    if (element.isAssignable) {
       sideEffects.setDependsOnStaticPropertyStore();
     }
     setUseGvn();
@@ -2195,7 +2202,7 @@
   int typeCode() => HInstruction.STATIC_TYPECODE;
   bool typeEquals(other) => other is HStatic;
   bool dataEquals(HStatic other) => element == other.element;
-  bool isCodeMotionInvariant() => !element.isAssignable();
+  bool isCodeMotionInvariant() => !element.isAssignable;
 }
 
 class HInterceptor extends HInstruction {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index 633a2db..c006806 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -265,7 +265,7 @@
     Selector selector = node.selector;
     HInstruction input = node.inputs[1];
 
-    if (selector.isCall() || selector.isOperator()) {
+    if (selector.isCall || selector.isOperator) {
       Element target;
       if (input.isExtendableArray(compiler)) {
         if (selector.applies(backend.jsArrayRemoveLast, compiler)) {
@@ -312,7 +312,7 @@
         result.element = target;
         return result;
       }
-    } else if (selector.isGetter()) {
+    } else if (selector.isGetter) {
       if (selector.asUntyped.applies(backend.jsIndexableLength, compiler)) {
         HInstruction optimized = tryOptimizeLengthInterceptedGetter(node);
         if (optimized != null) return optimized;
@@ -333,13 +333,13 @@
     Element element = compiler.world.locateSingleElement(selector);
     // TODO(ngeoffray): Also fold if it's a getter or variable.
     if (element != null
-        && element.isFunction()
+        && element.isFunction
         // If we found out that the only target is a [:noSuchMethod:],
         // we just ignore it.
         && element.name == selector.name) {
       FunctionElement method = element;
 
-      if (method.isNative()) {
+      if (method.isNative) {
         HInstruction folded = tryInlineNativeMethod(node, method);
         if (folded != null) return folded;
       } else {
@@ -577,7 +577,7 @@
 
     if (!node.isRawCheck) {
       return node;
-    } else if (element.isTypedef()) {
+    } else if (element.isTypedef) {
       return node;
     } else if (element == compiler.functionClass) {
       return node;
@@ -739,11 +739,10 @@
   }
 
   HInstruction directFieldGet(HInstruction receiver, Element field) {
-    ast.Modifiers modifiers = field.modifiers;
     bool isAssignable = !compiler.world.fieldNeverChanges(field);
 
     TypeMask type;
-    if (field.getEnclosingClass().isNative()) {
+    if (field.enclosingClass.isNative) {
       type = TypeMaskFactory.fromNativeBehavior(
           native.NativeBehavior.ofFieldLoad(field, compiler),
           compiler);
@@ -764,7 +763,7 @@
     HInstruction receiver = node.getDartReceiver(compiler);
     VariableElement field =
         findConcreteFieldForDynamicAccess(receiver, node.selector);
-    if (field == null || !field.isAssignable()) return node;
+    if (field == null || !field.isAssignable) return node;
     // Use [:node.inputs.last:] in case the call follows the
     // interceptor calling convention, but is not a call on an
     // interceptor.
@@ -1604,7 +1603,7 @@
     Element element = type.element;
     if (!instruction.isRawCheck) {
       return;
-    } else if (element.isTypedef()) {
+    } else if (element.isTypedef) {
       return;
     }
 
@@ -1911,7 +1910,7 @@
   void registerFieldValueUpdate(Element element,
                                 HInstruction receiver,
                                 HInstruction value) {
-    if (element.isNative()) return; // TODO(14955): Remove this restriction?
+    if (element.isNative) return; // TODO(14955): Remove this restriction?
     // [value] is being set in some place in memory, we remove it from
     // the non-escaping set.
     nonEscapingReceivers.remove(value);
@@ -1929,7 +1928,7 @@
   void registerFieldValue(Element element,
                           HInstruction receiver,
                           HInstruction value) {
-    if (element.isNative()) return; // TODO(14955): Remove this restriction?
+    if (element.isNative) return; // TODO(14955): Remove this restriction?
     Map<HInstruction, HInstruction> map = fieldValues.putIfAbsent(
         element, () => <HInstruction, HInstruction> {});
     map[receiver] = value;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
index 75fe4b6..01a82b7 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
@@ -233,7 +233,7 @@
           compiler.world.allFunctions.filter(instruction.selector);
       if (targets.length == 1) {
         Element target = targets.first;
-        ClassElement cls = target.getEnclosingClass();
+        ClassElement cls = target.enclosingClass;
         TypeMask type = new TypeMask.nonNullSubclass(cls.declaration);
         // TODO(ngeoffray): We currently only optimize on primitive
         // types.
@@ -264,7 +264,7 @@
     HInstruction right = instruction.inputs[2];
 
     Selector selector = instruction.selector;
-    if (selector.isOperator() && left.isNumber(compiler)) {
+    if (selector.isOperator && left.isNumber(compiler)) {
       if (right.isNumber(compiler)) return false;
       TypeMask type = right.isIntegerOrNull(compiler)
           ? right.instructionType.nonNullable()
@@ -308,11 +308,11 @@
       // of [instruction] might move from number to dynamic.
       pendingOptimizations.putIfAbsent(instruction, () => () {
         Selector selector = instruction.selector;
-        if (selector.isOperator() && selector.name != '==') {
+        if (selector.isOperator && selector.name != '==') {
           if (checkReceiver(instruction)) {
             addAllUsersBut(instruction, instruction.inputs[1]);
           }
-          if (!selector.isUnaryOperator() && checkArgument(instruction)) {
+          if (!selector.isUnaryOperator && checkArgument(instruction)) {
             addAllUsersBut(instruction, instruction.inputs[2]);
           }
         }
@@ -326,7 +326,7 @@
 
     // Try to specialize the receiver after this call.
     if (receiver.dominatedUsers(instruction).length != 1
-        && !selector.isClosureCall()) {
+        && !selector.isClosureCall) {
       TypeMask newType = compiler.world.allFunctions.receiverType(selector);
       newType = newType.intersection(receiverType, compiler);
       var next = instruction.next;
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 f8dcf42..f580029 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
@@ -670,9 +670,15 @@
     return range;
   }
 
-  Range visitConstant(HConstant constant) {
-    if (!constant.isInteger(compiler)) return info.newUnboundRange();
-    NumConstant constantNum = constant.constant;
+  Range visitConstant(HConstant hConstant) {
+    if (!hConstant.isInteger(compiler)) return info.newUnboundRange();
+    Constant constant = hConstant.constant;
+    NumConstant constantNum;
+    if (constant is DeferredConstant) {
+      constantNum = constant.referenced;
+    } else {
+      constantNum = constant;
+    }
     if (constantNum.isMinusZero) constantNum = new IntConstant(0);
     Value value = info.newIntValue(constantNum.value);
     return info.newNormalizedRange(value, value);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart b/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
index dc1ac26..bd95f58 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
@@ -225,6 +225,20 @@
 
   // Returns the non-HCheck instruction, or the last [HCheck] in the
   // check chain that is not generate at use site.
+  //
+  // For example:
+  //
+  //     t1 = GeneratedAtUseSite instruction
+  //     t2 = check(t1)
+  //     t3 = check(t2)
+  //     t4 = use(t3)
+  //     t5 = use(t3)
+  //     t6 = use(t2)
+  //
+  // The t1 is generate-at-use site, and the live-range must thus be on t2 and
+  // not on the checked instruction t1.
+  // When looking for the checkedInstructionOrNonGenerateAtUseSite of t3 we must
+  // return t2.
   HInstruction checkedInstructionOrNonGenerateAtUseSite(HCheck check) {
     var checked = check.checkedInput;
     while (checked is HCheck) {
diff --git a/sdk/lib/_internal/compiler/implementation/tracer.dart b/sdk/lib/_internal/compiler/implementation/tracer.dart
index 65603c9..eef98f1 100644
--- a/sdk/lib/_internal/compiler/implementation/tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/tracer.dart
@@ -1,3 +1,7 @@
+// 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 tracer;
 
 import '../compiler.dart' as api;
diff --git a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
index c399cb0..845447f 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
@@ -495,7 +495,7 @@
     if (send != null) send.accept(visitor);
   }
 
-  bool isConst() {
+  bool get isConst {
     return newToken == null || identical(newToken.stringValue, 'const');
   }
 
@@ -941,7 +941,7 @@
 
   LiteralList(this.typeArguments, this.elements, this.constKeyword);
 
-  bool isConst() => constKeyword != null;
+  bool get isConst => constKeyword != null;
 
   LiteralList asLiteralList() => this;
   accept(Visitor visitor) => visitor.visitLiteralList(this);
@@ -1314,13 +1314,13 @@
   accept(Visitor visitor) => visitor.visitModifiers(this);
   visitChildren(Visitor visitor) => nodes.accept(visitor);
 
-  bool isStatic() => (flags & FLAG_STATIC) != 0;
-  bool isAbstract() => (flags & FLAG_ABSTRACT) != 0;
-  bool isFinal() => (flags & FLAG_FINAL) != 0;
-  bool isVar() => (flags & FLAG_VAR) != 0;
-  bool isConst() => (flags & FLAG_CONST) != 0;
-  bool isFactory() => (flags & FLAG_FACTORY) != 0;
-  bool isExternal() => (flags & FLAG_EXTERNAL) != 0;
+  bool get isStatic => (flags & FLAG_STATIC) != 0;
+  bool get isAbstract => (flags & FLAG_ABSTRACT) != 0;
+  bool get isFinal => (flags & FLAG_FINAL) != 0;
+  bool get isVar => (flags & FLAG_VAR) != 0;
+  bool get isConst => (flags & FLAG_CONST) != 0;
+  bool get isFactory => (flags & FLAG_FACTORY) != 0;
+  bool get isExternal => (flags & FLAG_EXTERNAL) != 0;
 
   Node getStatic() => findModifier('static');
 
@@ -1328,20 +1328,16 @@
    * Use this to check if the declaration is either explicitly or implicitly
    * final.
    */
-  bool isFinalOrConst() => isFinal() || isConst();
+  bool get isFinalOrConst => isFinal || isConst;
 
   String toString() {
-    LinkBuilder<String> builder = new LinkBuilder<String>();
-    if (isStatic()) builder.addLast('static');
-    if (isAbstract()) builder.addLast('abstract');
-    if (isFinal()) builder.addLast('final');
-    if (isVar()) builder.addLast('var');
-    if (isConst()) builder.addLast('const');
-    if (isFactory()) builder.addLast('factory');
-    if (isExternal()) builder.addLast('external');
-    StringBuffer buffer = new StringBuffer();
-    builder.toLink().printOn(buffer, ', ');
-    return buffer.toString();
+    return modifiersToString(isStatic: isStatic,
+                             isAbstract: isAbstract,
+                             isFinal: isFinal,
+                             isVar: isVar,
+                             isConst: isConst,
+                             isFactory: isFactory,
+                             isExternal: isExternal);
   }
 }
 
@@ -1477,7 +1473,7 @@
 
   LiteralMap(this.typeArguments, this.entries, this.constKeyword);
 
-  bool isConst() => constKeyword != null;
+  bool get isConst => constKeyword != null;
 
   LiteralMap asLiteralMap() => this;
 
diff --git a/sdk/lib/_internal/compiler/implementation/tree/unparser.dart b/sdk/lib/_internal/compiler/implementation/tree/unparser.dart
index 88fa1d7..632741c 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/unparser.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/unparser.dart
@@ -301,14 +301,21 @@
     String opString = op != null ? op.source : null;
     bool spacesNeeded = identical(opString, 'is') || identical(opString, 'as');
 
-    if (node.isPrefix) visit(node.selector);
+    if (node.isPrefix) {
+      visit(node.selector);
+      // Add a space for sequences like - -x (double unary minus).
+      if (identical(opString, '-')) {
+        Token beginToken = node.receiver.getBeginToken();
+        if (identical(beginToken.stringValue, opString)) {
+          sb.write(' ');
+        }
+      }
+    }
     unparseSendReceiver(node, spacesNeeded: spacesNeeded);
     if (!node.isPrefix && !node.isIndex) visit(node.selector);
     if (spacesNeeded) sb.write(' ');
-    // Also add a space for sequences like x + +1 and y - -y.
-    // TODO(ahe): remove case for '+' when we drop the support for it.
-    if (node.argumentsNode != null && (identical(opString, '-')
-        || identical(opString, '+'))) {
+    // Also add a space for sequences like y - -y.
+    if (node.argumentsNode != null && identical(opString, '-')) {
       Token beginToken = node.argumentsNode.getBeginToken();
       if (beginToken != null && identical(beginToken.stringValue, opString)) {
         sb.write(' ');
diff --git a/sdk/lib/_internal/compiler/implementation/typechecker.dart b/sdk/lib/_internal/compiler/implementation/typechecker.dart
index e373b54..22c0ad9 100644
--- a/sdk/lib/_internal/compiler/implementation/typechecker.dart
+++ b/sdk/lib/_internal/compiler/implementation/typechecker.dart
@@ -9,13 +9,13 @@
   String get name => "Type checker";
 
   void check(TreeElements elements) {
-    Element element = elements.currentElement;
+    AstElement element = elements.currentElement;
     compiler.withCurrentElement(element, () {
       measure(() {
-        Node tree = element.parseNode(compiler);
+        Node tree = element.node;
         TypeCheckerVisitor visitor =
             new TypeCheckerVisitor(compiler, elements, compiler.types);
-        if (element.isField()) {
+        if (element.isField) {
           visitor.analyzingInitializer = true;
         }
         tree.accept(visitor);
@@ -51,7 +51,7 @@
 
   /// Returns [: true :] if the element can be access as an invocation.
   bool isCallable(Compiler compiler) {
-    if (element.isAbstractField()) {
+    if (element.isAbstractField) {
       AbstractFieldElement abstractFieldElement = element;
       if (abstractFieldElement.getter == null) {
         // Setters cannot be invoked as function invocations.
@@ -101,10 +101,10 @@
   }
 
   DartType computeType(Compiler compiler) {
-    if (element.isGetter()) {
+    if (element.isGetter) {
       FunctionType functionType = element.computeType(compiler);
       return functionType.returnType;
-    } else if (element.isSetter()) {
+    } else if (element.isSetter) {
       FunctionType functionType = element.computeType(compiler);
       return functionType.parameterTypes.head;
     } else {
@@ -302,7 +302,7 @@
   TypeCheckerVisitor(this.compiler, TreeElements elements, this.types)
       : this.elements = elements,
         currentClass = elements.currentElement != null
-            ? elements.currentElement.getEnclosingClass() : null {
+            ? elements.currentElement.enclosingClass : null {
     intType = compiler.intClass.computeType(compiler);
     doubleType = compiler.doubleClass.computeType(compiler);
     boolType = compiler.boolClass.computeType(compiler);
@@ -316,7 +316,7 @@
     }
   }
 
-  LibraryElement get currentLibrary => elements.currentElement.getLibrary();
+  LibraryElement get currentLibrary => elements.currentElement.library;
 
   reportTypeWarning(Spannable spannable, MessageKind kind,
                     [Map arguments = const {}]) {
@@ -353,7 +353,7 @@
 
   DartType analyzeNonVoid(Node node) {
     DartType type = analyze(node);
-    if (type == types.voidType) {
+    if (type.isVoid) {
       reportTypeWarning(node, MessageKind.VOID_EXPRESSION);
     }
     return type;
@@ -561,10 +561,10 @@
     if (identical(element.kind, ElementKind.GENERATIVE_CONSTRUCTOR) ||
         identical(element.kind, ElementKind.GENERATIVE_CONSTRUCTOR_BODY)) {
       type = types.dynamicType;
-      returnType = types.voidType;
+      returnType = const VoidType();
 
       element.functionSignature.forEachParameter((ParameterElement parameter) {
-        if (parameter.isFieldParameter()) {
+        if (parameter.isFieldParameter) {
           FieldParameterElement fieldParameter = parameter;
           checkAssignable(parameter, parameter.type,
               fieldParameter.fieldElement.computeType(compiler));
@@ -581,7 +581,7 @@
     DartType previous = expectedReturnType;
     expectedReturnType = returnType;
     StatementType bodyType = analyze(node.body);
-    if (returnType != types.voidType && !returnType.treatAsDynamic
+    if (!returnType.isVoid && !returnType.treatAsDynamic
         && bodyType != StatementType.RETURNING) {
       MessageKind kind;
       if (bodyType == StatementType.MAYBE_RETURNING) {
@@ -604,9 +604,9 @@
       Element element = elements[node];
       assert(invariant(node, element != null,
           message: 'Missing element for identifier'));
-      assert(invariant(node, element.isVariable() ||
-                             element.isParameter() ||
-                             element.isField(),
+      assert(invariant(node, element.isVariable ||
+                             element.isParameter ||
+                             element.isField,
           message: 'Unexpected context element ${element}'));
       return element.computeType(compiler);
     }
@@ -628,12 +628,12 @@
   void checkPrivateAccess(Node node, Element element, String name) {
     if (name != null &&
         isPrivateName(name) &&
-        element.getLibrary() != currentLibrary) {
+        element.library != currentLibrary) {
       reportTypeWarning(
           node,
           MessageKind.PRIVATE_ACCESS,
           {'name': name,
-           'libraryName': element.getLibrary().getLibraryOrScriptName()});
+           'libraryName': element.library.getLibraryOrScriptName()});
     }
 
   }
@@ -659,6 +659,9 @@
           type = compiler.objectClass.rawType;
         }
       }
+      if (type.kind == TypeKind.MALFORMED_TYPE) {
+        return types.dynamicType;
+      }
       return type.unalias(compiler);
     }
 
@@ -687,6 +690,9 @@
     // 'call' method into account.
     ElementAccess getAccess(Name name,
                             DartType unaliasedBound, InterfaceType interface) {
+      if (interface.treatAsDynamic) {
+        return new DynamicAccess();
+      }
       MemberSignature member = lookupMemberSignature(memberName, interface);
       if (member != null) {
         return new MemberAccess(member);
@@ -713,7 +719,7 @@
       return access;
     }
     if (receiverElement != null &&
-        (receiverElement.isVariable() || receiverElement.isParameter())) {
+        (receiverElement.isVariable || receiverElement.isParameter)) {
       Link<TypePromotion> typePromotions = typePromotionsMap[receiverElement];
       if (typePromotions != null) {
         while (!typePromotions.isEmpty) {
@@ -865,7 +871,7 @@
         // members provide no access to there own name.
         if (element == null) {
           element = type.element;
-        } else if (type.element.isTypedef()) {
+        } else if (type.element.isTypedef) {
           if (element != null) {
             reportTypeInfo(element,
                            MessageKind.THIS_IS_THE_DECLARATION,
@@ -915,14 +921,14 @@
   ElementAccess computeAccess(Send node, String name, Element element,
                               MemberKind memberKind,
                               {bool lookupClassMember: false}) {
-    if (element != null && element.isErroneous()) {
+    if (element != null && element.isErroneous) {
       // An error has already been reported for this node.
       return const DynamicAccess();
     }
     if (node.receiver != null) {
       Element receiverElement = elements[node.receiver];
       if (receiverElement != null) {
-        if (receiverElement.isPrefix()) {
+        if (receiverElement.isPrefix) {
           assert(invariant(node, element != null,
               message: 'Prefixed node has no element.'));
           return computeResolvedAccess(node, name, element, memberKind);
@@ -937,7 +943,7 @@
       return lookupMember(node, receiverType, name, memberKind,
           elements[node.receiver],
           lookupClassMember: lookupClassMember ||
-              element != null && element.modifiers.isStatic());
+              element != null && element.isStatic);
     } else {
       return computeResolvedAccess(node, name, element, memberKind);
     }
@@ -952,10 +958,10 @@
     if (element == null) {
       // foo() where foo is unresolved.
       return lookupMember(node, thisType, name, memberKind, null);
-    } else if (element.isErroneous()) {
+    } else if (element.isErroneous) {
       // foo() where foo is erroneous.
       return const DynamicAccess();
-    } else if (element.impliesType()) {
+    } else if (element.impliesType) {
       // The literal `Foo` where Foo is a class, a typedef, or a type variable.
       if (elements.isTypeLiteral(node)) {
         assert(invariant(node, identical(compiler.typeClass,
@@ -965,19 +971,19 @@
         return new TypeLiteralAccess(element);
       }
       return createResolvedAccess(node, name, element);
-    } else if (element.isMember()) {
+    } else if (element.isMember) {
       // foo() where foo is a member.
       return lookupMember(node, thisType, name, memberKind, null,
-          lookupClassMember: element.modifiers.isStatic());
-    } else if (element.isFunction()) {
+          lookupClassMember: element.isStatic);
+    } else if (element.isFunction) {
       // foo() where foo is a method in the same class.
       return createResolvedAccess(node, name, element);
-    } else if (element.isVariable() ||
-        element.isParameter() ||
-        element.isField()) {
+    } else if (element.isVariable ||
+        element.isParameter ||
+        element.isField) {
       // foo() where foo is a field in the same class.
       return createResolvedAccess(node, name, element);
-    } else if (element.isGetter() || element.isSetter()) {
+    } else if (element.isGetter || element.isSetter) {
       return createResolvedAccess(node, name, element);
     } else {
       compiler.internalError(element,
@@ -993,7 +999,7 @@
   }
 
   ElementAccess createPromotedAccess(Element element) {
-    if (element.isVariable() || element.isParameter()) {
+    if (element.isVariable || element.isParameter) {
       TypePromotion typePromotion = getKnownTypePromotion(element);
       if (typePromotion != null) {
         return new PromotedAccess(element, typePromotion.type);
@@ -1056,7 +1062,7 @@
   DartType visitSend(Send node) {
     Element element = elements[node];
 
-    if (element != null && element.isConstructor()) {
+    if (element != null && element.isConstructor) {
       DartType receiverType;
       if (node.receiver != null) {
         receiverType = analyze(node.receiver);
@@ -1102,7 +1108,7 @@
         }
 
         if (variable != null &&
-            (variable.isVariable() || variable.isParameter())) {
+            (variable.isVariable || variable.isParameter)) {
           DartType knownType = getKnownType(variable);
           if (!knownType.isDynamic) {
             DartType shownType = elements.getType(node.arguments.head);
@@ -1498,7 +1504,7 @@
       Node element = link.head;
       DartType elementType = analyze(element);
       checkAssignable(element, elementType, listElementType,
-          isConst: node.isConst());
+          isConst: node.isConst);
     }
     return listType;
   }
@@ -1531,7 +1537,7 @@
 
   /** Dart Programming Language Specification: 11.10 Return */
   DartType visitReturn(Return node) {
-    if (identical(node.getBeginToken().stringValue, 'native')) {
+    if (identical(node.beginToken.stringValue, 'native')) {
       return StatementType.RETURNING;
     }
     if (node.isRedirectingFactoryBody) {
@@ -1541,7 +1547,7 @@
     }
 
     final expression = node.expression;
-    final isVoidFunction = (identical(expectedReturnType, types.voidType));
+    final isVoidFunction = expectedReturnType.isVoid;
 
     // Executing a return statement return e; [...] It is a static type warning
     // if the type of e may not be assigned to the declared return type of the
@@ -1549,10 +1555,10 @@
     if (expression != null) {
       final expressionType = analyze(expression);
       Element element = elements.currentElement;
-      if (element != null && element.isGenerativeConstructor()) {
+      if (element != null && element.isGenerativeConstructor) {
         // The resolver already emitted an error for this expression.
       } else if (isVoidFunction
-          && !types.isAssignable(expressionType, types.voidType)) {
+          && !types.isAssignable(expressionType, const VoidType())) {
         reportTypeWarning(expression, MessageKind.RETURN_VALUE_IN_VOID);
       } else {
         checkAssignable(expression, expressionType, expectedReturnType);
@@ -1563,7 +1569,7 @@
     // hold:
     // - f is not a generative constructor.
     // - The return type of f may not be assigned to void.
-    } else if (!types.isAssignable(expectedReturnType, types.voidType)) {
+    } else if (!types.isAssignable(expectedReturnType, const VoidType())) {
       reportTypeWarning(node, MessageKind.RETURN_NOTHING,
                         {'returnType': expectedReturnType});
     }
@@ -1582,7 +1588,7 @@
 
   DartType visitVariableDefinitions(VariableDefinitions node) {
     DartType type = analyzeWithDefault(node.type, types.dynamicType);
-    if (type == types.voidType) {
+    if (type.isVoid) {
       reportTypeWarning(node.type, MessageKind.VOID_VARIABLE);
       type = types.dynamicType;
     }
@@ -1673,7 +1679,7 @@
     InterfaceType mapType = elements.getType(node);
     DartType mapKeyType = firstType(mapType.typeArguments);
     DartType mapValueType = secondType(mapType.typeArguments);
-    bool isConst = node.isConst();
+    bool isConst = node.isConst;
     for (Link<Node> link = node.entries.nodes;
          !link.isEmpty;
          link = link.tail) {
diff --git a/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart b/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
index 4a7a509..2bd0952 100644
--- a/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
@@ -440,13 +440,13 @@
     // TODO(kasperl): Can't we just avoid creating typed selectors
     // based of function types?
     Element self = base;
-    if (self.isTypedef()) {
+    if (self.isTypedef) {
       // A typedef is a function type that doesn't have any
       // user-defined members.
       return false;
     }
 
-    ClassElement other = element.getEnclosingClass();
+    ClassElement other = element.enclosingClass;
     if (compiler.backend.isNullImplementation(other)) {
       return isNullable;
     } else if (isExact) {
@@ -484,7 +484,7 @@
     if (element == null) return false;
 
     if (element.isAbstract) {
-      ClassElement enclosingClass = element.getEnclosingClass();
+      ClassElement enclosingClass = element.enclosingClass;
       return hasConcreteMatch(enclosingClass.superclass, selector, compiler);
     }
     return selector.appliesUntyped(element, compiler);
@@ -566,7 +566,7 @@
     Iterable<Element> targets = compiler.world.allFunctions.filter(selector);
     if (targets.length != 1) return null;
     Element result = targets.first;
-    ClassElement enclosing = result.getEnclosingClass();
+    ClassElement enclosing = result.enclosingClass;
     // We only return the found element if it is guaranteed to be
     // implemented on the exact receiver type. It could be found in a
     // subclass or in an inheritance-wise unrelated class in case of
diff --git a/sdk/lib/_internal/compiler/implementation/universe/function_set.dart b/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
index 793362b..2b0c89c 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
@@ -17,7 +17,7 @@
       => new FunctionSetNode(name);
 
   void add(Element element) {
-    assert(element.isInstanceMember());
+    assert(element.isInstanceMember);
     assert(!element.isAbstract);
     String name = element.name;
     FunctionSetNode node = nodes.putIfAbsent(name, () => newNode(name));
@@ -25,7 +25,7 @@
   }
 
   void remove(Element element) {
-    assert(element.isInstanceMember());
+    assert(element.isInstanceMember);
     assert(!element.isAbstract);
     String name = element.name;
     FunctionSetNode node = nodes[name];
@@ -35,7 +35,7 @@
   }
 
   bool contains(Element element) {
-    assert(element.isInstanceMember());
+    assert(element.isInstanceMember);
     assert(!element.isAbstract);
     String name = element.name;
     FunctionSetNode node = nodes[name];
@@ -215,7 +215,7 @@
     if (_mask != null) return _mask;
     return _mask = new TypeMask.unionOf(functions
         .expand((element) {
-          ClassElement cls = element.getEnclosingClass();
+          ClassElement cls = element.enclosingClass;
           return compiler.world.isUsedAsMixin(cls)
               ? ([cls]..addAll(compiler.world.mixinUses[cls]))
               : [cls];
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index 05a45eee..89e6d09 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -144,11 +144,11 @@
            || (name != INDEX_NAME && name != INDEX_SET_NAME));
     assert(kind == SelectorKind.OPERATOR
            || kind == SelectorKind.INDEX
-           || Elements.operatorNameToIdentifier(name) == name);
+           || !Elements.isOperatorName(name));
     assert(kind == SelectorKind.CALL
            || kind == SelectorKind.GETTER
            || kind == SelectorKind.SETTER
-           || Elements.operatorNameToIdentifier(name) != name);
+           || Elements.isOperatorName(name));
     assert(!isPrivateName(name) || library != null);
   }
 
@@ -187,7 +187,7 @@
 
   factory Selector.fromElement(Element element, Compiler compiler) {
     String name = element.name;
-    if (element.isFunction()) {
+    if (element.isFunction) {
       if (name == '[]') {
         return new Selector.index();
       } else if (name == '[]=') {
@@ -201,21 +201,21 @@
         namedArguments =
             signature.orderedOptionalParameters.map((e) => e.name).toList();
       }
-      if (Elements.operatorNameToIdentifier(name) != name) {
+      if (element.isOperator) {
         // Operators cannot have named arguments, however, that doesn't prevent
         // a user from declaring such an operator.
         return new Selector(
             SelectorKind.OPERATOR, name, null, arity, namedArguments);
       } else {
         return new Selector.call(
-            name, element.getLibrary(), arity, namedArguments);
+            name, element.library, arity, namedArguments);
       }
-    } else if (element.isSetter()) {
-      return new Selector.setter(name, element.getLibrary());
-    } else if (element.isGetter()) {
-      return new Selector.getter(name, element.getLibrary());
-    } else if (element.isField()) {
-      return new Selector.getter(name, element.getLibrary());
+    } else if (element.isSetter) {
+      return new Selector.setter(name, element.library);
+    } else if (element.isGetter) {
+      return new Selector.getter(name, element.library);
+    } else if (element.isField) {
+      return new Selector.getter(name, element.library);
     } else {
       throw new SpannableAssertionFailure(
           element, "Can't get selector from $element");
@@ -274,22 +274,22 @@
   factory Selector.callDefaultConstructor(LibraryElement library)
       => new Selector(SelectorKind.CALL, "", library, 0);
 
-  bool isGetter() => identical(kind, SelectorKind.GETTER);
-  bool isSetter() => identical(kind, SelectorKind.SETTER);
-  bool isCall() => identical(kind, SelectorKind.CALL);
-  bool isClosureCall() {
+  bool get isGetter => identical(kind, SelectorKind.GETTER);
+  bool get isSetter => identical(kind, SelectorKind.SETTER);
+  bool get isCall => identical(kind, SelectorKind.CALL);
+  bool get isClosureCall {
     String callName = Compiler.CALL_OPERATOR_NAME;
-    return isCall() && name == callName;
+    return isCall && name == callName;
   }
 
-  bool isIndex() => identical(kind, SelectorKind.INDEX) && argumentCount == 1;
-  bool isIndexSet() => identical(kind, SelectorKind.INDEX) && argumentCount == 2;
+  bool get isIndex => identical(kind, SelectorKind.INDEX) && argumentCount == 1;
+  bool get isIndexSet => identical(kind, SelectorKind.INDEX) && argumentCount == 2;
 
-  bool isOperator() => identical(kind, SelectorKind.OPERATOR);
-  bool isUnaryOperator() => isOperator() && argumentCount == 0;
+  bool get isOperator => identical(kind, SelectorKind.OPERATOR);
+  bool get isUnaryOperator => isOperator && argumentCount == 0;
 
   /** Check whether this is a call to 'assert'. */
-  bool isAssert() => isCall() && identical(name, "assert");
+  bool get isAssert => isCall && identical(name, "assert");
 
   int get namedArgumentCount => namedArguments.length;
   int get positionalArgumentCount => argumentCount - namedArgumentCount;
@@ -302,16 +302,16 @@
    * The member name for invocation mirrors created from this selector.
    */
   String get invocationMirrorMemberName =>
-      isSetter() ? '$name=' : name;
+      isSetter ? '$name=' : name;
 
   int get invocationMirrorKind {
     const int METHOD = 0;
     const int GETTER = 1;
     const int SETTER = 2;
     int kind = METHOD;
-    if (isGetter()) {
+    if (isGetter) {
       kind = GETTER;
-    } else if (isSetter()) {
+    } else if (isSetter) {
       kind = SETTER;
     }
     return kind;
@@ -325,17 +325,17 @@
   bool appliesUntyped(Element element, Compiler compiler) {
     assert(sameNameHack(element, compiler));
     if (Elements.isUnresolved(element)) return false;
-    if (isPrivateName(name) && library != element.getLibrary()) return false;
+    if (isPrivateName(name) && library != element.library) return false;
     if (element.isForeign(compiler)) return true;
-    if (element.isSetter()) return isSetter();
-    if (element.isGetter()) return isGetter() || isCall();
-    if (element.isField()) {
-      return isSetter()
-          ? !element.modifiers.isFinalOrConst()
-          : isGetter() || isCall();
+    if (element.isSetter) return isSetter;
+    if (element.isGetter) return isGetter || isCall;
+    if (element.isField) {
+      return isSetter
+          ? !element.isFinal && !element.isConst
+          : isGetter || isCall;
     }
-    if (isGetter()) return true;
-    if (isSetter()) return false;
+    if (isGetter) return true;
+    if (isSetter) return false;
     return signatureApplies(element, compiler);
   }
 
@@ -375,7 +375,7 @@
   bool sameNameHack(Element element, Compiler compiler) {
     // TODO(ngeoffray): Remove workaround checks.
     return element == compiler.assertMethod
-        || element.isConstructor()
+        || element.isConstructor
         || name == element.name;
   }
 
@@ -472,8 +472,8 @@
     // that we can call [addArgumentsToList].
     Link computeCallNodesFromParameters() {
       LinkBuilder builder = new LinkBuilder();
-      signature.forEachRequiredParameter((Element element) {
-        Node node = element.parseNode(compiler);
+      signature.forEachRequiredParameter((ParameterElement element) {
+        Node node = element.node;
         mapping[node] = element;
         builder.addLast(node);
       });
@@ -483,8 +483,8 @@
           builder.addLast(new NamedArgument(null, null, element.initializer));
         });
       } else {
-        signature.forEachOptionalParameter((Element element) {
-          Node node = element.parseNode(compiler);
+        signature.forEachOptionalParameter((ParameterElement element) {
+          Node node = element.node;
           mapping[node] = element;
           builder.addLast(node);
         });
@@ -506,7 +506,7 @@
           signature.optionalParameters.toList().map((e) => e.name).toList();
     }
     Selector selector = new Selector.call(callee.name,
-                                          caller.getLibrary(),
+                                          caller.library,
                                           signature.parameterCount,
                                           namedParameters);
 
@@ -660,14 +660,14 @@
     assert(sameNameHack(element, compiler));
     // [TypedSelector] are only used after resolution.
     assert(compiler.phase > Compiler.PHASE_RESOLVING);
-    if (!element.isMember()) return false;
+    if (!element.isMember) return false;
 
     // A closure can be called through any typed selector:
     // class A {
     //   get foo => () => 42;
     //   bar() => foo(); // The call to 'foo' is a typed selector.
     // }
-    if (element.getEnclosingClass().isClosure()) {
+    if (element.enclosingClass.isClosure) {
       return appliesUntyped(element, compiler);
     }
 
diff --git a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
index ea458d7..259f93d 100644
--- a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
+++ b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
@@ -54,6 +54,7 @@
   useConstant(null, null);
   useNode(null);
   useUtil(null);
+  useSetlet(null);
   useElementVisitor(new ElementVisitor());
   useJs(new js.Program(null));
   useJs(new js.Blob(null));
@@ -123,6 +124,10 @@
   link.reversePrependAll(link);
 }
 
+void useSetlet(util.Setlet setlet) {
+  setlet.difference(setlet);
+}
+
 void useElementVisitor(ElementVisitor visitor) {
   visitor
     ..visit(null)
@@ -151,7 +156,6 @@
     ..visitTypeVariableElement(null)
     ..visitTypedefElement(null)
     ..visitVariableElement(null)
-    ..visitVoidElement(null)
     ..visitWarnOnUseElement(null);
 }
 
@@ -227,4 +231,4 @@
   task
     ..hasIr(null)
     ..getIr(null);
-}
\ No newline at end of file
+}
diff --git a/sdk/lib/_internal/compiler/implementation/util/util.dart b/sdk/lib/_internal/compiler/implementation/util/util.dart
index 95098d5..8b195d6 100644
--- a/sdk/lib/_internal/compiler/implementation/util/util.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/util.dart
@@ -133,3 +133,23 @@
           ^ part4.hashCode
           ^ part5.hashCode) & 0x3fffffff;
 }
+
+String modifiersToString({bool isStatic: false,
+                          bool isAbstract: false,
+                          bool isFinal: false,
+                          bool isVar: false,
+                          bool isConst: false,
+                          bool isFactory: false,
+                          bool isExternal: false}) {
+  LinkBuilder<String> builder = new LinkBuilder<String>();
+  if (isStatic) builder.addLast('static');
+  if (isAbstract) builder.addLast('abstract');
+  if (isFinal) builder.addLast('final');
+  if (isVar) builder.addLast('var');
+  if (isConst) builder.addLast('const');
+  if (isFactory) builder.addLast('factory');
+  if (isExternal) builder.addLast('external');
+  StringBuffer buffer = new StringBuffer();
+  builder.toLink().printOn(buffer, ', ');
+  return buffer.toString();
+}
diff --git a/sdk/lib/_internal/compiler/implementation/world.dart b/sdk/lib/_internal/compiler/implementation/world.dart
index 2d5accd..30f05a5 100644
--- a/sdk/lib/_internal/compiler/implementation/world.dart
+++ b/sdk/lib/_internal/compiler/implementation/world.dart
@@ -141,7 +141,7 @@
   }
 
   bool hasAnyUserDefinedGetter(Selector selector) {
-    return allFunctions.filter(selector).any((each) => each.isGetter());
+    return allFunctions.filter(selector).any((each) => each.isGetter);
   }
 
   // Returns whether a subclass of [superclass] implements [type].
@@ -180,14 +180,14 @@
   }
 
   void registerUsedElement(Element element) {
-    if (element.isInstanceMember() && !element.isAbstract) {
+    if (element.isInstanceMember && !element.isAbstract) {
       allFunctions.add(element);
     }
   }
 
   VariableElement locateSingleField(Selector selector) {
     Element result = locateSingleElement(selector);
-    return (result != null && result.isField()) ? result : null;
+    return (result != null && result.isField) ? result : null;
   }
 
   Element locateSingleElement(Selector selector) {
@@ -206,8 +206,8 @@
   }
 
   bool fieldNeverChanges(Element element) {
-    if (!element.isField()) return false;
-    if (element.isNative()) {
+    if (!element.isField) return false;
+    if (element.isNative) {
       // Some native fields are views of data that may be changed by operations.
       // E.g. node.firstChild depends on parentNode.removeBefore(n1, n2).
       // TODO(sra): Refine the effect classification so that native effects are
@@ -215,9 +215,9 @@
       return false;
     }
 
-    return element.modifiers.isFinal()
-        || element.modifiers.isConst()
-        || (element.isInstanceMember()
+    return element.isFinal
+        || element.isConst
+        || (element.isInstanceMember
             && !compiler.resolverWorld.hasInvokedSetter(element, compiler));
   }
 
@@ -228,8 +228,8 @@
     // between a constructor and its body for side effects. This
     // implies that currently, the side effects of a constructor body
     // contain the side effects of the initializers.
-    assert(!element.isGenerativeConstructorBody());
-    assert(!element.isField());
+    assert(!element.isGenerativeConstructorBody);
+    assert(!element.isField);
     return sideEffects.putIfAbsent(element.declaration, () {
       return new SideEffects();
     });
@@ -247,18 +247,18 @@
 
   SideEffects getSideEffectsOfSelector(Selector selector) {
     // We're not tracking side effects of closures.
-    if (selector.isClosureCall()) return new SideEffects();
+    if (selector.isClosureCall) return new SideEffects();
     SideEffects sideEffects = new SideEffects.empty();
     for (Element e in allFunctions.filter(selector)) {
-      if (e.isField()) {
-        if (selector.isGetter()) {
+      if (e.isField) {
+        if (selector.isGetter) {
           if (!fieldNeverChanges(e)) {
             sideEffects.setDependsOnInstancePropertyStore();
           }
-        } else if (selector.isSetter()) {
+        } else if (selector.isSetter) {
           sideEffects.setChangesInstanceProperty();
         } else {
-          assert(selector.isCall());
+          assert(selector.isCall);
           sideEffects.setAllSideEffects();
           sideEffects.setDependsOnSomething();
         }
diff --git a/sdk/lib/_internal/compiler/samples/darttags/darttags.dart b/sdk/lib/_internal/compiler/samples/darttags/darttags.dart
index 3a00fc6..690e943 100644
--- a/sdk/lib/_internal/compiler/samples/darttags/darttags.dart
+++ b/sdk/lib/_internal/compiler/samples/darttags/darttags.dart
@@ -110,7 +110,8 @@
 
   compilationUnit.declarations.forEach((_, DeclarationMirror mirror) {
     var tagname = nameOf(mirror);
-    var byte_offset = mirror.location.offset;
+    var location = mirror.location;
+    var byte_offset = location.offset;
     var line_number = file.getLine(byte_offset) + 1;
 
     var lineStart = file.lineStarts[line_number - 1];
diff --git a/sdk/lib/_internal/lib/isolate_helper.dart b/sdk/lib/_internal/lib/isolate_helper.dart
index 85d9f2b..0a6bcb7 100644
--- a/sdk/lib/_internal/lib/isolate_helper.dart
+++ b/sdk/lib/_internal/lib/isolate_helper.dart
@@ -89,7 +89,6 @@
   // isolate automatically we try to give them a reasonable context to live in
   // by having a "default" isolate (the first one created).
   _globalState.currentContext = rootContext;
-
   if (entry is _MainFunctionArgs) {
     rootContext.eval(() { entry(args); });
   } else if (entry is _MainFunctionArgsMessage) {
@@ -271,6 +270,13 @@
   final Capability pauseCapability = new Capability();
   final Capability terminateCapability = new Capability();  // License to kill.
 
+  /// Boolean flag set when the initial method of the isolate has been executed.
+  ///
+  /// Used to avoid considering the isolate dead when it has no open
+  /// receive ports and no scheduled timers, because it hasn't had time to
+  /// create them yet.
+  bool initialized = false;
+
   // TODO(lrn): Store these in single "PauseState" object, so they don't take
   // up as much room when not pausing.
   bool isPaused = false;
@@ -290,11 +296,11 @@
   var _scheduledControlEvents;
   bool _isExecutingEvent = false;
 
-  /** Whether errors are considered fatal. */
-  // This doesn't do anything yet. We need to be able to catch uncaught errors
-  // (oxymoronically) in order to take lethal action. This is waiting for the
-  // same change as the uncaught error listeners.
-  bool errorsAreFatal = false;
+  /** Whether uncaught errors are considered fatal. */
+  bool errorsAreFatal = true;
+
+  // Set of ports that listen to uncaught errors.
+  Set<SendPort> errorPorts = new Set();
 
   _IsolateContext() {
     this.registerWeak(controlPort._id, controlPort);
@@ -379,6 +385,40 @@
     _scheduledControlEvents.addLast(kill);
   }
 
+  void addErrorListener(SendPort port) {
+    errorPorts.add(port);
+  }
+
+  void removeErrorListener(SendPort port) {
+    errorPorts.remove(port);
+  }
+
+  /** Function called with an uncaught error. */
+  void handleUncaughtError(error, StackTrace stackTrace) {
+    // Just print the error if there is no error listener registered.
+    if (errorPorts.isEmpty) {
+      // An uncaught error in the root isolate will terminate the program?
+      if (errorsAreFatal && identical(this, _globalState.rootContext)) {
+        // The error will be rethrown to reach the global scope, so
+        // don't print it.
+        return;
+      }
+      if (JS('bool', '#.console != null && '
+                     'typeof #.console.error == "function"',
+                     globalThis, globalThis)) {
+        JS('void', '#.console.error(#, #)', globalThis, error, stackTrace);
+      } else {
+        print(error);
+        if (stackTrace != null) print(stackTrace);
+      }
+      return;
+    }
+    List message = new List(2)
+        ..[0] = error.toString()
+        ..[1] = (stackTrace == null) ? null : stackTrace.toString();
+    for (SendPort port in errorPorts) port.send(message);
+  }
+
   /**
    * Run [code] in the context of the isolate represented by [this].
    */
@@ -390,6 +430,15 @@
     _isExecutingEvent = true;
     try {
       result = code();
+    } catch (e, s) {
+      handleUncaughtError(e, s);
+      if (errorsAreFatal) {
+        kill();
+        // An uncaught error in the root context terminates all isolates.
+        if (identical(this, _globalState.rootContext)) {
+          rethrow;
+        }
+      }
     } finally {
       _isExecutingEvent = false;
       _globalState.currentContext = old;
@@ -437,6 +486,12 @@
       case "kill":
         handleKill(message[1], message[2]);
         break;
+      case "getErrors":
+        addErrorListener(message[1]);
+        break;
+      case "stopErrors":
+        removeErrorListener(message[1]);
+        break;
       default:
     }
   }
@@ -468,7 +523,7 @@
   }
 
   void _updateGlobalState() {
-    if (ports.length - weakPorts.length > 0 || isPaused) {
+    if (ports.length - weakPorts.length > 0 || isPaused || !initialized) {
       _globalState.isolates[id] = this; // indicate this isolate is active
     } else {
       kill();
@@ -490,6 +545,7 @@
     ports.clear();
     weakPorts.clear();
     _globalState.isolates.remove(id); // indicate this isolate is not active
+    errorPorts.clear();
     if (doneHandlers != null) {
       for (SendPort port in doneHandlers) {
         port.send(null);
@@ -920,6 +976,7 @@
                   context.terminateCapability]);
 
     void runStartFunction() {
+      context.initialized = true;
       if (!isSpawnUri) {
         topLevel(message);
       } else if (topLevel is _MainFunctionArgsMessage) {
diff --git a/sdk/lib/_internal/lib/js_primitives.dart b/sdk/lib/_internal/lib/js_primitives.dart
index 3315040..389471d 100644
--- a/sdk/lib/_internal/lib/js_primitives.dart
+++ b/sdk/lib/_internal/lib/js_primitives.dart
@@ -27,7 +27,7 @@
 
   // Inside browser or nodejs.
   if (JS('bool', r'typeof console == "object"') &&
-      JS('bool', r'typeof console.log == "function"')) {
+      JS('bool', r'typeof console.log != "undefined"')) {
     JS('void', r'console.log(#)', string);
     return;
   }
diff --git a/sdk/lib/_internal/pub/lib/src/barback.dart b/sdk/lib/_internal/pub/lib/src/barback.dart
index 02cd3a1..fb25742 100644
--- a/sdk/lib/_internal/pub/lib/src/barback.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback.dart
@@ -22,16 +22,19 @@
 /// pub.dartlang.org) when they implement their own transformers. Pub's plug-in
 /// API dynamically loads transformers into their own isolate.
 ///
-/// This includes a string literal of Dart code ([_TRANSFORMER_ISOLATE] in
-/// load_transformers.dart). That code imports "package:barback/barback.dart".
-/// This string is included in the SDK, but that import is resolved using the
-/// application’s version of Barback. That means it must tightly control which
-/// version of Barback the application is using so that it's one that pub
-/// supports.
+/// This includes a Dart file (`asset/dart/transformer_isolate.dart`) which
+/// imports "package:barback/barback.dart". This file is included in the SDK,
+/// but that import is resolved using the application’s version of Barback. That
+/// means pub must tightly control which version of Barback the application is
+/// using so that it's one that pub supports.
 ///
-/// Whenever a new non-patch version of barback is published, this *must* be
-/// incremented to synchronize with that.
-final supportedVersions = new VersionConstraint.parse(">=0.13.0-dev <0.14.0");
+/// Whenever a new minor or patch version of barback is published, this *must*
+/// be incremented to synchronize with that. See the barback [compatibility
+/// documentation][compat] for details on the relationship between this
+/// constraint and barback's version.
+///
+/// [compat]: https://gist.github.com/nex3/10942218
+final supportedVersions = new VersionConstraint.parse(">=0.13.0 <0.14.1");
 
 /// A list of the names of all built-in transformers that pub exposes.
 const _BUILT_IN_TRANSFORMERS = const ['\$dart2js'];
diff --git a/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart
index 7ebd55b..0d9a965 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart
@@ -37,16 +37,16 @@
 
   ExcludingTransformer._(this._inner, this._includes, this._excludes);
 
-  Future<bool> isPrimary(AssetId id) {
+  isPrimary(AssetId id) {
     // TODO(rnystrom): Support globs in addition to paths. See #17093.
     if (_includes != null) {
       // If there are any includes, it must match one of them.
-      if (!_includes.contains(id.path)) return new Future.value(false);
+      if (!_includes.contains(id.path)) return false;
     }
 
     // It must not be excluded.
     if (_excludes != null && _excludes.contains(id.path)) {
-      return new Future.value(false);
+      return false;
     }
 
     return _inner.isPrimary(id);
diff --git a/sdk/lib/_internal/pub/lib/src/command/lish.dart b/sdk/lib/_internal/pub/lib/src/command/lish.dart
index b85d0f4..7706f40 100644
--- a/sdk/lib/_internal/pub/lib/src/command/lish.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/lish.dart
@@ -56,7 +56,7 @@
           if (url is! String) invalidServerResponse(response);
           cloudStorageUrl = Uri.parse(url);
           var request = new http.MultipartRequest('POST', cloudStorageUrl);
-          request.headers['Pub-Http-Timeout'] = 'None';
+          request.headers['Pub-Request-Timeout'] = 'None';
 
           var fields = _expectField(parameters, 'fields', response);
           if (fields is! Map) invalidServerResponse(response);
diff --git a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
index 6995889..552cc6d 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
@@ -242,12 +242,19 @@
     // Bail if there is nothing to backtrack to.
     if (_selected.isEmpty) return new Future.value(false);
 
-    // Get the set of packages that may have led to this failure.
+    // Mark any packages that may have led to this failure so that we know to
+    // consider them when backtracking.
     var dependers = _getTransitiveDependers(failure.package);
 
+    for (var selected in _selected) {
+      if (dependers.contains(selected.current.name)) {
+        selected.fail();
+      }
+    }
+
     // Advance past the current version of the leaf-most package.
     advanceVersion() {
-      _backjump(failure, dependers);
+      _backjump(failure);
       var previous = _selected.last.current;
       return _selected.last.advance().then((success) {
         if (success) {
@@ -274,7 +281,7 @@
   /// ones can be ignored and jumped over by the backtracker. The only packages
   /// we need to backtrack to are ones that led (possibly indirectly) to the
   /// failure. Everything else can be skipped.
-  void _backjump(SolveFailure failure, Set<String> dependers) {
+  void _backjump(SolveFailure failure) {
     for (var i = _selected.length - 1; i >= 0; i--) {
       // Each queue will never be empty since it gets discarded by _backtrack()
       // when that happens.
@@ -289,18 +296,8 @@
         continue;
       }
 
-      // If we get to the package that failed, backtrack to here.
-      if (selected.name == failure.package) {
-        logSolve('backjump to failed package ${selected.name}');
-        _selected.removeRange(i + 1, _selected.length);
-        return;
-      }
-
-      // If we get to a package that depends on the failing package, backtrack
-      // to here.
-      if (dependers.contains(selected.name)) {
-        logSolve('backjump to ${selected.name} because it depends on '
-                 '${failure.package}');
+      if (_selected[i].hasFailed) {
+        logSolve('backjump to ${selected.name}');
         _selected.removeRange(i + 1, _selected.length);
         return;
       }
diff --git a/sdk/lib/_internal/pub/lib/src/solver/version_queue.dart b/sdk/lib/_internal/pub/lib/src/solver/version_queue.dart
index 021b60e..78fa587 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/version_queue.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/version_queue.dart
@@ -40,6 +40,15 @@
     return _allowed.first;
   }
 
+  /// Whether the currently selected version has been responsible for a solve
+  /// failure, or depends on a package that has.
+  ///
+  /// The solver uses this to determine which packages to backtrack to after a
+  /// failure occurs. Any selected package that did *not* cause the failure can
+  /// be skipped by the backtracker.
+  bool get hasFailed => _hasFailed;
+  bool _hasFailed = false;
+
   /// Creates a new [VersionQueue] queue for starting with the optional
   /// [locked] package followed by the results of calling [allowedGenerator].
   ///
@@ -66,6 +75,10 @@
   /// Returns `true` if it moved to a new version (which can be accessed from
   /// [current]. Returns `false` if there are no more versions.
   Future<bool> advance() {
+    // Any failure was the fault of the previous version, not necessarily the
+    // new one.
+    _hasFailed = false;
+
     // If we have a locked version, consume it first.
     if (_locked != null) {
       // Advancing past the locked version, so need to load the others now
@@ -81,6 +94,12 @@
     return new Future.value(_allowed.isNotEmpty);
   }
 
+  /// Marks the selected version as being directly or indirectly responsible
+  /// for a solve failure.
+  void fail() {
+    _hasFailed = true;
+  }
+
   /// Determines the list of allowed versions matching its constraint and places
   /// them in [_allowed].
   Future _calculateAllowed() {
diff --git a/sdk/lib/_internal/pub/test/deps_test.dart b/sdk/lib/_internal/pub/test/deps_test.dart
index 3015362..0241d66 100644
--- a/sdk/lib/_internal/pub/test/deps_test.dart
+++ b/sdk/lib/_internal/pub/test/deps_test.dart
@@ -68,7 +68,7 @@
 
         dependencies:
         - from_path 1.2.3
-        - normal 1.2.3 [circular_a transitive]
+        - normal 1.2.3 [transitive circular_a]
         - overridden 2.0.0
 
         dev dependencies:
@@ -94,18 +94,18 @@
 
         dependencies:
         - from_path 1.2.3
-        - overridden 2.0.0
         - normal 1.2.3
-          - circular_a any
           - transitive any
+          - circular_a any
+        - overridden 2.0.0
 
         dev dependencies:
         - unittest 1.2.3
           - shared any
 
         dependency overrides:
-        - override_only 1.2.3
         - overridden 2.0.0
+        - override_only 1.2.3
 
         transitive dependencies:
         - circular_a 1.2.3
diff --git a/sdk/lib/_internal/pub/test/version_solver_test.dart b/sdk/lib/_internal/pub/test/version_solver_test.dart
index caefd26..54c8921 100644
--- a/sdk/lib/_internal/pub/test/version_solver_test.dart
+++ b/sdk/lib/_internal/pub/test/version_solver_test.dart
@@ -780,11 +780,29 @@
     'foo': '2.0.4'
   }, maxTries: 2);
 
-  // TODO(rnystrom): More tests. In particular:
-  // - Tests that demonstrate backtracking for every case that can cause a
-  //   solution to fail (no versions, disjoint, etc.)
-  // - Tests where there are multiple valid solutions and "best" is possibly
-  //   ambiguous to nail down which order the backtracker tries solutions.
+  // This is a regression test for #18666. It was possible for the solver to
+  // "forget" that a package had previously led to an error. In that case, it
+  // would backtrack over the failed package instead of trying different
+  // versions of it.
+  testResolve("finds solution with less strict constraint", {
+    "myapp 1.0.0": {
+      "a": "any",
+      "c": "any",
+      "d": "any"
+    },
+    "a 2.0.0": {},
+    "a 1.0.0": {},
+    "b 1.0.0": {"a": "1.0.0"},
+    "c 1.0.0": {"b": "any"},
+    "d 2.0.0": {"myapp": "any"},
+    "d 1.0.0": {"myapp": "<1.0.0"}
+  }, result: {
+    'myapp from root': '1.0.0',
+    'a': '1.0.0',
+    'b': '1.0.0',
+    'c': '1.0.0',
+    'd': '2.0.0'
+  }, maxTries: 3);
 }
 
 sdkConstraint() {
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index 5e02069..b7a7475 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -194,11 +194,12 @@
   }
 
   /**
-   * Creates a future that completes after a delay.
+   * Creates a future that runs its computation after a delay.
    *
-   * The future will be completed after the given [duration] has passed with
-   * the result of calling [computation]. If the duration is 0 or less, it
-   * completes no sooner than in the next event-loop iteration.
+   * The [computation] will be executed after the given [duration] has passed,
+   * and the future is completed with the result.
+   * If the duration is 0 or less,
+   * it completes no sooner than in the next event-loop iteration.
    *
    * If [computation] is omitted,
    * it will be treated as if [computation] was set to `() => null`,
@@ -207,8 +208,8 @@
    * If calling [computation] throws, the created future will complete with the
    * error.
    *
-   * See also [Completer] for a way to complete a future at a later
-   * time that isn't a known fixed duration.
+   * See also [Completer] for a way to create and complete a future at a
+   * later time that isn't necessarily after a known fixed duration.
    */
   factory Future.delayed(Duration duration, [T computation()]) {
     Completer completer = new Completer.sync();
@@ -216,7 +217,7 @@
     if (computation != null) {
       result = result.then((ignored) => computation());
     }
-    new Timer(duration, () { completer.complete(null); });
+    new Timer(duration, completer.complete);
     return result;
   }
 
@@ -487,18 +488,25 @@
  * A way to produce Future objects and to complete them later
  * with a value or error.
  *
- * If you already have a Future, you probably don't need a Completer.
- * Instead, you can usually use [Future.then], which returns a Future:
+ * Most of the time, the simplest way to create a future is to just use
+ * one of the [Future] constructors to capture the result of a single
+ * asynchronous computation:
+ *
+ *     new Future(() { doSomething(); return result; });
+ *
+ * or, if the future represents the result of a sequence of asynchronous
+ * computations, they can be chained using [Future.then] or similar functions
+ * on [Future]:
  *
  *     Future doStuff(){
  *       return someAsyncOperation().then((result) {
- *         // Do something.
+ *         return someOtherAsyncOperation(result);
  *       });
  *     }
  *
- * If you do need to create a Future from scratch—for example,
+ * If you do need to create a Future from scratch — for example,
  * when you're converting a callback-based API into a Future-based
- * one—you can use a Completer as follows:
+ * one — you can use a Completer as follows:
  *
  *     Class AsyncOperation {
  *       Completer _completer = new Completer();
@@ -509,12 +517,12 @@
  *       }
  *
  *       // Something calls this when the value is ready.
- *       _finishOperation(T result) {
+ *       void _finishOperation(T result) {
  *         _completer.complete(result);
  *       }
  *
  *       // If something goes wrong, call this.
- *       _errorHappened(error) {
+ *       void _errorHappened(error) {
  *         _completer.completeError(error);
  *       }
  *     }
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index e612b9c..a3b266f 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -1174,6 +1174,11 @@
    * for example a file being read, that should be deleted afterwards.
    * In that case, the file may not be able to be deleted successfully
    * until the returned future has completed.
+   *
+   * The future will be completed with a `null` value.
+   * If the cleanup throws, which it really shouldn't, the returned future
+   * will be completed with that error.
+   *
    * Returns `null` if there is no need to wait.
    */
   Future cancel();
diff --git a/sdk/lib/async/stream_controller.dart b/sdk/lib/async/stream_controller.dart
index d800825..34582ae 100644
--- a/sdk/lib/async/stream_controller.dart
+++ b/sdk/lib/async/stream_controller.dart
@@ -420,8 +420,7 @@
    */
   Future close() {
     if (isClosed) {
-      _ensureDoneFuture();
-      return _doneFuture;
+      return _ensureDoneFuture();
     }
     if (!_mayAddEvent) throw _badEventState();
     _state |= _STATE_CLOSED;
@@ -430,8 +429,7 @@
     } else if (_isInitialState) {
       _ensurePendingEvents().add(const _DelayedDone());
     }
-    _ensureDoneFuture();
-    return _doneFuture;
+    return _ensureDoneFuture();
   }
 
   // EventSink interface. Used by the [addStream] events.
@@ -489,27 +487,54 @@
   }
 
   Future _recordCancel(StreamSubscription<T> subscription) {
+    // When we cancel, we first cancel any stream being added,
+    // Then we call _onCancel, and finally the _doneFuture is completed.
+    // If either of addStream's cancel or _onCancel returns a future,
+    // we wait for it before continuing.
+    // Any error during this process ends up in the returned future.
+    // If more errors happen, we act as if it happens inside nested try/finallys
+    // or whenComplete calls, and only the last error ends up in the
+    // returned future.
+    Future result;
     if (_isAddingStream) {
       _StreamControllerAddStreamState addState = _varData;
-      addState.cancel();
+      result = addState.cancel();
     }
     _varData = null;
     _state =
         (_state & ~(_STATE_SUBSCRIBED | _STATE_ADDSTREAM)) | _STATE_CANCELED;
 
+    if (_onCancel != null) {
+      if (result == null) {
+        // Only introduce a future if one is needed.
+        // If _onCancel returns null, no future is needed.
+        try {
+          result = _onCancel();
+        } catch (e, s) {
+          // Return the error in the returned future.
+          // Complete it asynchronously, so there is time for a listener
+          // to handle the error.
+          result = new _Future().._asyncCompleteError(e, s);
+        }
+      } else {
+        // Simpler case when we already know that we will return a future.
+        result = result.whenComplete(_onCancel);
+      }
+    }
+
     void complete() {
       if (_doneFuture != null && _doneFuture._mayComplete) {
         _doneFuture._asyncComplete(null);
       }
     }
 
-    Future future = _runGuarded(_onCancel);
-    if (future != null) {
-      future = future.whenComplete(complete);
+    if (result != null) {
+      result = result.whenComplete(complete);
     } else {
       complete();
     }
-    return future;
+
+    return result;
   }
 
   void _recordPause(StreamSubscription<T> subscription) {
@@ -703,9 +728,21 @@
     addSubscription.resume();
   }
 
-  void cancel() {
-    addSubscription.cancel();
-    complete();
+  /**
+   * Stop adding the stream.
+   *
+   * Complete the future returned by `StreamController.addStream` when
+   * the cancel is complete.
+   *
+   * Return a future if the cancel takes time, otherwise return `null`.
+   */
+  Future cancel() {
+    var cancel = addSubscription.cancel();
+    if (cancel == null) {
+      addStreamFuture._asyncComplete(null);
+      return null;
+    }
+    return cancel.whenComplete(() { addStreamFuture._asyncComplete(null); });
   }
 
   void complete() {
diff --git a/sdk/lib/collection/maps.dart b/sdk/lib/collection/maps.dart
index ef937b3..1e4214f 100644
--- a/sdk/lib/collection/maps.dart
+++ b/sdk/lib/collection/maps.dart
@@ -20,9 +20,26 @@
  * A more efficient implementation is usually possible by overriding
  * some of the other members as well.
  */
-abstract class MapBase<K, V> implements Map<K, V> {
-  MapBase();  // Prevents use as mixin.
+abstract class MapBase<K, V> = Object with MapMixin<K, V>;
 
+
+/**
+ * Mixin implementing a [Map].
+ *
+ * This mixin has a basic implementation of all but five of the members of
+ * [Map].
+ * A basic `Map` class can be implemented by mixin in this class and
+ * implementing `keys`, `operator[]`, `operator[]=`, `remove` and `clear`.
+ * The remaining operations are implemented in terms of these five.
+ *
+ * The `keys` iterable should have efficient [length] and [contains]
+ * operations, and it should catch concurrent modifications of the keys
+ * while iterating.
+ *
+ * A more efficient implementation is usually possible by overriding
+ * some of the other members as well.
+ */
+abstract class MapMixin<K, V> implements Map<K, V> {
   Iterable<K> get keys;
   V operator[](Object key);
   operator []=(K key, V value);
diff --git a/sdk/lib/core/function.dart b/sdk/lib/core/function.dart
index 3eebddc..a349c36 100644
--- a/sdk/lib/core/function.dart
+++ b/sdk/lib/core/function.dart
@@ -36,4 +36,32 @@
   external static apply(Function function,
                         List positionalArguments,
                         [Map<Symbol, dynamic> namedArguments]);
+
+  /**
+   * Returns a hash code value that is compatible with `operator==`.
+   */
+  int get hashCode;
+
+  /**
+   * Test whether another object is equal to this function.
+   *
+   * System-created function objects are only equal to other functions.
+   *
+   * Two function objects are known to represent the same function if
+   *
+   * - It is the same object. Static and top-level functions are compile time
+   *   constants when used as values, so referring to the same function twice
+   *   always give the same object,
+   * - or if they refer to the same member method extracted from the same object.
+   *   Extracting a member method as a function value twice gives equal, but
+   *   not necessarily identical, function values.
+   *
+   * Function expressions never give rise to equal function objects. Each time
+   * a function expression is evaluated, it creates a new closure value that
+   * is not known to be equal to other closures created by the same expression.
+   *
+   * Classes implementing `Function` by having a `call` method should have their
+   * own `operator==` and `hashCode` depending on the object.
+   */
+  bool operator==(Object other);
 }
diff --git a/sdk/lib/core/string.dart b/sdk/lib/core/string.dart
index 1de01c6..ebc6c20 100644
--- a/sdk/lib/core/string.dart
+++ b/sdk/lib/core/string.dart
@@ -180,7 +180,15 @@
   int get length;
 
   /**
-   * Returns true if the two strings are equal. False, otherwise.
+   * Returns a hash code derived from the code units of the string.
+   *
+   * This is compatible with [operator==]. Strings with the same sequence
+   * of code units have the same hash code.
+   */
+  int get hashCode;
+
+  /**
+   * Returns true if other is a `String` with the same sequence of code units.
    *
    * This method compares each individual code unit of the strings.
    * It does not check for Unicode equivalence.
@@ -193,7 +201,7 @@
    * a single rune), whereas the second string encodes it as 'e' with the
    * combining accent character '◌́'.
    */
-  bool operator ==(var other);
+  bool operator ==(Object other);
 
   /**
    * Returns true if this string ends with [other]. For example:
diff --git a/sdk/lib/core/symbol.dart b/sdk/lib/core/symbol.dart
index e5cb8b2..f60cdd1 100644
--- a/sdk/lib/core/symbol.dart
+++ b/sdk/lib/core/symbol.dart
@@ -5,7 +5,7 @@
 part of dart.core;
 
 /// Opaque name used by mirrors, invocations and [Function.apply].
-class Symbol {
+abstract class Symbol {
   /**
    * Constructs a new Symbol.
    *
@@ -35,4 +35,19 @@
    * be passed to this constructor.
    */
   const factory Symbol(String name) = internal.Symbol;
+
+  /**
+   * Returns a hash code compatible with [operator==].
+   *
+   * Equal symbols have the same hash code.
+   */
+  int get hashCode;
+
+  /**
+   * Symbols are equal to other symbols that correspond to the same member name.
+   *
+   * Qualified member names, like `#foo.bar` are equal only if they have the
+   * same identifiers before the same final member name.
+   */
+  bool operator ==(Object other);
 }
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index e44393d..392b2b9 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -1605,10 +1605,6 @@
   @Experimental() // untriaged
   void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) native;
 
-  @DomName('CanvasRenderingContext2D.fill')
-  @DocsEditable()
-  void fill([String winding]) native;
-
   @DomName('CanvasRenderingContext2D.fillRect')
   @DocsEditable()
   void fillRect(num x, num y, num width, num height) native;
@@ -2062,6 +2058,11 @@
       JS('void', '#.fillText(#, #, #)', this, text, x, y);
     }
   }
+
+  @DomName('CanvasRenderingContext2D.fill')
+  void fill([String winding = 'nonzero']) {
+    JS('void', '#.fill(#)', this, winding);
+  }
 }
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6365,7 +6366,7 @@
 
   @DomName('Clipboard.setDragImage')
   @DocsEditable()
-  void setDragImage(Element element, int x, int y) native;
+  void setDragImage(Element image, int x, int y) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -23326,9 +23327,10 @@
   @Experimental() // untriaged
   final ShadowRoot olderShadowRoot;
 
+  @JSName('resetStyleInheritance')
   @DomName('ShadowRoot.resetStyleInheritance')
   @DocsEditable()
-  bool resetStyleInheritance;
+  bool _resetStyleInheritance;
 
   @DomName('ShadowRoot.styleSheets')
   @DocsEditable()
@@ -23368,6 +23370,14 @@
 
   static bool get supported =>
       JS('bool', '!!(Element.prototype.webkitCreateShadowRoot)');
+
+  @deprecated
+  bool get resetStyleInheritance => this._resetStyleInheritance;
+
+  @deprecated
+  void set resetStyleInheritance(bool value) {
+    this._resetStyleInheritance = value;
+  }
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -34934,95 +34944,6 @@
 
 
 /**
- * Helper class to implement custom events which wrap DOM events.
- */
-class _WrappedEvent implements Event {
-  final Event wrapped;
-
-  /** The CSS selector involved with event delegation. */
-  String _selector;
-
-  _WrappedEvent(this.wrapped);
-
-  bool get bubbles => wrapped.bubbles;
-
-  bool get cancelable => wrapped.cancelable;
-
-  DataTransfer get clipboardData => wrapped.clipboardData;
-
-  EventTarget get currentTarget => wrapped.currentTarget;
-
-  bool get defaultPrevented => wrapped.defaultPrevented;
-
-  int get eventPhase => wrapped.eventPhase;
-
-  EventTarget get target => wrapped.target;
-
-  int get timeStamp => wrapped.timeStamp;
-
-  String get type => wrapped.type;
-
-  void _initEvent(String eventTypeArg, bool canBubbleArg,
-      bool cancelableArg) {
-    throw new UnsupportedError(
-        'Cannot initialize this Event.');
-  }
-
-  void preventDefault() {
-    wrapped.preventDefault();
-  }
-
-  void stopImmediatePropagation() {
-    wrapped.stopImmediatePropagation();
-  }
-
-  void stopPropagation() {
-    wrapped.stopPropagation();
-  }
-
-  /**
-   * A pointer to the element whose CSS selector matched within which an event
-   * was fired. If this Event was not associated with any Event delegation,
-   * accessing this value will throw an [UnsupportedError].
-   */
-  Element get matchingTarget {
-    if (_selector == null) {
-      throw new UnsupportedError('Cannot call matchingTarget if this Event did'
-          ' not arise as a result of event delegation.');
-    }
-    var currentTarget = this.currentTarget;
-    var target = this.target;
-    var matchedTarget;
-    do {
-      if (target.matches(_selector)) return target;
-      target = target.parent;
-    } while (target != null && target != currentTarget.parent);
-    throw new StateError('No selector matched for populating matchedTarget.');
-  }
-
-  /**
-   * This event's path, taking into account shadow DOM.
-   *
-   * ## Other resources
-   *
-   * * [Shadow DOM extensions to Event]
-   * (http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event) from
-   * W3C.
-   */
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
-  @Experimental()
-  List<Node> get path => wrapped.path;
-
-  dynamic get _get_currentTarget => wrapped._get_currentTarget;
-
-  dynamic get _get_target => wrapped._get_target;
-}
-// 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.
-
-
-/**
  * A list which just wraps another list, for either intercepting list calls or
  * retyping the list (for example, from List<A> to List<B> where B extends A).
  */
@@ -35793,6 +35714,95 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/**
+ * Helper class to implement custom events which wrap DOM events.
+ */
+class _WrappedEvent implements Event {
+  final Event wrapped;
+
+  /** The CSS selector involved with event delegation. */
+  String _selector;
+
+  _WrappedEvent(this.wrapped);
+
+  bool get bubbles => wrapped.bubbles;
+
+  bool get cancelable => wrapped.cancelable;
+
+  DataTransfer get clipboardData => wrapped.clipboardData;
+
+  EventTarget get currentTarget => wrapped.currentTarget;
+
+  bool get defaultPrevented => wrapped.defaultPrevented;
+
+  int get eventPhase => wrapped.eventPhase;
+
+  EventTarget get target => wrapped.target;
+
+  int get timeStamp => wrapped.timeStamp;
+
+  String get type => wrapped.type;
+
+  void _initEvent(String eventTypeArg, bool canBubbleArg,
+      bool cancelableArg) {
+    throw new UnsupportedError(
+        'Cannot initialize this Event.');
+  }
+
+  void preventDefault() {
+    wrapped.preventDefault();
+  }
+
+  void stopImmediatePropagation() {
+    wrapped.stopImmediatePropagation();
+  }
+
+  void stopPropagation() {
+    wrapped.stopPropagation();
+  }
+
+  /**
+   * A pointer to the element whose CSS selector matched within which an event
+   * was fired. If this Event was not associated with any Event delegation,
+   * accessing this value will throw an [UnsupportedError].
+   */
+  Element get matchingTarget {
+    if (_selector == null) {
+      throw new UnsupportedError('Cannot call matchingTarget if this Event did'
+          ' not arise as a result of event delegation.');
+    }
+    var currentTarget = this.currentTarget;
+    var target = this.target;
+    var matchedTarget;
+    do {
+      if (target.matches(_selector)) return target;
+      target = target.parent;
+    } while (target != null && target != currentTarget.parent);
+    throw new StateError('No selector matched for populating matchedTarget.');
+  }
+
+  /**
+   * This event's path, taking into account shadow DOM.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM extensions to Event]
+   * (http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event) from
+   * W3C.
+   */
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
+  @Experimental()
+  List<Node> get path => wrapped.path;
+
+  dynamic get _get_currentTarget => wrapped._get_currentTarget;
+
+  dynamic get _get_target => wrapped._get_target;
+}
+// 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.
+
+
 _wrapZone(callback(arg)) {
   // For performance reasons avoid wrapping if we are in the root zone.
   if (Zone.current == Zone.ROOT) return callback;
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 33f0663..45a23a1 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -30,6 +30,7 @@
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:isolate';
+import 'dart:js' as js;
 import "dart:convert";
 import 'dart:math';
 import 'dart:mirrors';
@@ -108,24 +109,382 @@
   // TODO(17738): Plumb arguments and return value through.
   return _Utils.spawnDomUri(uri.toString());
 }
-// FIXME: This should be generated.
-const _typeMap = const {
-  'EventTarget': EventTarget,
-  'Window': Window,
-  'Element': Element,
+// FIXME: Can we make this private?
+const htmlBlinkMap = const {
+  '_HistoryCrossFrame': _HistoryCrossFrame,
+  '_LocationCrossFrame': _LocationCrossFrame,
+  '_DOMWindowCrossFrame': _DOMWindowCrossFrame,
+  // FIXME: Move these to better locations.
+  'DateTime': DateTime,
+  'JsObject': js.JsObject,
+  'JsFunction': js.JsFunction,
+  'JsArray': js.JsArray,
+  'AbstractWorker': AbstractWorker,
+  'Algorithm': Algorithm,
+  'Animation': Animation,
+  'ApplicationCache': ApplicationCache,
+  'Attr': _Attr,
+  'AutocompleteErrorEvent': AutocompleteErrorEvent,
+  'BarProp': BarProp,
+  'BeforeLoadEvent': BeforeLoadEvent,
+  'BeforeUnloadEvent': BeforeUnloadEvent,
+  'Blob': Blob,
+  'CDATASection': CDataSection,
+  'CSS': Css,
+  'CSSCharsetRule': CssCharsetRule,
+  'CSSFontFaceLoadEvent': CssFontFaceLoadEvent,
+  'CSSFontFaceRule': CssFontFaceRule,
+  'CSSImportRule': CssImportRule,
+  'CSSKeyframeRule': CssKeyframeRule,
+  'CSSKeyframesRule': CssKeyframesRule,
+  'CSSMediaRule': CssMediaRule,
+  'CSSPageRule': CssPageRule,
+  'CSSPrimitiveValue': _CSSPrimitiveValue,
+  'CSSRule': CssRule,
+  'CSSRuleList': _CssRuleList,
+  'CSSStyleDeclaration': CssStyleDeclaration,
+  'CSSStyleRule': CssStyleRule,
+  'CSSStyleSheet': CssStyleSheet,
+  'CSSSupportsRule': CssSupportsRule,
+  'CSSUnknownRule': _CSSUnknownRule,
+  'CSSValue': _CSSValue,
+  'CSSValueList': _CssValueList,
+  'CSSViewportRule': CssViewportRule,
+  'Canvas2DContextAttributes': Canvas2DContextAttributes,
+  'CanvasGradient': CanvasGradient,
+  'CanvasPattern': CanvasPattern,
+  'CanvasRenderingContext': CanvasRenderingContext,
+  'CanvasRenderingContext2D': CanvasRenderingContext2D,
+  'CharacterData': CharacterData,
+  'ChildNode': ChildNode,
+  'ClientRect': _ClientRect,
+  'ClientRectList': _ClientRectList,
+  'Clipboard': DataTransfer,
+  'CloseEvent': CloseEvent,
+  'Comment': Comment,
+  'CompositionEvent': CompositionEvent,
   'Console': Console,
-  'Node': Node,
+  'ConsoleBase': ConsoleBase,
+  'Coordinates': Coordinates,
+  'Counter': _Counter,
+  'Crypto': Crypto,
+  'CustomEvent': CustomEvent,
+  'DOMError': DomError,
+  'DOMException': DomException,
+  'DOMFileSystem': FileSystem,
+  'DOMFileSystemSync': _DOMFileSystemSync,
+  'DOMImplementation': DomImplementation,
+  'DOMParser': DomParser,
+  'DOMSettableTokenList': DomSettableTokenList,
+  'DOMStringList': DomStringList,
+  'DOMStringMap': DomStringMap,
+  'DOMTokenList': DomTokenList,
+  'DataTransferItem': DataTransferItem,
+  'DataTransferItemList': DataTransferItemList,
+  'DatabaseSync': _DatabaseSync,
+  'DedicatedWorkerGlobalScope': DedicatedWorkerGlobalScope,
+  'DeprecatedStorageInfo': DeprecatedStorageInfo,
+  'DeprecatedStorageQuota': DeprecatedStorageQuota,
+  'DeviceAcceleration': DeviceAcceleration,
+  'DeviceMotionEvent': DeviceMotionEvent,
+  'DeviceOrientationEvent': DeviceOrientationEvent,
+  'DeviceRotationRate': DeviceRotationRate,
+  'DirectoryEntry': DirectoryEntry,
+  'DirectoryEntrySync': _DirectoryEntrySync,
+  'DirectoryReader': DirectoryReader,
+  'DirectoryReaderSync': _DirectoryReaderSync,
   'Document': Document,
-  'HTMLElement': HtmlElement,
+  'DocumentFragment': DocumentFragment,
+  'DocumentType': _DocumentType,
+  'Element': Element,
+  'Entry': Entry,
+  'EntrySync': _EntrySync,
+  'ErrorEvent': ErrorEvent,
+  'Event': Event,
+  'EventSource': EventSource,
+  'EventTarget': EventTarget,
+  'File': File,
+  'FileEntry': FileEntry,
+  'FileEntrySync': _FileEntrySync,
+  'FileError': FileError,
+  'FileList': FileList,
+  'FileReader': FileReader,
+  'FileReaderSync': _FileReaderSync,
+  'FileWriter': FileWriter,
+  'FileWriterSync': _FileWriterSync,
+  'FocusEvent': FocusEvent,
+  'FontFace': FontFace,
+  'FontFaceSet': FontFaceSet,
+  'FormData': FormData,
+  'Gamepad': Gamepad,
+  'GamepadList': _GamepadList,
+  'Geolocation': Geolocation,
+  'Geoposition': Geoposition,
+  'GlobalEventHandlers': GlobalEventHandlers,
+  'HTMLAllCollection': _HTMLAllCollection,
+  'HTMLAnchorElement': AnchorElement,
+  'HTMLAppletElement': _HTMLAppletElement,
+  'HTMLAreaElement': AreaElement,
+  'HTMLAudioElement': AudioElement,
+  'HTMLBRElement': BRElement,
+  'HTMLBaseElement': BaseElement,
+  'HTMLBodyElement': BodyElement,
+  'HTMLButtonElement': ButtonElement,
   'HTMLCanvasElement': CanvasElement,
+  'HTMLCollection': HtmlCollection,
+  'HTMLContentElement': ContentElement,
+  'HTMLDListElement': DListElement,
+  'HTMLDataListElement': DataListElement,
+  'HTMLDetailsElement': DetailsElement,
+  'HTMLDialogElement': DialogElement,
+  'HTMLDirectoryElement': _HTMLDirectoryElement,
+  'HTMLDivElement': DivElement,
   'HTMLDocument': HtmlDocument,
-};
+  'HTMLElement': HtmlElement,
+  'HTMLEmbedElement': EmbedElement,
+  'HTMLFieldSetElement': FieldSetElement,
+  'HTMLFontElement': _HTMLFontElement,
+  'HTMLFormControlsCollection': HtmlFormControlsCollection,
+  'HTMLFormElement': FormElement,
+  'HTMLFrameElement': _HTMLFrameElement,
+  'HTMLFrameSetElement': _HTMLFrameSetElement,
+  'HTMLHRElement': HRElement,
+  'HTMLHeadElement': HeadElement,
+  'HTMLHeadingElement': HeadingElement,
+  'HTMLHtmlElement': HtmlHtmlElement,
+  'HTMLIFrameElement': IFrameElement,
+  'HTMLImageElement': ImageElement,
+  'HTMLInputElement': InputElement,
+  'HTMLKeygenElement': KeygenElement,
+  'HTMLLIElement': LIElement,
+  'HTMLLabelElement': LabelElement,
+  'HTMLLegendElement': LegendElement,
+  'HTMLLinkElement': LinkElement,
+  'HTMLMapElement': MapElement,
+  'HTMLMarqueeElement': _HTMLMarqueeElement,
+  'HTMLMediaElement': MediaElement,
+  'HTMLMenuElement': MenuElement,
+  'HTMLMetaElement': MetaElement,
+  'HTMLMeterElement': MeterElement,
+  'HTMLModElement': ModElement,
+  'HTMLOListElement': OListElement,
+  'HTMLObjectElement': ObjectElement,
+  'HTMLOptGroupElement': OptGroupElement,
+  'HTMLOptionElement': OptionElement,
+  'HTMLOptionsCollection': HtmlOptionsCollection,
+  'HTMLOutputElement': OutputElement,
+  'HTMLParagraphElement': ParagraphElement,
+  'HTMLParamElement': ParamElement,
+  'HTMLPreElement': PreElement,
+  'HTMLProgressElement': ProgressElement,
+  'HTMLQuoteElement': QuoteElement,
+  'HTMLScriptElement': ScriptElement,
+  'HTMLSelectElement': SelectElement,
+  'HTMLShadowElement': ShadowElement,
+  'HTMLSourceElement': SourceElement,
+  'HTMLSpanElement': SpanElement,
+  'HTMLStyleElement': StyleElement,
+  'HTMLTableCaptionElement': TableCaptionElement,
+  'HTMLTableCellElement': TableCellElement,
+  'HTMLTableColElement': TableColElement,
+  'HTMLTableElement': TableElement,
+  'HTMLTableRowElement': TableRowElement,
+  'HTMLTableSectionElement': TableSectionElement,
+  'HTMLTemplateElement': TemplateElement,
+  'HTMLTextAreaElement': TextAreaElement,
+  'HTMLTitleElement': TitleElement,
+  'HTMLTrackElement': TrackElement,
+  'HTMLUListElement': UListElement,
+  'HTMLUnknownElement': UnknownElement,
+  'HTMLVideoElement': VideoElement,
+  'HashChangeEvent': HashChangeEvent,
+  'History': History,
+  'ImageBitmap': ImageBitmap,
+  'ImageData': ImageData,
+  'InputMethodContext': InputMethodContext,
+  'InstallEvent': InstallEvent,
+  'InstallPhaseEvent': InstallPhaseEvent,
+  'Key': CryptoKey,
+  'KeyPair': KeyPair,
+  'KeyboardEvent': KeyboardEvent,
+  'Location': Location,
+  'MIDIAccess': MidiAccess,
+  'MIDIAccessPromise': MidiAccessPromise,
+  'MIDIConnectionEvent': MidiConnectionEvent,
+  'MIDIInput': MidiInput,
+  'MIDIMessageEvent': MidiMessageEvent,
+  'MIDIOutput': MidiOutput,
+  'MIDIPort': MidiPort,
+  'MediaController': MediaController,
+  'MediaError': MediaError,
+  'MediaKeyError': MediaKeyError,
+  'MediaKeyEvent': MediaKeyEvent,
+  'MediaKeyMessageEvent': MediaKeyMessageEvent,
+  'MediaKeyNeededEvent': MediaKeyNeededEvent,
+  'MediaKeySession': MediaKeySession,
+  'MediaKeys': MediaKeys,
+  'MediaList': MediaList,
+  'MediaQueryList': MediaQueryList,
+  'MediaSource': MediaSource,
+  'MediaStream': MediaStream,
+  'MediaStreamEvent': MediaStreamEvent,
+  'MediaStreamTrack': MediaStreamTrack,
+  'MediaStreamTrackEvent': MediaStreamTrackEvent,
+  'MemoryInfo': MemoryInfo,
+  'MessageChannel': MessageChannel,
+  'MessageEvent': MessageEvent,
+  'MessagePort': MessagePort,
+  'Metadata': Metadata,
+  'MimeType': MimeType,
+  'MimeTypeArray': MimeTypeArray,
+  'MouseEvent': MouseEvent,
+  'MutationEvent': _MutationEvent,
+  'MutationObserver': MutationObserver,
+  'MutationRecord': MutationRecord,
+  'NamedNodeMap': _NamedNodeMap,
+  'Navigator': Navigator,
+  'NavigatorID': NavigatorID,
+  'NavigatorOnLine': NavigatorOnLine,
+  'NavigatorUserMediaError': NavigatorUserMediaError,
+  'Node': Node,
+  'NodeFilter': NodeFilter,
+  'NodeIterator': NodeIterator,
+  'NodeList': NodeList,
+  'Notation': _Notation,
+  'Notification': Notification,
+  'NotificationCenter': _NotificationCenter,
+  'OverflowEvent': OverflowEvent,
+  'PagePopupController': _PagePopupController,
+  'PageTransitionEvent': PageTransitionEvent,
+  'ParentNode': ParentNode,
+  'Path': Path,
+  'Performance': Performance,
+  'PerformanceEntry': PerformanceEntry,
+  'PerformanceMark': PerformanceMark,
+  'PerformanceMeasure': PerformanceMeasure,
+  'PerformanceNavigation': PerformanceNavigation,
+  'PerformanceResourceTiming': PerformanceResourceTiming,
+  'PerformanceTiming': PerformanceTiming,
+  'Player': Player,
+  'Plugin': Plugin,
+  'PluginArray': PluginArray,
+  'PopStateEvent': PopStateEvent,
+  'PositionError': PositionError,
+  'ProcessingInstruction': ProcessingInstruction,
+  'ProgressEvent': ProgressEvent,
+  'RGBColor': _RGBColor,
+  'RTCDTMFSender': RtcDtmfSender,
+  'RTCDTMFToneChangeEvent': RtcDtmfToneChangeEvent,
+  'RTCDataChannel': RtcDataChannel,
+  'RTCDataChannelEvent': RtcDataChannelEvent,
+  'RTCIceCandidate': RtcIceCandidate,
+  'RTCIceCandidateEvent': RtcIceCandidateEvent,
+  'RTCPeerConnection': RtcPeerConnection,
+  'RTCSessionDescription': RtcSessionDescription,
+  'RTCStatsReport': RtcStatsReport,
+  'RTCStatsResponse': RtcStatsResponse,
+  'RadioNodeList': _RadioNodeList,
+  'Range': Range,
+  'Rect': _Rect,
+  'ResourceProgressEvent': ResourceProgressEvent,
+  'Screen': Screen,
+  'SecurityPolicyViolationEvent': SecurityPolicyViolationEvent,
+  'Selection': Selection,
+  'ServiceWorker': _ServiceWorker,
+  'ServiceWorkerContainer': ServiceWorkerContainer,
+  'ServiceWorkerGlobalScope': ServiceWorkerGlobalScope,
+  'ShadowRoot': ShadowRoot,
+  'SharedWorker': SharedWorker,
+  'SharedWorkerGlobalScope': SharedWorkerGlobalScope,
+  'SourceBuffer': SourceBuffer,
+  'SourceBufferList': SourceBufferList,
+  'SourceInfo': SourceInfo,
+  'SpeechGrammar': SpeechGrammar,
+  'SpeechGrammarList': SpeechGrammarList,
+  'SpeechInputEvent': SpeechInputEvent,
+  'SpeechInputResult': SpeechInputResult,
+  'SpeechInputResultList': _SpeechInputResultList,
+  'SpeechRecognition': SpeechRecognition,
+  'SpeechRecognitionAlternative': SpeechRecognitionAlternative,
+  'SpeechRecognitionError': SpeechRecognitionError,
+  'SpeechRecognitionEvent': SpeechRecognitionEvent,
+  'SpeechRecognitionResult': SpeechRecognitionResult,
+  'SpeechRecognitionResultList': _SpeechRecognitionResultList,
+  'SpeechSynthesis': SpeechSynthesis,
+  'SpeechSynthesisEvent': SpeechSynthesisEvent,
+  'SpeechSynthesisUtterance': SpeechSynthesisUtterance,
+  'SpeechSynthesisVoice': SpeechSynthesisVoice,
+  'Storage': Storage,
+  'StorageEvent': StorageEvent,
+  'StorageInfo': StorageInfo,
+  'StorageQuota': StorageQuota,
+  'Stream': FileStream,
+  'StyleMedia': StyleMedia,
+  'StyleSheet': StyleSheet,
+  'StyleSheetList': _StyleSheetList,
+  'SubtleCrypto': _SubtleCrypto,
+  'Text': Text,
+  'TextEvent': TextEvent,
+  'TextMetrics': TextMetrics,
+  'TextTrack': TextTrack,
+  'TextTrackCue': TextTrackCue,
+  'TextTrackCueList': TextTrackCueList,
+  'TextTrackList': TextTrackList,
+  'TimeRanges': TimeRanges,
+  'TimedItem': TimedItem,
+  'Timeline': Timeline,
+  'Timing': Timing,
+  'Touch': Touch,
+  'TouchEvent': TouchEvent,
+  'TouchList': TouchList,
+  'TrackEvent': TrackEvent,
+  'TransitionEvent': TransitionEvent,
+  'TreeWalker': TreeWalker,
+  'UIEvent': UIEvent,
+  'URL': Url,
+  'URLUtils': UrlUtils,
+  'URLUtilsReadOnly': UrlUtilsReadOnly,
+  'VTTCue': VttCue,
+  'VTTRegion': VttRegion,
+  'VTTRegionList': VttRegionList,
+  'ValidityState': ValidityState,
+  'VideoPlaybackQuality': VideoPlaybackQuality,
+  'WebKitAnimationEvent': AnimationEvent,
+  'WebKitCSSFilterRule': CssFilterRule,
+  'WebKitCSSFilterValue': _WebKitCSSFilterValue,
+  'WebKitCSSMatrix': _WebKitCSSMatrix,
+  'WebKitCSSTransformValue': _WebKitCSSTransformValue,
+  'WebKitMediaSource': _WebKitMediaSource,
+  'WebKitNotification': _WebKitNotification,
+  'WebKitPoint': _DomPoint,
+  'WebKitSourceBuffer': _WebKitSourceBuffer,
+  'WebKitSourceBufferList': _WebKitSourceBufferList,
+  'WebSocket': WebSocket,
+  'WheelEvent': WheelEvent,
+  'Window': Window,
+  'WindowBase64': WindowBase64,
+  'WindowEventHandlers': WindowEventHandlers,
+  'WindowTimers': _WindowTimers,
+  'Worker': Worker,
+  'WorkerConsole': WorkerConsole,
+  'WorkerCrypto': WorkerCrypto,
+  'WorkerGlobalScope': WorkerGlobalScope,
+  'WorkerLocation': _WorkerLocation,
+  'WorkerNavigator': _WorkerNavigator,
+  'WorkerPerformance': WorkerPerformance,
+  'XMLDocument': XmlDocument,
+  'XMLHttpRequest': HttpRequest,
+  'XMLHttpRequestEventTarget': HttpRequestEventTarget,
+  'XMLHttpRequestProgressEvent': _XMLHttpRequestProgressEvent,
+  'XMLHttpRequestUpload': HttpRequestUpload,
+  'XMLSerializer': XmlSerializer,
+  'XPathEvaluator': XPathEvaluator,
+  'XPathExpression': XPathExpression,
+  'XPathNSResolver': XPathNSResolver,
+  'XPathResult': XPathResult,
+  'XSLTProcessor': XsltProcessor,
 
-Type _getType(String key) {
-  if (!_typeMap.containsKey(key))
-    return null;
-  return _typeMap[key];
-}
+};
 // 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.
@@ -520,18 +879,6 @@
   @DocsEditable()
   void update() => _blink.Native_ApplicationCache_update_Callback(this);
 
-  @DomName('ApplicationCache.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_ApplicationCache_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('ApplicationCache.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_ApplicationCache_dispatchEvent_Callback(this, event);
-
-  @DomName('ApplicationCache.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_ApplicationCache_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `cached` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.oncached')
   @DocsEditable()
@@ -6631,7 +6978,7 @@
 
   @DomName('Clipboard.setDragImage')
   @DocsEditable()
-  void setDragImage(Element element, int x, int y) => _blink.Native_Clipboard_setDragImage_Callback(this, element, x, y);
+  void setDragImage(Element image, int x, int y) => _blink.Native_Clipboard_setDragImage_Callback(this, image, x, y);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12138,18 +12485,6 @@
   @DocsEditable()
   void close() => _blink.Native_EventSource_close_Callback(this);
 
-  @DomName('EventSource.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_EventSource_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('EventSource.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_EventSource_dispatchEvent_Callback(this, event);
-
-  @DomName('EventSource.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_EventSource_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `error` events handled by this [EventSource].
   @DomName('EventSource.onerror')
   @DocsEditable()
@@ -12694,18 +13029,6 @@
 
   void readAsText(Blob blob, [String encoding]) => _blink.Native_FileReader_readAsText(this, blob, encoding);
 
-  @DomName('FileReader.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_FileReader_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('FileReader.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_FileReader_dispatchEvent_Callback(this, event);
-
-  @DomName('FileReader.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_FileReader_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `abort` events handled by this [FileReader].
   @DomName('FileReader.onabort')
   @DocsEditable()
@@ -12915,18 +13238,6 @@
   @DocsEditable()
   void write(Blob data) => _blink.Native_FileWriter_write_Callback(this, data);
 
-  @DomName('FileWriter.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_FileWriter_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('FileWriter.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_FileWriter_dispatchEvent_Callback(this, event);
-
-  @DomName('FileWriter.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_FileWriter_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `abort` events handled by this [FileWriter].
   @DomName('FileWriter.onabort')
   @DocsEditable()
@@ -13137,21 +13448,6 @@
   @Experimental() // untriaged
   bool has(FontFace fontFace) => _blink.Native_FontFaceSet_has_Callback(this, fontFace);
 
-  @DomName('FontFaceSet.addEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_FontFaceSet_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('FontFaceSet.dispatchEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool dispatchEvent(Event event) => _blink.Native_FontFaceSet_dispatchEvent_Callback(this, event);
-
-  @DomName('FontFaceSet.removeEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_FontFaceSet_removeEventListener_Callback(this, type, listener, useCapture);
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -15898,21 +16194,6 @@
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> timeoutEvent = const EventStreamProvider<ProgressEvent>('timeout');
 
-  @DomName('XMLHttpRequestEventTarget.addEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_XMLHttpRequestEventTarget_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('XMLHttpRequestEventTarget.dispatchEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool dispatchEvent(Event event) => _blink.Native_XMLHttpRequestEventTarget_dispatchEvent_Callback(this, event);
-
-  @DomName('XMLHttpRequestEventTarget.removeEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_XMLHttpRequestEventTarget_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `abort` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onabort')
   @DocsEditable()
@@ -17301,21 +17582,6 @@
   @DocsEditable()
   void confirmComposition() => _blink.Native_InputMethodContext_confirmComposition_Callback(this);
 
-  @DomName('InputMethodContext.addEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_InputMethodContext_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('InputMethodContext.dispatchEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool dispatchEvent(Event event) => _blink.Native_InputMethodContext_dispatchEvent_Callback(this, event);
-
-  @DomName('InputMethodContext.removeEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_InputMethodContext_removeEventListener_Callback(this, type, listener, useCapture);
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -18042,18 +18308,6 @@
   @DocsEditable()
   void unpause() => _blink.Native_MediaController_unpause_Callback(this);
 
-  @DomName('MediaController.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaController_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('MediaController.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_MediaController_dispatchEvent_Callback(this, event);
-
-  @DomName('MediaController.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaController_removeEventListener_Callback(this, type, listener, useCapture);
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -18956,18 +19210,6 @@
   @DocsEditable()
   void update(Uint8List response) => _blink.Native_MediaKeySession_update_Callback(this, response);
 
-  @DomName('MediaKeySession.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaKeySession_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('MediaKeySession.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_MediaKeySession_dispatchEvent_Callback(this, event);
-
-  @DomName('MediaKeySession.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaKeySession_removeEventListener_Callback(this, type, listener, useCapture);
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -19112,18 +19354,6 @@
   @DocsEditable()
   void removeSourceBuffer(SourceBuffer buffer) => _blink.Native_MediaSource_removeSourceBuffer_Callback(this, buffer);
 
-  @DomName('MediaSource.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaSource_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('MediaSource.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_MediaSource_dispatchEvent_Callback(this, event);
-
-  @DomName('MediaSource.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaSource_removeEventListener_Callback(this, type, listener, useCapture);
-
 }
 // 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
@@ -19209,18 +19439,6 @@
   @DocsEditable()
   void stop() => _blink.Native_MediaStream_stop_Callback(this);
 
-  @DomName('MediaStream.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaStream_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('MediaStream.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_MediaStream_dispatchEvent_Callback(this, event);
-
-  @DomName('MediaStream.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaStream_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `addtrack` events handled by this [MediaStream].
   @DomName('MediaStream.onaddtrack')
   @DocsEditable()
@@ -19357,18 +19575,6 @@
   @Experimental() // untriaged
   void stop() => _blink.Native_MediaStreamTrack_stop_Callback(this);
 
-  @DomName('MediaStreamTrack.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaStreamTrack_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('MediaStreamTrack.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_MediaStreamTrack_dispatchEvent_Callback(this, event);
-
-  @DomName('MediaStreamTrack.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaStreamTrack_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `ended` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onended')
   @DocsEditable()
@@ -19585,18 +19791,6 @@
   @DocsEditable()
   void start() => _blink.Native_MessagePort_start_Callback(this);
 
-  @DomName('MessagePort.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MessagePort_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('MessagePort.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_MessagePort_dispatchEvent_Callback(this, event);
-
-  @DomName('MessagePort.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MessagePort_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `message` events handled by this [MessagePort].
   @DomName('MessagePort.onmessage')
   @DocsEditable()
@@ -19813,18 +20007,6 @@
   @DocsEditable()
   List<MidiOutput> outputs() => _blink.Native_MIDIAccess_outputs_Callback(this);
 
-  @DomName('MIDIAccess.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MIDIAccess_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('MIDIAccess.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_MIDIAccess_dispatchEvent_Callback(this, event);
-
-  @DomName('MIDIAccess.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MIDIAccess_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `connect` events handled by this [MidiAccess].
   @DomName('MIDIAccess.onconnect')
   @DocsEditable()
@@ -19994,18 +20176,6 @@
   @DocsEditable()
   String get version => _blink.Native_MIDIPort_version_Getter(this);
 
-  @DomName('MIDIPort.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MIDIPort_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('MIDIPort.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_MIDIPort_dispatchEvent_Callback(this, event);
-
-  @DomName('MIDIPort.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MIDIPort_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `disconnect` events handled by this [MidiPort].
   @DomName('MIDIPort.ondisconnect')
   @DocsEditable()
@@ -21376,18 +21546,6 @@
   @DocsEditable()
   Node _replaceChild(Node newChild, Node oldChild) => _blink.Native_Node_replaceChild_Callback(this, newChild, oldChild);
 
-  @DomName('Node.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Node_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('Node.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_Node_dispatchEvent_Callback(this, event);
-
-  @DomName('Node.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Node_removeEventListener_Callback(this, type, listener, useCapture);
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -21677,18 +21835,6 @@
     return completer.future;
   }
 
-  @DomName('Notification.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Notification_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('Notification.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_Notification_dispatchEvent_Callback(this, event);
-
-  @DomName('Notification.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Notification_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `click` events handled by this [Notification].
   @DomName('Notification.onclick')
   @DocsEditable()
@@ -22400,21 +22546,6 @@
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
   void setResourceTimingBufferSize(int maxSize) => _blink.Native_Performance_webkitSetResourceTimingBufferSize_Callback(this, maxSize);
 
-  @DomName('Performance.addEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Performance_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('Performance.dispatchEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool dispatchEvent(Event event) => _blink.Native_Performance_dispatchEvent_Callback(this, event);
-
-  @DomName('Performance.removeEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Performance_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `resourcetimingbufferfull` events handled by this [Performance].
   @DomName('Performance.onwebkitresourcetimingbufferfull')
   @DocsEditable()
@@ -23523,18 +23654,6 @@
   @DocsEditable()
   void sendTypedData(TypedData data) => _blink.Native_RTCDataChannel_sendTypedData_Callback(this, data);
 
-  @DomName('RTCDataChannel.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_RTCDataChannel_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('RTCDataChannel.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_RTCDataChannel_dispatchEvent_Callback(this, event);
-
-  @DomName('RTCDataChannel.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_RTCDataChannel_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `close` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onclose')
   @DocsEditable()
@@ -23623,18 +23742,6 @@
 
   void insertDtmf(String tones, [int duration, int interToneGap]) => _blink.Native_RTCDTMFSender_insertDtmf(this, tones, duration, interToneGap);
 
-  @DomName('RTCDTMFSender.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_RTCDTMFSender_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('RTCDTMFSender.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_RTCDTMFSender_dispatchEvent_Callback(this, event);
-
-  @DomName('RTCDTMFSender.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_RTCDTMFSender_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `tonechange` events handled by this [RtcDtmfSender].
   @DomName('RTCDTMFSender.ontonechange')
   @DocsEditable()
@@ -23925,18 +24032,6 @@
   @DocsEditable()
   void updateIce([Map configuration, Map mediaConstraints]) => _blink.Native_RTCPeerConnection_updateIce_Callback(this, configuration, mediaConstraints);
 
-  @DomName('RTCPeerConnection.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_RTCPeerConnection_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('RTCPeerConnection.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_RTCPeerConnection_dispatchEvent_Callback(this, event);
-
-  @DomName('RTCPeerConnection.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_RTCPeerConnection_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `addstream` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onaddstream')
   @DocsEditable()
@@ -24145,21 +24240,6 @@
   @DocsEditable()
   @Experimental() // untriaged
   void unlockOrientation() => _blink.Native_Screen_unlockOrientation_Callback(this);
-
-  @DomName('Screen.addEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Screen_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('Screen.dispatchEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool dispatchEvent(Event event) => _blink.Native_Screen_dispatchEvent_Callback(this, event);
-
-  @DomName('Screen.removeEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Screen_removeEventListener_Callback(this, type, listener, useCapture);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -24710,11 +24790,11 @@
 
   @DomName('ShadowRoot.resetStyleInheritance')
   @DocsEditable()
-  bool get resetStyleInheritance => _blink.Native_ShadowRoot_resetStyleInheritance_Getter(this);
+  bool get _resetStyleInheritance => _blink.Native_ShadowRoot_resetStyleInheritance_Getter(this);
 
   @DomName('ShadowRoot.resetStyleInheritance')
   @DocsEditable()
-  void set resetStyleInheritance(bool value) => _blink.Native_ShadowRoot_resetStyleInheritance_Setter(this, value);
+  void set _resetStyleInheritance(bool value) => _blink.Native_ShadowRoot_resetStyleInheritance_Setter(this, value);
 
   @DomName('ShadowRoot.styleSheets')
   @DocsEditable()
@@ -24746,6 +24826,29 @@
   Selection getSelection() => _blink.Native_ShadowRoot_getSelection_Callback(this);
 
   static final bool supported = true;
+
+  static bool _resetStyleInheritanceDeprecationReported = false;
+  static void _resetStyleInheritanceDeprecationReport() {
+    if (!_resetStyleInheritanceDeprecationReported) {
+      window.console.warn('''
+ShadowRoot.resetStyleInheritance is now deprecated in dart:html.
+Please remove from your code.
+''');
+      _resetStyleInheritanceDeprecationReported = true;
+    }
+  }
+
+  @deprecated
+  bool get resetStyleInheritance {
+    _resetStyleInheritanceDeprecationReport();
+    // Default value from when it was specified.
+    return false;
+  }
+
+  @deprecated
+  void set resetStyleInheritance(bool value) {
+    _resetStyleInheritanceDeprecationReport();
+  }
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -24780,21 +24883,6 @@
   @Experimental() // untriaged
   double get workerStart => _blink.Native_SharedWorker_workerStart_Getter(this);
 
-  @DomName('SharedWorker.addEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SharedWorker_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('SharedWorker.dispatchEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool dispatchEvent(Event event) => _blink.Native_SharedWorker_dispatchEvent_Callback(this, event);
-
-  @DomName('SharedWorker.removeEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SharedWorker_removeEventListener_Callback(this, type, listener, useCapture);
-
   @DomName('SharedWorker.onerror')
   @DocsEditable()
   @Experimental() // untriaged
@@ -24921,21 +25009,6 @@
   @Experimental() // untriaged
   void remove(num start, num end) => _blink.Native_SourceBuffer_remove_Callback(this, start, end);
 
-  @DomName('SourceBuffer.addEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SourceBuffer_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('SourceBuffer.dispatchEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool dispatchEvent(Event event) => _blink.Native_SourceBuffer_dispatchEvent_Callback(this, event);
-
-  @DomName('SourceBuffer.removeEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SourceBuffer_removeEventListener_Callback(this, type, listener, useCapture);
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -25006,18 +25079,6 @@
   @DocsEditable()
   SourceBuffer item(int index) => _blink.Native_SourceBufferList_item_Callback(this, index);
 
-  @DomName('SourceBufferList.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SourceBufferList_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('SourceBufferList.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_SourceBufferList_dispatchEvent_Callback(this, event);
-
-  @DomName('SourceBufferList.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SourceBufferList_removeEventListener_Callback(this, type, listener, useCapture);
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -25469,18 +25530,6 @@
   @DocsEditable()
   void stop() => _blink.Native_SpeechRecognition_stop_Callback(this);
 
-  @DomName('SpeechRecognition.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SpeechRecognition_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('SpeechRecognition.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_SpeechRecognition_dispatchEvent_Callback(this, event);
-
-  @DomName('SpeechRecognition.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SpeechRecognition_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `audioend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onaudioend')
   @DocsEditable()
@@ -25696,21 +25745,6 @@
   @DocsEditable()
   void speak(SpeechSynthesisUtterance utterance) => _blink.Native_SpeechSynthesis_speak_Callback(this, utterance);
 
-  @DomName('SpeechSynthesis.addEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SpeechSynthesis_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('SpeechSynthesis.dispatchEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool dispatchEvent(Event event) => _blink.Native_SpeechSynthesis_dispatchEvent_Callback(this, event);
-
-  @DomName('SpeechSynthesis.removeEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SpeechSynthesis_removeEventListener_Callback(this, type, listener, useCapture);
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -25877,21 +25911,6 @@
   @DocsEditable()
   void set volume(num value) => _blink.Native_SpeechSynthesisUtterance_volume_Setter(this, value);
 
-  @DomName('SpeechSynthesisUtterance.addEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SpeechSynthesisUtterance_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('SpeechSynthesisUtterance.dispatchEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool dispatchEvent(Event event) => _blink.Native_SpeechSynthesisUtterance_dispatchEvent_Callback(this, event);
-
-  @DomName('SpeechSynthesisUtterance.removeEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SpeechSynthesisUtterance_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `boundary` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onboundary')
   @DocsEditable()
@@ -27082,18 +27101,6 @@
   @Experimental() // untriaged
   void removeRegion(VttRegion region) => _blink.Native_TextTrack_removeRegion_Callback(this, region);
 
-  @DomName('TextTrack.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_TextTrack_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('TextTrack.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_TextTrack_dispatchEvent_Callback(this, event);
-
-  @DomName('TextTrack.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_TextTrack_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `cuechange` events handled by this [TextTrack].
   @DomName('TextTrack.oncuechange')
   @DocsEditable()
@@ -27171,18 +27178,6 @@
   @DocsEditable()
   TextTrack get track => _blink.Native_TextTrackCue_track_Getter(this);
 
-  @DomName('TextTrackCue.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_TextTrackCue_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('TextTrackCue.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_TextTrackCue_dispatchEvent_Callback(this, event);
-
-  @DomName('TextTrackCue.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_TextTrackCue_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `enter` events handled by this [TextTrackCue].
   @DomName('TextTrackCue.onenter')
   @DocsEditable()
@@ -27357,18 +27352,6 @@
   @DocsEditable()
   TextTrack item(int index) => _blink.Native_TextTrackList_item_Callback(this, index);
 
-  @DomName('TextTrackList.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_TextTrackList_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('TextTrackList.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_TextTrackList_dispatchEvent_Callback(this, event);
-
-  @DomName('TextTrackList.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_TextTrackList_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `addtrack` events handled by this [TextTrackList].
   @DomName('TextTrackList.onaddtrack')
   @DocsEditable()
@@ -29080,16 +29063,7 @@
 
   void close([int code, String reason]) => _blink.Native_WebSocket_close(this, code, reason);
 
-  /**
-   * Transmit data to the server over this connection.
-   *
-   * This method accepts data of type [Blob], [ByteBuffer], [String], or
-   * [TypedData]. Named variants [sendBlob], [sendByteBuffer], [sendString],
-   * or [sendTypedData], in constrast, only accept data of the specified type.
-   */
-  @DomName('WebSocket.send')
-  @DocsEditable()
-  void send(data) => _blink.Native_WebSocket_send_Callback(this, data);
+  void send(data) => _blink.Native_WebSocket_send(this, data);
 
   @DomName('WebSocket.sendBlob')
   @DocsEditable()
@@ -29107,18 +29081,6 @@
   @DocsEditable()
   void sendTypedData(TypedData data) => _blink.Native_WebSocket_sendTypedData_Callback(this, data);
 
-  @DomName('WebSocket.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_WebSocket_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('WebSocket.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_WebSocket_dispatchEvent_Callback(this, event);
-
-  @DomName('WebSocket.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_WebSocket_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `close` events handled by this [WebSocket].
   @DomName('WebSocket.onclose')
   @DocsEditable()
@@ -30416,18 +30378,6 @@
     return completer.future;
   }
 
-  @DomName('Window.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Window_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('Window.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_Window_dispatchEvent_Callback(this, event);
-
-  @DomName('Window.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Window_removeEventListener_Callback(this, type, listener, useCapture);
-
   @DomName('Window.atob')
   @DocsEditable()
   String atob(String string) => _blink.Native_Window_atob_Callback(this, string);
@@ -30966,21 +30916,6 @@
   @DocsEditable()
   void terminate() => _blink.Native_Worker_terminate_Callback(this);
 
-  @DomName('Worker.addEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Worker_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('Worker.dispatchEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool dispatchEvent(Event event) => _blink.Native_Worker_dispatchEvent_Callback(this, event);
-
-  @DomName('Worker.removeEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Worker_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `error` events handled by this [Worker].
   @DomName('Worker.onerror')
   @DocsEditable()
@@ -31163,21 +31098,6 @@
     return completer.future;
   }
 
-  @DomName('WorkerGlobalScope.addEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_WorkerGlobalScope_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('WorkerGlobalScope.dispatchEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool dispatchEvent(Event event) => _blink.Native_WorkerGlobalScope_dispatchEvent_Callback(this, event);
-
-  @DomName('WorkerGlobalScope.removeEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_WorkerGlobalScope_removeEventListener_Callback(this, type, listener, useCapture);
-
   @DomName('WorkerGlobalScope.atob')
   @DocsEditable()
   @Experimental() // untriaged
@@ -33049,95 +32969,6 @@
   factory _XMLHttpRequestProgressEvent._() { throw new UnsupportedError("Not supported"); }
 
 }
-// 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.
-
-
-/**
- * Helper class to implement custom events which wrap DOM events.
- */
-class _WrappedEvent implements Event {
-  final Event wrapped;
-
-  /** The CSS selector involved with event delegation. */
-  String _selector;
-
-  _WrappedEvent(this.wrapped);
-
-  bool get bubbles => wrapped.bubbles;
-
-  bool get cancelable => wrapped.cancelable;
-
-  DataTransfer get clipboardData => wrapped.clipboardData;
-
-  EventTarget get currentTarget => wrapped.currentTarget;
-
-  bool get defaultPrevented => wrapped.defaultPrevented;
-
-  int get eventPhase => wrapped.eventPhase;
-
-  EventTarget get target => wrapped.target;
-
-  int get timeStamp => wrapped.timeStamp;
-
-  String get type => wrapped.type;
-
-  void _initEvent(String eventTypeArg, bool canBubbleArg,
-      bool cancelableArg) {
-    throw new UnsupportedError(
-        'Cannot initialize this Event.');
-  }
-
-  void preventDefault() {
-    wrapped.preventDefault();
-  }
-
-  void stopImmediatePropagation() {
-    wrapped.stopImmediatePropagation();
-  }
-
-  void stopPropagation() {
-    wrapped.stopPropagation();
-  }
-
-  /**
-   * A pointer to the element whose CSS selector matched within which an event
-   * was fired. If this Event was not associated with any Event delegation,
-   * accessing this value will throw an [UnsupportedError].
-   */
-  Element get matchingTarget {
-    if (_selector == null) {
-      throw new UnsupportedError('Cannot call matchingTarget if this Event did'
-          ' not arise as a result of event delegation.');
-    }
-    var currentTarget = this.currentTarget;
-    var target = this.target;
-    var matchedTarget;
-    do {
-      if (target.matches(_selector)) return target;
-      target = target.parent;
-    } while (target != null && target != currentTarget.parent);
-    throw new StateError('No selector matched for populating matchedTarget.');
-  }
-
-  /**
-   * This event's path, taking into account shadow DOM.
-   *
-   * ## Other resources
-   *
-   * * [Shadow DOM extensions to Event]
-   * (http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event) from
-   * W3C.
-   */
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
-  @Experimental()
-  List<Node> get path => wrapped.path;
-
-  dynamic get _get_currentTarget => wrapped._get_currentTarget;
-
-  dynamic get _get_target => wrapped._get_target;
-}
 // Copyright (c) 2012, 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.
@@ -37172,7 +37003,8 @@
     if (element.runtimeType != _nativeType) {
       throw new UnsupportedError('Element is incorrect type');
     }
-    return _Utils.changeElementWrapper(element, _type);
+    _Utils.changeElementWrapper(element, _type);
+    return null;
   }
 }
 
@@ -37410,6 +37242,91 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+/**
+ * Helper class to implement custom events which wrap DOM events.
+ */
+class _WrappedEvent implements Event {
+  final Event wrapped;
+
+  /** The CSS selector involved with event delegation. */
+  String _selector;
+
+  _WrappedEvent(this.wrapped);
+
+  bool get bubbles => wrapped.bubbles;
+
+  bool get cancelable => wrapped.cancelable;
+
+  DataTransfer get clipboardData => wrapped.clipboardData;
+
+  EventTarget get currentTarget => wrapped.currentTarget;
+
+  bool get defaultPrevented => wrapped.defaultPrevented;
+
+  int get eventPhase => wrapped.eventPhase;
+
+  EventTarget get target => wrapped.target;
+
+  int get timeStamp => wrapped.timeStamp;
+
+  String get type => wrapped.type;
+
+  void _initEvent(String eventTypeArg, bool canBubbleArg,
+      bool cancelableArg) {
+    throw new UnsupportedError(
+        'Cannot initialize this Event.');
+  }
+
+  void preventDefault() {
+    wrapped.preventDefault();
+  }
+
+  void stopImmediatePropagation() {
+    wrapped.stopImmediatePropagation();
+  }
+
+  void stopPropagation() {
+    wrapped.stopPropagation();
+  }
+
+  /**
+   * A pointer to the element whose CSS selector matched within which an event
+   * was fired. If this Event was not associated with any Event delegation,
+   * accessing this value will throw an [UnsupportedError].
+   */
+  Element get matchingTarget {
+    if (_selector == null) {
+      throw new UnsupportedError('Cannot call matchingTarget if this Event did'
+          ' not arise as a result of event delegation.');
+    }
+    var currentTarget = this.currentTarget;
+    var target = this.target;
+    var matchedTarget;
+    do {
+      if (target.matches(_selector)) return target;
+      target = target.parent;
+    } while (target != null && target != currentTarget.parent);
+    throw new StateError('No selector matched for populating matchedTarget.');
+  }
+
+  /**
+   * This event's path, taking into account shadow DOM.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM extensions to Event]
+   * (http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event) from
+   * W3C.
+   */
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
+  @Experimental()
+  List<Node> get path => wrapped.path;
+}
+// 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.
+
+
 _wrapZone(callback(arg)) {
   // For performance reasons avoid wrapping if we are in the root zone.
   if (Zone.current == Zone.ROOT) return callback;
@@ -37630,12 +37547,22 @@
   /**
    * Header passed in from the Dartium Developer Tools when an expression is
    * evaluated in the console as opposed to the watch window or another context
-   * that does not expect REPL support.
+   * that does not expect REPL support in Dartium 34.
    */
-  static const _CONSOLE_API_SUPPORT_HEADER =
+  static const _CONSOLE_API_SUPPORT_HEADER_34 =
       'with ((console && console._commandLineAPI) || { __proto__: null }) {\n';
+  /**
+   * Header passed in from the Dartium Developer Tools when an expression is
+   * evaluated in the console as opposed to the watch window or another context
+   * that does not expect REPL support in Dartium 35.
+   */
+  static const _CONSOLE_API_SUPPORT_HEADER_35 =
+      'with (__commandLineAPI || { __proto__: null }) {\n';
+
+
   static bool expectsConsoleApi(String expression) {
-    return expression.indexOf(_CONSOLE_API_SUPPORT_HEADER) == 0;;
+    return expression.indexOf(_CONSOLE_API_SUPPORT_HEADER_34) == 0 ||
+        expression.indexOf(_CONSOLE_API_SUPPORT_HEADER_35) == 0;
   }
 
   /**
@@ -37650,7 +37577,7 @@
    * For example:
    * <code>
    * _consoleTempVariables = {'a' : someValue, 'b': someOtherValue}
-   * wrapExpressionAsClosure("${_CONSOLE_API_SUPPORT_HEADER}foo + bar + a",
+   * wrapExpressionAsClosure("${_CONSOLE_API_SUPPORT_HEADER35}foo + bar + a",
    *                         ["bar", 40, "foo", 2])
    * </code>
    * will return:
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index 2d51aed..c39811e 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -34,6 +34,21 @@
       [bool lowerOpen = false, bool upperOpen = false]) =>
       KeyRange.bound_(lower, upper, lowerOpen, upperOpen);
 }
+// FIXME: Can we make this private?
+const indexed_dbBlinkMap = const {
+  'IDBCursor': Cursor,
+  'IDBCursorWithValue': CursorWithValue,
+  'IDBDatabase': Database,
+  'IDBFactory': IdbFactory,
+  'IDBIndex': Index,
+  'IDBKeyRange': KeyRange,
+  'IDBObjectStore': ObjectStore,
+  'IDBOpenDBRequest': OpenDBRequest,
+  'IDBRequest': Request,
+  'IDBTransaction': Transaction,
+  'IDBVersionChangeEvent': VersionChangeEvent,
+
+};
 // 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.
@@ -237,18 +252,6 @@
   @DocsEditable()
   Transaction transactionStores(List<String> storeNames, String mode) => _blink.Native_IDBDatabase_transactionStores_Callback(this, storeNames, mode);
 
-  @DomName('IDBDatabase.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_IDBDatabase_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('IDBDatabase.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_IDBDatabase_dispatchEvent_Callback(this, event);
-
-  @DomName('IDBDatabase.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_IDBDatabase_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `abort` events handled by this [Database].
   @DomName('IDBDatabase.onabort')
   @DocsEditable()
@@ -927,18 +930,6 @@
   @DocsEditable()
   Transaction get transaction => _blink.Native_IDBRequest_transaction_Getter(this);
 
-  @DomName('IDBRequest.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_IDBRequest_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('IDBRequest.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_IDBRequest_dispatchEvent_Callback(this, event);
-
-  @DomName('IDBRequest.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_IDBRequest_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `error` events handled by this [Request].
   @DomName('IDBRequest.onerror')
   @DocsEditable()
@@ -1040,18 +1031,6 @@
   @DocsEditable()
   ObjectStore objectStore(String name) => _blink.Native_IDBTransaction_objectStore_Callback(this, name);
 
-  @DomName('IDBTransaction.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_IDBTransaction_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('IDBTransaction.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_IDBTransaction_dispatchEvent_Callback(this, event);
-
-  @DomName('IDBTransaction.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_IDBTransaction_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `abort` events handled by this [Transaction].
   @DomName('IDBTransaction.onabort')
   @DocsEditable()
diff --git a/sdk/lib/io/directory.dart b/sdk/lib/io/directory.dart
index e977d2f..eecaa68 100644
--- a/sdk/lib/io/directory.dart
+++ b/sdk/lib/io/directory.dart
@@ -118,9 +118,13 @@
   final String path;
 
   /**
-   * Creates a directory object. The path is either an absolute path,
-   * or it is a relative path which is interpreted relative to the directory
-   * in which the Dart VM was started.
+   * Creates a [Directory] object.
+   *
+   * If [path] is a relative path, it will be interpreted relative to the
+   * current working directory (see [Directory.current]), when used.
+   *
+   * If [path] is an absolute path, it will be immune to changes to the
+   * current working directory.
    */
   factory Directory(String path) => new _Directory(path);
 
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index b8df149..979d6f6 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -175,7 +175,13 @@
  */
 abstract class File extends FileSystemEntity {
   /**
-   * Create a File object.
+   * Creates a [File] object.
+   *
+   * If [path] is a relative path, it will be interpreted relative to the
+   * current working directory (see [Directory.current]), when used.
+   *
+   * If [path] is an absolute path, it will be immune to changes to the
+   * current working directory.
    */
   factory File(String path) => new _File(path);
 
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index 371543f..21b177d 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -94,9 +94,9 @@
  * Use [bindSecure] to create an HTTPS server.
  *
  * The server presents a certificate to the client. In the following
- * example, the certificate is named `localhost_cert` and comes from 
+ * example, the certificate is named `localhost_cert` and comes from
  * the database found in the `pkcert` directory.
- * 
+ *
  *     import 'dart:io';
  *     import "dart:isolate";
  *
@@ -145,7 +145,7 @@
  * * HttpServer is a Stream. Refer to the [Stream] class for information
  * about the streaming qualities of an HttpServer.
  * Pausing the subscription of the stream, pauses at the OS level.
- * 
+ *
  * * The [http_server](https://pub.dartlang.org/packages/http_server)
  * package on pub.dartlang.org contains a set of high-level classes that,
  * together with this class, makes it easy to provide content through HTTP
@@ -153,11 +153,13 @@
  */
 abstract class HttpServer implements Stream<HttpRequest> {
   /**
-   * Set and get the default value of the `Server` header for all responses
-   * generated by this [HttpServer]. By default, it's disabled.
+   * Get and set the default value of the `Server` header for all responses
+   * generated by this [HttpServer].
    *
-   * If the serverHeader is set to `null`, no default `Server` header will be
-   * added to each response.
+   * If [serverHeader] is `null`, no `Server` header will be added to each
+   * response.
+   *
+   * The default value is `null`.
    */
   String serverHeader;
 
@@ -987,7 +989,7 @@
  * The server sends its response to the client by writing to the
  * HttpResponse object.
  *
- * ## Writing the response 
+ * ## Writing the response
  *
  * This class implements [IOSink].
  * After the header has been set up, the methods
diff --git a/sdk/lib/io/http_date.dart b/sdk/lib/io/http_date.dart
index 94a3298..9bf8197 100644
--- a/sdk/lib/io/http_date.dart
+++ b/sdk/lib/io/http_date.dart
@@ -46,6 +46,7 @@
     StringBuffer sb = new StringBuffer()
         ..write(wkday[d.weekday - 1])
         ..write(", ")
+        ..write(d.day <= 9 ? "0" : "")
         ..write(d.day.toString())
         ..write(" ")
         ..write(month[d.month - 1])
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index 2bd28a9..70b81b1 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -1359,6 +1359,7 @@
               .then((incoming) {
                 _currentUri = null;
                 incoming.dataDone.then((closing) {
+                  if (closed) return;
                   if (!closing &&
                       !_dispose &&
                       incoming.headers.persistentConnection &&
@@ -1502,13 +1503,11 @@
 
 
 class _HttpClient implements HttpClient {
-  // TODO(ajohnsen): Use eviction timeout.
   bool _closing = false;
-
   final Map<String, Set<_HttpClientConnection>> _idleConnections
       = new HashMap<String, Set<_HttpClientConnection>>();
-  final Set<_HttpClientConnection> _activeConnections
-      = new HashSet<_HttpClientConnection>();
+  final Map<String, Set<_HttpClientConnection>> _activeConnections
+      = new HashMap<String, Set<_HttpClientConnection>>();
   final List<_Credentials> _credentials = [];
   final List<_ProxyCredentials> _proxyCredentials = [];
   Function _authenticate;
@@ -1599,7 +1598,8 @@
     });
     assert(_idleConnections.isEmpty);
     if (force) {
-      for (var connection in _activeConnections.toList()) {
+      for (var connection in
+           _activeConnections.values.expand((s) => s).toList()) {
         connection.destroy();
       }
       assert(_activeConnections.isEmpty);
@@ -1703,15 +1703,18 @@
 
   // Return a live connection to the idle pool.
   void _returnConnection(_HttpClientConnection connection) {
-    _activeConnections.remove(connection);
+    var key = connection.key;
+    _activeConnections[key].remove(connection);
+    if (_activeConnections[key].isEmpty) {
+      _activeConnections.remove(key);
+    }
     if (_closing) {
       connection.close();
       return;
     }
-    if (!_idleConnections.containsKey(connection.key)) {
-      _idleConnections[connection.key] = new HashSet();
-    }
-    _idleConnections[connection.key].add(connection);
+    _idleConnections
+        .putIfAbsent(key, () => new HashSet())
+        .add(connection);
     connection.startTimer();
     _updateTimers();
   }
@@ -1719,11 +1722,17 @@
   // Remove a closed connnection from the active set.
   void _connectionClosed(_HttpClientConnection connection) {
     connection.stopTimer();
-    _activeConnections.remove(connection);
-    if (_idleConnections.containsKey(connection.key)) {
-      _idleConnections[connection.key].remove(connection);
-      if (_idleConnections[connection.key].isEmpty) {
-        _idleConnections.remove(connection.key);
+    var key = connection.key;
+    if (_activeConnections.containsKey(key)) {
+      _activeConnections[key].remove(connection);
+      if (_activeConnections[key].isEmpty) {
+        _activeConnections.remove(key);
+      }
+    }
+    if (_idleConnections.containsKey(key)) {
+      _idleConnections[key].remove(connection);
+      if (_idleConnections[key].isEmpty) {
+        _idleConnections.remove(key);
       }
     }
     _updateTimers();
@@ -1767,7 +1776,9 @@
           _idleConnections.remove(key);
         }
         connection.stopTimer();
-        _activeConnections.add(connection);
+        _activeConnections
+            .putIfAbsent(key, () => new HashSet())
+            .add(connection);
         _updateTimers();
         return new Future.value(new _ConnnectionInfo(connection, proxy));
       }
@@ -1789,11 +1800,15 @@
             return connection.createProxyTunnel(
                 uriHost, uriPort, proxy, callback)
                 .then((tunnel) {
-                  _activeConnections.add(tunnel);
+                  _activeConnections
+                      .putIfAbsent(tunnel.key, () => new HashSet())
+                      .add(tunnel);
                   return new _ConnnectionInfo(tunnel, proxy);
                 });
           } else {
-            _activeConnections.add(connection);
+            _activeConnections
+                .putIfAbsent(key, () => new HashSet())
+                .add(connection);
             return new _ConnnectionInfo(connection, proxy);
           }
         }, onError: (error) {
diff --git a/sdk/lib/io/link.dart b/sdk/lib/io/link.dart
index 13c1869..eb65ac8 100644
--- a/sdk/lib/io/link.dart
+++ b/sdk/lib/io/link.dart
@@ -15,9 +15,13 @@
   factory Link(String path) => new _Link(path);
 
   /**
-   * Create a Lint object from a URI.
+   * Creates a [Link] object.
    *
-   * If [uri] cannot reference a link this throws [UnsupportedError].
+   * If [path] is a relative path, it will be interpreted relative to the
+   * current working directory (see [Directory.current]), when used.
+   *
+   * If [path] is an absolute path, it will be immune to changes to the
+   * current working directory.
    */
   factory Link.fromUri(Uri uri) => new Link(uri.toFilePath());
 
diff --git a/sdk/lib/io/websocket_impl.dart b/sdk/lib/io/websocket_impl.dart
index 3e01210..475c8f4 100644
--- a/sdk/lib/io/websocket_impl.dart
+++ b/sdk/lib/io/websocket_impl.dart
@@ -865,6 +865,9 @@
           } else {
             _close(WebSocketStatus.PROTOCOL_ERROR);
           }
+          // An error happened, set the close code set above.
+          _closeCode = _outCloseCode;
+          _closeReason = _outCloseReason;
           _controller.close();
         },
         onDone: () {
@@ -878,6 +881,7 @@
             }
             _readyState = WebSocket.CLOSED;
           }
+          // Protocol close, use close code from transformer.
           _closeCode = transformer.closeCode;
           _closeReason = transformer.closeReason;
           _controller.close();
@@ -942,6 +946,9 @@
     if (_closeTimer == null && !_controller.isClosed) {
       // When closing the web-socket, we no longer accept data.
       _closeTimer = new Timer(const Duration(seconds: 5), () {
+        // Reuse code and reason from the local close.
+        _closeCode = _outCloseCode;
+        _closeReason = _outCloseReason;
         _subscription.cancel();
         _controller.close();
       });
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 65f0bcee..4a4a104 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -47,6 +47,7 @@
    * Capability granting the ability to pause the isolate.
    */
   final Capability pauseCapability;
+
   /**
    * Capability granting the ability to terminate the isolate.
    */
@@ -298,6 +299,80 @@
         ..[2] = pingType;
     controlPort.send(message);
   }
+
+  /**
+   * Requests that uncaught errors of the isolate are sent back to [port].
+   *
+   * The errors are sent back as two elements lists.
+   * The first element is a `String` representation of the error, usually
+   * created by calling `toString` on the error.
+   * The second element is a `String` representation of an accompanying
+   * stack trace, or `null` if no stack trace was provided.
+   *
+   * Listening using the same port more than once does nothing. It will only
+   * get each error once.
+   */
+  void addErrorListener(SendPort port) {
+    var message = new List(2)
+        ..[0] = "getErrors"
+        ..[1] = port;
+    controlPort.send(message);
+  }
+
+  /**
+   * Stop listening for uncaught errors through [port].
+   *
+   * The `port` should be a port that is listening for errors through
+   * [addErrorListener]. This call requests that the isolate stops sending
+   * errors on the port.
+   *
+   * If the same port has been passed via `addErrorListener` more than once,
+   * only one call to `removeErrorListener` is needed to stop it from receiving
+   * errors.
+   *
+   * Closing the receive port at the end of the send port will not stop the
+   * isolate from sending errors, they are just going to be lost.
+   */
+  void removeErrorListener(SendPort port) {
+    var message = new List(2)
+        ..[0] = "stopErrors"
+        ..[1] = port;
+    controlPort.send(message);
+  }
+
+  /**
+   * Returns a broadcast stream of uncaught errors from the isolate.
+   *
+   * Each error is provided as an error event on the stream.
+   *
+   * The actual error object and stackTraces will not necessarily
+   * be the same object types as in the actual isolate, but they will
+   * always have the same [Object.toString] result.
+   *
+   * This stream is based on [addErrorListener] and [removeErrorListener].
+   */
+  Stream get errors {
+    StreamController controller;
+    RawReceivePort port;
+    void handleError(message) {
+      String errorDescription = message[0];
+      String stackDescription = message[1];
+      var error = new RemoteError(errorDescription, stackDescription);
+      controller.addError(error, error.stackTrace);
+    }
+    controller = new StreamController.broadcast(
+        sync: true,
+        onListen: () {
+          port = new RawReceivePort(handleError);
+          this.addErrorListener(port.sendPort);
+        },
+        onCancel: () {
+          this.removeErrorListener(port.sendPort);
+          port.close();
+          port = null;
+        });
+    return controller.stream;
+  }
 }
 
 /**
@@ -464,3 +539,24 @@
         '${stackTrace.toString().replaceAll("\n","\n  ")}';
   }
 }
+
+/**
+ * Description of an error from another isolate.
+ *
+ * This error has the same `toString()` and `stackTrace.toString()` behavior
+ * as the original error, but has no other features of the original error.
+ */
+class RemoteError implements Error {
+  final String _description;
+  final StackTrace stackTrace;
+  RemoteError(String description, String stackDescription)
+      : _description = description,
+        stackTrace = new _RemoteStackTrace(stackDescription);
+  String toString() => _description;
+}
+
+class _RemoteStackTrace implements StackTrace {
+  String _trace;
+  _RemoteStackTrace(this._trace);
+  String toString() => _trace;
+}
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index 43b7224..d36bb4d 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -14,6 +14,154 @@
 
 
 
+// FIXME: Can we make this private?
+const svgBlinkMap = const {
+  'SVGAElement': AElement,
+  'SVGAltGlyphDefElement': _SVGAltGlyphDefElement,
+  'SVGAltGlyphElement': AltGlyphElement,
+  'SVGAltGlyphItemElement': _SVGAltGlyphItemElement,
+  'SVGAngle': Angle,
+  'SVGAnimateElement': AnimateElement,
+  'SVGAnimateMotionElement': AnimateMotionElement,
+  'SVGAnimateTransformElement': AnimateTransformElement,
+  'SVGAnimatedAngle': AnimatedAngle,
+  'SVGAnimatedBoolean': AnimatedBoolean,
+  'SVGAnimatedEnumeration': AnimatedEnumeration,
+  'SVGAnimatedInteger': AnimatedInteger,
+  'SVGAnimatedLength': AnimatedLength,
+  'SVGAnimatedLengthList': AnimatedLengthList,
+  'SVGAnimatedNumber': AnimatedNumber,
+  'SVGAnimatedNumberList': AnimatedNumberList,
+  'SVGAnimatedPreserveAspectRatio': AnimatedPreserveAspectRatio,
+  'SVGAnimatedRect': AnimatedRect,
+  'SVGAnimatedString': AnimatedString,
+  'SVGAnimatedTransformList': AnimatedTransformList,
+  'SVGAnimationElement': AnimationElement,
+  'SVGCircleElement': CircleElement,
+  'SVGClipPathElement': ClipPathElement,
+  'SVGComponentTransferFunctionElement': _SVGComponentTransferFunctionElement,
+  'SVGCursorElement': _SVGCursorElement,
+  'SVGDefsElement': DefsElement,
+  'SVGDescElement': DescElement,
+  'SVGDiscardElement': DiscardElement,
+  'SVGElement': SvgElement,
+  'SVGElementInstance': ElementInstance,
+  'SVGElementInstanceList': _ElementInstanceList,
+  'SVGEllipseElement': EllipseElement,
+  'SVGFEBlendElement': FEBlendElement,
+  'SVGFEColorMatrixElement': FEColorMatrixElement,
+  'SVGFEComponentTransferElement': FEComponentTransferElement,
+  'SVGFECompositeElement': FECompositeElement,
+  'SVGFEConvolveMatrixElement': FEConvolveMatrixElement,
+  'SVGFEDiffuseLightingElement': FEDiffuseLightingElement,
+  'SVGFEDisplacementMapElement': FEDisplacementMapElement,
+  'SVGFEDistantLightElement': FEDistantLightElement,
+  'SVGFEDropShadowElement': _SVGFEDropShadowElement,
+  'SVGFEFloodElement': FEFloodElement,
+  'SVGFEFuncAElement': FEFuncAElement,
+  'SVGFEFuncBElement': FEFuncBElement,
+  'SVGFEFuncGElement': FEFuncGElement,
+  'SVGFEFuncRElement': FEFuncRElement,
+  'SVGFEGaussianBlurElement': FEGaussianBlurElement,
+  'SVGFEImageElement': FEImageElement,
+  'SVGFEMergeElement': FEMergeElement,
+  'SVGFEMergeNodeElement': FEMergeNodeElement,
+  'SVGFEMorphologyElement': FEMorphologyElement,
+  'SVGFEOffsetElement': FEOffsetElement,
+  'SVGFEPointLightElement': FEPointLightElement,
+  'SVGFESpecularLightingElement': FESpecularLightingElement,
+  'SVGFESpotLightElement': FESpotLightElement,
+  'SVGFETileElement': FETileElement,
+  'SVGFETurbulenceElement': FETurbulenceElement,
+  'SVGFilterElement': FilterElement,
+  'SVGFilterPrimitiveStandardAttributes': FilterPrimitiveStandardAttributes,
+  'SVGFitToViewBox': FitToViewBox,
+  'SVGFontElement': _SVGFontElement,
+  'SVGFontFaceElement': _SVGFontFaceElement,
+  'SVGFontFaceFormatElement': _SVGFontFaceFormatElement,
+  'SVGFontFaceNameElement': _SVGFontFaceNameElement,
+  'SVGFontFaceSrcElement': _SVGFontFaceSrcElement,
+  'SVGFontFaceUriElement': _SVGFontFaceUriElement,
+  'SVGForeignObjectElement': ForeignObjectElement,
+  'SVGGElement': GElement,
+  'SVGGeometryElement': GeometryElement,
+  'SVGGlyphElement': _SVGGlyphElement,
+  'SVGGlyphRefElement': _SVGGlyphRefElement,
+  'SVGGradientElement': _GradientElement,
+  'SVGGraphicsElement': GraphicsElement,
+  'SVGHKernElement': _SVGHKernElement,
+  'SVGImageElement': ImageElement,
+  'SVGLength': Length,
+  'SVGLengthList': LengthList,
+  'SVGLineElement': LineElement,
+  'SVGLinearGradientElement': LinearGradientElement,
+  'SVGMPathElement': _SVGMPathElement,
+  'SVGMarkerElement': MarkerElement,
+  'SVGMaskElement': MaskElement,
+  'SVGMatrix': Matrix,
+  'SVGMetadataElement': MetadataElement,
+  'SVGMissingGlyphElement': _SVGMissingGlyphElement,
+  'SVGNumber': Number,
+  'SVGNumberList': NumberList,
+  'SVGPathElement': PathElement,
+  'SVGPathSeg': PathSeg,
+  'SVGPathSegArcAbs': PathSegArcAbs,
+  'SVGPathSegArcRel': PathSegArcRel,
+  'SVGPathSegClosePath': PathSegClosePath,
+  'SVGPathSegCurvetoCubicAbs': PathSegCurvetoCubicAbs,
+  'SVGPathSegCurvetoCubicRel': PathSegCurvetoCubicRel,
+  'SVGPathSegCurvetoCubicSmoothAbs': PathSegCurvetoCubicSmoothAbs,
+  'SVGPathSegCurvetoCubicSmoothRel': PathSegCurvetoCubicSmoothRel,
+  'SVGPathSegCurvetoQuadraticAbs': PathSegCurvetoQuadraticAbs,
+  'SVGPathSegCurvetoQuadraticRel': PathSegCurvetoQuadraticRel,
+  'SVGPathSegCurvetoQuadraticSmoothAbs': PathSegCurvetoQuadraticSmoothAbs,
+  'SVGPathSegCurvetoQuadraticSmoothRel': PathSegCurvetoQuadraticSmoothRel,
+  'SVGPathSegLinetoAbs': PathSegLinetoAbs,
+  'SVGPathSegLinetoHorizontalAbs': PathSegLinetoHorizontalAbs,
+  'SVGPathSegLinetoHorizontalRel': PathSegLinetoHorizontalRel,
+  'SVGPathSegLinetoRel': PathSegLinetoRel,
+  'SVGPathSegLinetoVerticalAbs': PathSegLinetoVerticalAbs,
+  'SVGPathSegLinetoVerticalRel': PathSegLinetoVerticalRel,
+  'SVGPathSegList': PathSegList,
+  'SVGPathSegMovetoAbs': PathSegMovetoAbs,
+  'SVGPathSegMovetoRel': PathSegMovetoRel,
+  'SVGPatternElement': PatternElement,
+  'SVGPoint': Point,
+  'SVGPointList': PointList,
+  'SVGPolygonElement': PolygonElement,
+  'SVGPolylineElement': PolylineElement,
+  'SVGPreserveAspectRatio': PreserveAspectRatio,
+  'SVGRadialGradientElement': RadialGradientElement,
+  'SVGRect': Rect,
+  'SVGRectElement': RectElement,
+  'SVGRenderingIntent': RenderingIntent,
+  'SVGSVGElement': SvgSvgElement,
+  'SVGScriptElement': ScriptElement,
+  'SVGSetElement': SetElement,
+  'SVGStopElement': StopElement,
+  'SVGStringList': StringList,
+  'SVGStyleElement': StyleElement,
+  'SVGSwitchElement': SwitchElement,
+  'SVGSymbolElement': SymbolElement,
+  'SVGTSpanElement': TSpanElement,
+  'SVGTests': Tests,
+  'SVGTextContentElement': TextContentElement,
+  'SVGTextElement': TextElement,
+  'SVGTextPathElement': TextPathElement,
+  'SVGTextPositioningElement': TextPositioningElement,
+  'SVGTitleElement': TitleElement,
+  'SVGTransform': Transform,
+  'SVGTransformList': TransformList,
+  'SVGURIReference': UriReference,
+  'SVGUnitTypes': UnitTypes,
+  'SVGUseElement': UseElement,
+  'SVGVKernElement': _SVGVKernElement,
+  'SVGViewElement': ViewElement,
+  'SVGViewSpec': ViewSpec,
+  'SVGZoomAndPan': ZoomAndPan,
+  'SVGZoomEvent': ZoomEvent,
+
+};
 // Copyright (c) 2012, 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.
@@ -1250,21 +1398,6 @@
   @DocsEditable()
   ElementInstance get previousSibling => _blink.Native_SVGElementInstance_previousSibling_Getter(this);
 
-  @DomName('SVGElementInstance.addEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SVGElementInstance_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('SVGElementInstance.dispatchEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool dispatchEvent(Event event) => _blink.Native_SVGElementInstance_dispatchEvent_Callback(this, event);
-
-  @DomName('SVGElementInstance.removeEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SVGElementInstance_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `abort` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onabort')
   @DocsEditable()
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index a88c32f..10748a5 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -14,6 +14,37 @@
 
 
 
+// FIXME: Can we make this private?
+const web_audioBlinkMap = const {
+  'AnalyserNode': AnalyserNode,
+  'AudioBuffer': AudioBuffer,
+  'AudioBufferSourceNode': AudioBufferSourceNode,
+  'AudioContext': AudioContext,
+  'AudioDestinationNode': AudioDestinationNode,
+  'AudioListener': AudioListener,
+  'AudioNode': AudioNode,
+  'AudioParam': AudioParam,
+  'AudioProcessingEvent': AudioProcessingEvent,
+  'AudioSourceNode': AudioSourceNode,
+  'BiquadFilterNode': BiquadFilterNode,
+  'ChannelMergerNode': ChannelMergerNode,
+  'ChannelSplitterNode': ChannelSplitterNode,
+  'ConvolverNode': ConvolverNode,
+  'DelayNode': DelayNode,
+  'DynamicsCompressorNode': DynamicsCompressorNode,
+  'GainNode': GainNode,
+  'MediaElementAudioSourceNode': MediaElementAudioSourceNode,
+  'MediaStreamAudioDestinationNode': MediaStreamAudioDestinationNode,
+  'MediaStreamAudioSourceNode': MediaStreamAudioSourceNode,
+  'OfflineAudioCompletionEvent': OfflineAudioCompletionEvent,
+  'OfflineAudioContext': OfflineAudioContext,
+  'OscillatorNode': OscillatorNode,
+  'PannerNode': PannerNode,
+  'PeriodicWave': PeriodicWave,
+  'ScriptProcessorNode': ScriptProcessorNode,
+  'WaveShaperNode': WaveShaperNode,
+
+};
 // Copyright (c) 2012, 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.
@@ -376,21 +407,6 @@
   @DocsEditable()
   void startRendering() => _blink.Native_AudioContext_startRendering_Callback(this);
 
-  @DomName('AudioContext.addEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_AudioContext_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('AudioContext.dispatchEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  bool dispatchEvent(Event event) => _blink.Native_AudioContext_dispatchEvent_Callback(this, event);
-
-  @DomName('AudioContext.removeEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_AudioContext_removeEventListener_Callback(this, type, listener, useCapture);
-
   /// Stream of `complete` events handled by this [AudioContext].
   @DomName('AudioContext.oncomplete')
   @DocsEditable()
@@ -529,18 +545,6 @@
   @DocsEditable()
   void disconnect(int output) => _blink.Native_AudioNode_disconnect_Callback(this, output);
 
-  @DomName('AudioNode.addEventListener')
-  @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_AudioNode_addEventListener_Callback(this, type, listener, useCapture);
-
-  @DomName('AudioNode.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_AudioNode_dispatchEvent_Callback(this, event);
-
-  @DomName('AudioNode.removeEventListener')
-  @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_AudioNode_removeEventListener_Callback(this, type, listener, useCapture);
-
   @DomName('AudioNode.connect')
   void connectNode(AudioNode destination, [int output = 0, int input = 0]) =>
       _connect(destination, output, input);
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index 4b55e83..2c2de6c 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -15,6 +15,41 @@
 
 
 
+// FIXME: Can we make this private?
+const web_glBlinkMap = const {
+  'ANGLEInstancedArrays': AngleInstancedArrays,
+  'EXTFragDepth': ExtFragDepth,
+  'EXTTextureFilterAnisotropic': ExtTextureFilterAnisotropic,
+  'OESElementIndexUint': OesElementIndexUint,
+  'OESStandardDerivatives': OesStandardDerivatives,
+  'OESTextureFloat': OesTextureFloat,
+  'OESTextureFloatLinear': OesTextureFloatLinear,
+  'OESTextureHalfFloat': OesTextureHalfFloat,
+  'OESTextureHalfFloatLinear': OesTextureHalfFloatLinear,
+  'OESVertexArrayObject': OesVertexArrayObject,
+  'WebGLActiveInfo': ActiveInfo,
+  'WebGLBuffer': Buffer,
+  'WebGLCompressedTextureATC': CompressedTextureAtc,
+  'WebGLCompressedTexturePVRTC': CompressedTexturePvrtc,
+  'WebGLCompressedTextureS3TC': CompressedTextureS3TC,
+  'WebGLContextAttributes': ContextAttributes,
+  'WebGLContextEvent': ContextEvent,
+  'WebGLDebugRendererInfo': DebugRendererInfo,
+  'WebGLDebugShaders': DebugShaders,
+  'WebGLDepthTexture': DepthTexture,
+  'WebGLDrawBuffers': DrawBuffers,
+  'WebGLFramebuffer': Framebuffer,
+  'WebGLLoseContext': LoseContext,
+  'WebGLProgram': Program,
+  'WebGLRenderbuffer': Renderbuffer,
+  'WebGLRenderingContext': RenderingContext,
+  'WebGLShader': Shader,
+  'WebGLShaderPrecisionFormat': ShaderPrecisionFormat,
+  'WebGLTexture': Texture,
+  'WebGLUniformLocation': UniformLocation,
+  'WebGLVertexArrayObjectOES': VertexArrayObject,
+
+};
 // 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.
diff --git a/sdk/lib/web_sql/dartium/web_sql_dartium.dart b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
index 992c41e..968b7c7 100644
--- a/sdk/lib/web_sql/dartium/web_sql_dartium.dart
+++ b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
@@ -24,6 +24,16 @@
 
 
 
+// FIXME: Can we make this private?
+const web_sqlBlinkMap = const {
+  'Database': SqlDatabase,
+  'SQLError': SqlError,
+  'SQLResultSet': SqlResultSet,
+  'SQLResultSetRowList': SqlResultSetRowList,
+  'SQLTransaction': SqlTransaction,
+  'SQLTransactionSync': _SQLTransactionSync,
+
+};
 // Copyright (c) 2012, 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.
diff --git a/site/try/index.html b/site/try/index.html
index 4e5805c..6d6fecb 100644
--- a/site/try/index.html
+++ b/site/try/index.html
@@ -20,22 +20,21 @@
 <link rel="alternate stylesheet" type="text/css" href="line_numbers.css" title="line_numbers">
 <style>
 a.diagnostic {
-  /* position: relative; */
   color: inherit;
   border-bottom: 2px dotted red;
 }
 a:hover.diagnostic {
   text-decoration: none;
 }
-a.diagnostic span {
+a.diagnostic>span {
   display: none;
 }
-a:hover.diagnostic span {
+a:hover.diagnostic>span {
   display: block;
   position: absolute;
   /* left: 1em; */
   /* top: 2em; */
-  right: 10px;
+  right: 19px;
 }
 
 .offline {
@@ -50,10 +49,10 @@
 
 .dart-code-completion-holder {
   position: relative;
-  display: 'inline-block';
+  display: inline-block;
 }
 
-.dart-code-completion-holder *.dart-code-completion {
+.dart-code-completion-holder /deep/ *.dart-code-completion {
   display: none;
   position: absolute;
   left: 0px;
@@ -65,11 +64,11 @@
   padding-left: 5px;
 }
 
-.dart-code-completion-holder.active *.dart-code-completion {
+.dart-code-completion-holder.active /deep/ *.dart-code-completion {
   display: block;
 }
 
-.dart-static {
+body /deep/ .dart-static {
   width: 198px;
   overflow: auto;
 }
@@ -101,35 +100,35 @@
  * }
  */
 
-.dart-limited-height {
+body /deep/ .dart-limited-height {
   /* TODO(ahe): Make sure to compute this height to avoid jumping in the UI. */
   max-height: 66px;
 }
 
-.dart-server {
+body /deep/ .dart-server {
   width: 198px;
   border-top: 1px solid black;
 }
 
-.activeEntry {
+body /deep/ .activeEntry {
   background: #86b4bf;
 }
 
-.doubleplusgood {
+body /deep/ .doubleplusgood {
   font-weight: 700;
 }
 
-.dart-entry {
+body /deep/ .dart-entry {
   max-width: 198px;
   overflow: hidden;
   white-space: nowrap;
 }
 
-.hazed-suggestion {
+body /deep/ .hazed-suggestion {
   color: #aaa;
 }
 
-.hazed-suggestion:after {
+body /deep/ .hazed-suggestion:after {
   content: " ";
 }
 
@@ -151,14 +150,12 @@
 }
 
 .mainEditorPane {
-  overflow-y: auto;
-  overflow-x: hidden;
   white-space: pre;
-  max-height: 80vh;
+  /* Extra padding at the bottom to ensure display of error messages. */
+  padding: 19px 19px 70px 19px;
 }
 
 .lineNumber {
-  position: relative;
 }
 </style>
 
diff --git a/site/try/src/compilation.dart b/site/try/src/compilation.dart
index 1bc432d..d2cdbc6 100644
--- a/site/try/src/compilation.dart
+++ b/site/try/src/compilation.dart
@@ -35,7 +35,6 @@
 
 import 'settings.dart' show
     alwaysRunInWorker,
-    compilationPaused,
     minified,
     onlyAnalyze,
     verboseCompiler;
@@ -61,7 +60,6 @@
 const String PRIVATE_SCHEME = 'org-trydart';
 
 SendPort compilerPort;
-Timer compilerTimer;
 
 // TODO(ahe): Remove this.
 String get currentSource => window.localStorage['currentSource'];
@@ -70,23 +68,10 @@
   window.localStorage['currentSource'] = text;
 }
 
-void scheduleCompilation() {
-  if (compilationPaused) return;
-  if (compilerTimer != null) {
-    compilerTimer.cancel();
-    compilerTimer = null;
-  }
-  compilerTimer =
-      new Timer(const Duration(milliseconds: 500), startCompilation);
-}
-
-void startCompilation() {
-  if (compilerTimer != null) {
-    compilerTimer.cancel();
-    compilerTimer = null;
-  }
-
+bool startCompilation() {
+  if (!CompilationProcess.shouldStartCompilation()) return false;
   new CompilationProcess(currentSource, outputDiv).start();
+  return true;
 }
 
 class CompilationProcess {
@@ -119,13 +104,12 @@
   void start() {
     if (!shouldStartCompilation()) {
       receivePort.close();
-      if (!isMalformedInput) scheduleCompilation();
       return;
     }
     if (current != null) current.dispose();
     current = this;
     console.nodes.clear();
-    var options = [];
+    var options = ['--disable-type-inference'];
     if (verboseCompiler) options.add('--verbose');
     if (minified) options.add('--minify');
     if (onlyAnalyze) options.add('--analyze-only');
diff --git a/site/try/src/decoration.dart b/site/try/src/decoration.dart
index 381057f..930cbcb 100644
--- a/site/try/src/decoration.dart
+++ b/site/try/src/decoration.dart
@@ -6,6 +6,9 @@
 
 import 'dart:html';
 
+import 'shadow_root.dart' show
+    setShadowRoot;
+
 class Decoration {
   final String color;
   final bool bold;
@@ -70,35 +73,23 @@
   }
 }
 
-info(text) {
-  if (text is String) {
-    text = new Text(text);
+createAlert(text, [String cls]) {
+  var classes = ['alert'];
+  if (cls != null) {
+    classes.add(cls);
   }
-  return new SpanElement()
-      ..classes.addAll(['alert', 'alert-info'])
-      ..style.opacity = '0.75'
-      ..append(text);
+  SpanElement result = new SpanElement()
+      ..classes.addAll(classes)
+      ..style.opacity = '0.75';
+  setShadowRoot(result, text);
+  return result;
 }
 
-error(text) {
-  if (text is String) {
-    text = new Text(text);
-  }
-  return new SpanElement()
-      ..classes.addAll(['alert', 'alert-error'])
-      ..style.opacity = '0.75'
-      ..append(text);
-}
+info(text) => createAlert(text, 'alert-info');
 
-warning(text) {
-  if (text is String) {
-    text = new Text(text);
-  }
-  return new SpanElement()
-      ..classes.add('alert')
-      ..style.opacity = '0.75'
-      ..append(text);
-}
+error(text) => createAlert(text, 'alert-error');
+
+warning(text) => createAlert(text);
 
 class CodeCompletionDecoration extends Decoration {
   const CodeCompletionDecoration(
diff --git a/site/try/src/editor.dart b/site/try/src/editor.dart
index 9072ef8..db21ef9 100644
--- a/site/try/src/editor.dart
+++ b/site/try/src/editor.dart
@@ -30,12 +30,16 @@
 import 'selection.dart' show
     isCollapsed;
 
+import 'shadow_root.dart' show
+    getShadowRoot;
+
 const String INDENT = '\u{a0}\u{a0}';
 
 Set<String> seenIdentifiers;
 
-Element moveActive(int distance) {
-  List<Element> entries = document.querySelectorAll('.dart-static>.dart-entry');
+Element moveActive(int distance, Node ui) {
+  var /* ShadowRoot or Element */ root = getShadowRoot(ui);
+  List<Element> entries = root.querySelectorAll('.dart-static>.dart-entry');
   int activeIndex = -1;
   for (var i = 0; i < entries.length; i++) {
     if (entries[i].classes.contains('activeEntry')) {
@@ -52,10 +56,10 @@
   if (0 <= newIndex && activeIndex != -1) {
     entries[activeIndex].classes.remove('activeEntry');
   }
-  Element staticNode = document.querySelector('.dart-static');
+  Element staticNode = root.querySelector('.dart-static');
   String visibility = computeVisibility(currentEntry, staticNode);
   print(visibility);
-  var serverResults = document.querySelectorAll('.dart-server>.dart-entry');
+  var serverResults = root.querySelectorAll('.dart-server>.dart-entry');
   var serverResultCount = serverResults.length;
   if (serverResultCount > 0) {
     switch (visibility) {
@@ -73,10 +77,10 @@
       }
     }
   } else {
-    currentEntry.scrollIntoView(ScrollAlignment.BOTTOM);
+    currentEntry.scrollIntoView();
   }
   if (serverResultCount == 0) {
-    document.querySelector('.dart-server').style.display = 'none';
+    root.querySelector('.dart-server').style.display = 'none';
   }
   if (currentEntry != null) {
     currentEntry.classes.add('activeEntry');
diff --git a/site/try/src/html_to_text.dart b/site/try/src/html_to_text.dart
index f90ded6..aa8710d 100644
--- a/site/try/src/html_to_text.dart
+++ b/site/try/src/html_to_text.dart
@@ -11,6 +11,7 @@
     Element,
     Node,
     NodeFilter,
+    ShadowRoot,
     Text,
     TreeWalker;
 
@@ -21,6 +22,11 @@
 bool isBlockElement(Node node) {
   if (node is! Element) return false;
   Element element = node;
+
+  // TODO(ahe): Remove this line by changing code completion to avoid using a
+  // div element.
+  if (element.classes.contains('dart-code-completion')) return false;
+
   return element.getComputedStyle().display != 'inline';
 }
 
@@ -45,7 +51,10 @@
 /// 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].
-int htmlToText(Node root, StringBuffer buffer, TrySelection selection) {
+int htmlToText(Node root,
+               StringBuffer buffer,
+               TrySelection selection,
+               {bool treatRootAsInline: false}) {
   int selectionOffset = -1;
   TreeWalker walker = new TreeWalker(root, NodeFilter.SHOW_ALL);
 
@@ -61,7 +70,11 @@
         break;
 
       default:
-        if (node.nodeName == 'BR') {
+        if (!ShadowRoot.supported &&
+            node is Element &&
+            node.getAttribute('try-dart-shadow-root') != null) {
+          skip(node, walker);
+        } else if (node.nodeName == 'BR') {
           buffer.write('\n');
         } else if (node != root && isBlockElement(node)) {
           selectionOffset =
@@ -72,7 +85,7 @@
     }
   }
 
-  if (isBlockElement(root)) {
+  if (!treatRootAsInline && isBlockElement(root)) {
     buffer.write('\n');
   }
 
diff --git a/site/try/src/interaction_manager.dart b/site/try/src/interaction_manager.dart
index 4d4dd24..4e1d454 100644
--- a/site/try/src/interaction_manager.dart
+++ b/site/try/src/interaction_manager.dart
@@ -14,7 +14,12 @@
     min;
 
 import 'dart:async' show
-    Future;
+    Completer,
+    Future,
+    Timer;
+
+import 'dart:collection' show
+    Queue;
 
 import 'package:compiler/implementation/scanner/scannerlib.dart' show
     BeginGroupToken,
@@ -30,7 +35,7 @@
 
 import 'compilation.dart' show
     currentSource,
-    scheduleCompilation;
+    startCompilation;
 
 import 'ui.dart' show
     currentTheme,
@@ -64,10 +69,22 @@
 
 import 'settings.dart' as settings;
 
+import 'shadow_root.dart' show
+    getShadowRoot,
+    getText,
+    removeShadowRootPolyfill,
+    setShadowRoot;
+
 const String TRY_DART_NEW_DEFECT =
     'https://code.google.com/p/dart/issues/entry'
     '?template=Try+Dart+Internal+Error';
 
+const Duration HEARTBEAT_INTERVAL = const Duration(milliseconds: 500);
+
+const Duration SAVE_INTERVAL = const Duration(seconds: 5);
+
+const Duration COMPILE_INTERVAL = const Duration(seconds: 1);
+
 /**
  * UI interaction manager for the entire application.
  */
@@ -77,7 +94,7 @@
   //
   // Simplicity in UI is in the eye of the beholder, not the implementor. Great
   // 'natural UI' is usually achieved with substantial implementation
-  // complexity that doesn't modularise well and has nasty complicated state
+  // complexity that doesn't modularize well and has nasty complicated state
   // dependencies.
   //
   // In rare cases, some UI components can be independent of this state
@@ -110,6 +127,9 @@
 
   /// Called when notified about a project file changed (on the server).
   void onProjectFileFsEvent(MessageEvent e);
+
+  /// Called every 500ms.
+  void onHeartbeat(Timer timer);
 }
 
 /**
@@ -120,15 +140,26 @@
 
   final Map<String, CompilationUnit> projectFiles = <String, CompilationUnit>{};
 
+  final Set<CompilationUnit> modifiedUnits = new Set<CompilationUnit>();
+
+  final Queue<CompilationUnit> unitsToSave = new Queue<CompilationUnit>();
+
+  final Stopwatch saveTimer = new Stopwatch();
+
+  final Stopwatch compileTimer = new Stopwatch();
+
   CompilationUnit currentCompilationUnit =
       // TODO(ahe): Don't use a fake unit.
       new CompilationUnit('fake', '');
 
-  CompilationUnit lastSaved;
+  Timer heartbeat;
+
+  Completer<String> completeSaveOperation;
 
   InteractionContext()
       : super.internal() {
     state = new InitialState(this);
+    heartbeat = new Timer.periodic(HEARTBEAT_INTERVAL, onHeartbeat);
   }
 
   void onInput(Event event) => state.onInput(event);
@@ -180,6 +211,8 @@
   void onProjectFileFsEvent(MessageEvent e) {
     return state.onProjectFileFsEvent(e);
   }
+
+  void onHeartbeat(Timer timer) => state.onHeartbeat(timer);
 }
 
 abstract class InteractionState implements InteractionManager {
@@ -257,8 +290,6 @@
       }
     }
 
-    // editor.scheduleRemoveCodeCompletion();
-
     // This is a hack to get Safari (iOS) to send mutation events on
     // contenteditable.
     // TODO(ahe): Move to onInput?
@@ -270,11 +301,7 @@
   void onMutation(List<MutationRecord> mutations, MutationObserver observer) {
     print('onMutation');
 
-    List<Node> highlighting = mainEditorPane.querySelectorAll(
-        'a.diagnostic>span, .dart-code-completion, .hazed-suggestion');
-    for (Element element in highlighting) {
-      element.remove();
-    }
+    removeCodeCompletion();
 
     Selection selection = window.getSelection();
     TrySelection trySelection = new TrySelection(mainEditorPane, selection);
@@ -289,9 +316,11 @@
       if (node is Element && node.classes.contains('lineNumber')) {
         print('Single line change: ${node.outerHtml}');
 
+        removeShadowRootPolyfill(node);
+
         String currentText = node.text;
 
-        trySelection = new TrySelection(node, selection);
+        trySelection = trySelection.copyWithRoot(node);
         trySelection.updateText(currentText);
 
         editor.isMalformedInput = false;
@@ -315,13 +344,17 @@
         node.remove();
         trySelection.adjust(selection);
 
+        // TODO(ahe): We know almost exactly what has changed.  It could be
+        // more efficient to only communicate what changed.
+        context.currentCompilationUnit.content = getText(mainEditorPane);
+
         // Discard highlighting mutations.
         observer.takeRecords();
         return;
       }
     }
 
-    String currentText = mainEditorPane.text;
+    String currentText = getText(mainEditorPane);
     trySelection.updateText(currentText);
 
     context.currentCompilationUnit.content = currentText;
@@ -355,33 +388,26 @@
 
   void onStateChanged(InteractionState previous) {
     super.onStateChanged(previous);
-    scheduleCompilation();
+    context.compileTimer
+        ..start()
+        ..reset();
   }
 
   void onCompilationUnitChanged(CompilationUnit unit) {
     if (unit == context.currentCompilationUnit) {
       currentSource = unit.content;
-      print("Saved source of '${unit.name}'");
       if (context.projectFiles.containsKey(unit.name)) {
         postProjectFileUpdate(unit);
       }
-      scheduleCompilation();
+      context.compileTimer.start();
     } else {
       print("Unexpected change to compilation unit '${unit.name}'.");
     }
   }
 
   void postProjectFileUpdate(CompilationUnit unit) {
-    context.lastSaved = unit;
-    onError(ProgressEvent event) {
-      HttpRequest request = event.target;
-      statusDiv.text = "Couldn't save '${unit.name}': ${request.responseText}";
-      context.lastSaved = null;
-    }
-    new HttpRequest()
-        ..open("POST", "/project/${unit.name}")
-        ..onError.listen(onError)
-        ..send(unit.content);
+    context.modifiedUnits.add(unit);
+    context.saveTimer.start();
   }
 
   Future<List<String>> projectFileNames() {
@@ -440,16 +466,67 @@
     List modified = map['modify'];
     if (modified == null) return;
     for (String name in modified) {
-      if (context.lastSaved != null && context.lastSaved.name == name) {
-        context.lastSaved = null;
-        continue;
-      }
-      if (context.currentCompilationUnit.name == name) {
-        mainEditorPane.contentEditable = 'false';
-        statusDiv.text = 'Modified on disk';
+      Completer completer = context.completeSaveOperation;
+      if (completer != null && !completer.isCompleted) {
+        completer.complete(name);
+      } else {
+        onUnexpectedServerModification(name);
       }
     }
   }
+
+  void onUnexpectedServerModification(String name) {
+    if (context.currentCompilationUnit.name == name) {
+      mainEditorPane.contentEditable = 'false';
+      statusDiv.text = 'Modified on disk';
+    }
+  }
+
+  void onHeartbeat(Timer timer) {
+    if (context.unitsToSave.isEmpty &&
+        context.saveTimer.elapsed > SAVE_INTERVAL) {
+      context.saveTimer
+          ..stop()
+          ..reset();
+      context.unitsToSave.addAll(context.modifiedUnits);
+      context.modifiedUnits.clear();
+      saveUnits();
+    }
+    if (!settings.compilationPaused &&
+        context.compileTimer.elapsed > COMPILE_INTERVAL) {
+      if (startCompilation()) {
+        context.compileTimer
+            ..stop()
+            ..reset();
+      }
+    }
+  }
+
+  void saveUnits() {
+    if (context.unitsToSave.isEmpty) return;
+    CompilationUnit unit = context.unitsToSave.removeFirst();
+    onError(ProgressEvent event) {
+      HttpRequest request = event.target;
+      statusDiv.text = "Couldn't save '${unit.name}': ${request.responseText}";
+      context.completeSaveOperation.complete(unit.name);
+    }
+    new HttpRequest()
+        ..open("POST", "/project/${unit.name}")
+        ..onError.listen(onError)
+        ..send(unit.content);
+    void setupCompleter() {
+      context.completeSaveOperation = new Completer<String>.sync();
+      context.completeSaveOperation.future.then((String name) {
+        if (name == unit.name) {
+          print("Saved source of '$name'");
+          saveUnits();
+        } else {
+          setupCompleter();
+        }
+      });
+    }
+    setupCompleter();
+  }
 }
 
 Future<String> getString(uri) {
@@ -521,6 +598,9 @@
       case KeyCode.ENTER:
         event.preventDefault();
         return endCompletion(acceptSuggestion: true);
+
+      case KeyCode.SPACE:
+        return endCompletion();
     }
   }
 
@@ -535,7 +615,7 @@
   }
 
   void move(int direction) {
-    Element element = editor.moveActive(direction);
+    Element element = editor.moveActive(direction, ui);
     if (element == null) return;
     var text = activeCompletion.firstChild;
     String prefix = "";
@@ -601,7 +681,7 @@
 
     num height = activeCompletion.getBoundingClientRect().height;
     activeCompletion.classes.add('active');
-    ui.nodes.clear();
+    Node root = getShadowRoot(ui);
 
     inline = new SpanElement()
         ..classes.add('hazed-suggestion');
@@ -615,7 +695,7 @@
     serverResults = new DivElement()
         ..style.display = 'none'
         ..classes.add('dart-server');
-    ui.nodes.addAll([staticResults, serverResults]);
+    root.nodes.addAll([staticResults, serverResults]);
     ui.style.top = '${height}px';
 
     staticResults.nodes.add(buildCompletionEntry(prefix));
@@ -632,10 +712,8 @@
         ..display = 'inline-block'
         ..minWidth = '${minWidth}px';
 
-    inline
-        ..nodes.clear()
-        ..appendText(suggestion.substring(prefix.length))
-        ..style.display = '';
+    setShadowRoot(inline, suggestion.substring(prefix.length));
+    inline.style.display = '';
 
     observer.takeRecords(); // Discard mutations.
   }
@@ -666,9 +744,7 @@
     serverResults.nodes.clear();
 
     if (inlineSuggestion != null && inlineSuggestion.startsWith(prefix)) {
-      inline
-          ..nodes.clear()
-          ..appendText(inlineSuggestion.substring(prefix.length));
+      setShadowRoot(inline, inlineSuggestion.substring(prefix.length));
     }
 
     List<String> results = editor.seenIdentifiers.where(
@@ -697,13 +773,14 @@
           if (!serverSuggestions.isEmpty) {
             updateInlineSuggestion(prefix, serverSuggestions.first);
           }
+          var root = getShadowRoot(ui);
           for (int i = 1; i < serverSuggestions.length; i++) {
             String completion = serverSuggestions[i];
             DivElement where = staticResults;
             int index = results.indexOf(completion);
             if (index != -1) {
-              List<Element> entries =
-                  document.querySelectorAll('.dart-static>.dart-entry');
+              List<Element> entries = root.querySelectorAll(
+                  '.dart-static>.dart-entry');
               entries[index].classes.add('doubleplusgood');
             } else {
               if (results.length > 3) {
@@ -843,11 +920,12 @@
                              Set<Node> normalizedNodes) {
   for (Node node in record.addedNodes) {
     if (node.parent == null) continue;
+    normalizedNodes.add(findLine(node));
+    if (node is Text) continue;
     StringBuffer buffer = new StringBuffer();
     int selectionOffset = htmlToText(node, buffer, selection);
     Text newNode = new Text('$buffer');
     node.replaceWith(newNode);
-    normalizedNodes.add(findLine(newNode));
     if (selectionOffset != -1) {
       selection.anchorNode = newNode;
       selection.anchorOffset = selectionOffset;
@@ -873,11 +951,6 @@
 }
 
 Element makeLine(List<Node> lineNodes, String state) {
-  // Using a div element here (anything with display=block) generally messes up
-  // editing and navigation.  We would like to use a block element here so
-  // error messages show as expected.  But no such luck.  Fortunately, there
-  // are strong indications that the current solution for displaying errors
-  // isn't good enough anyways.
   return new SpanElement()
       ..setAttribute('dart-state', state)
       ..nodes.addAll(lineNodes)
@@ -895,3 +968,11 @@
 List<String> splitLines(String text) {
   return text.split(new RegExp('^', multiLine: true));
 }
+
+void removeCodeCompletion() {
+  List<Node> highlighting =
+      mainEditorPane.querySelectorAll('.dart-code-completion');
+  for (Element element in highlighting) {
+    element.remove();
+  }
+}
diff --git a/site/try/src/samples.dart b/site/try/src/samples.dart
index f2807c6..260c66a 100644
--- a/site/try/src/samples.dart
+++ b/site/try/src/samples.dart
@@ -84,7 +84,7 @@
 import "dart:html";
 import "dart:math";
 
-const String ORANGE = "orange";
+const String SEED_COLOR = "orange";
 const int SEED_RADIUS = 2;
 const int SCALE_FACTOR = 4;
 const num TAU = PI * 2;
@@ -124,8 +124,8 @@
 void drawSeed(num x, num y) {
   context..beginPath()
          ..lineWidth = 2
-         ..fillStyle = ORANGE
-         ..strokeStyle = ORANGE
+         ..fillStyle = SEED_COLOR
+         ..strokeStyle = SEED_COLOR
          ..arc(x, y, SEED_RADIUS, 0, TAU, false)
          ..fill()
          ..closePath()
diff --git a/site/try/src/selection.dart b/site/try/src/selection.dart
index 7551b59..641eb74 100644
--- a/site/try/src/selection.dart
+++ b/site/try/src/selection.dart
@@ -26,6 +26,10 @@
       : anchorNode = isCollapsed(selection) ? selection.anchorNode : null,
         anchorOffset = isCollapsed(selection) ? selection.anchorOffset : -1;
 
+  TrySelection.empty(this.root)
+      : anchorNode = null,
+        anchorOffset = -1;
+
   Text addNodeFromSubstring(int start,
                             int end,
                             List<Node> nodes,
@@ -55,6 +59,12 @@
     globalOffset = computeGlobalOffset(root, anchorNode, anchorOffset);
   }
 
+  TrySelection copyWithRoot(Node root) {
+    return new TrySelection.empty(root)
+        ..anchorNode = anchorNode
+        ..anchorOffset = anchorOffset;
+  }
+
   /// Computes the global offset, that is, the offset from [root].
   static int computeGlobalOffset(Node root, Node anchorNode, int anchorOffset) {
     if (anchorOffset == -1) return -1;
diff --git a/site/try/src/shadow_root.dart b/site/try/src/shadow_root.dart
new file mode 100644
index 0000000..b14afc6
--- /dev/null
+++ b/site/try/src/shadow_root.dart
@@ -0,0 +1,55 @@
+// 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 trydart.shadow_root;
+
+import 'dart:html';
+
+import 'selection.dart' show
+    TrySelection;
+
+import 'html_to_text.dart' show
+    htmlToText;
+
+void setShadowRoot(Element node, text) {
+  if (text is String) {
+    text = new Text(text);
+  }
+  getShadowRoot(node)
+      ..nodes.clear()
+      ..append(text);
+}
+
+
+/* ShadowRoot or Element */ getShadowRoot(Element node) {
+  if (ShadowRoot.supported) {
+    ShadowRoot root = node.shadowRoot;
+    return root != null ? root : node.createShadowRoot();
+  } else {
+    Element root = node.querySelector('[try-dart-shadow-root]');
+    if (root == null) {
+      root = new SpanElement()
+          ..setAttribute('try-dart-shadow-root', '');
+      node.append(root);
+    }
+    return root;
+  }
+}
+
+void removeShadowRootPolyfill(Element root) {
+  if (!ShadowRoot.supported) {
+    List<Node> polyfill = root.querySelectorAll('[try-dart-shadow-root]');
+    for (Element element in polyfill) {
+      element.remove();
+    }
+  }
+}
+
+String getText(Element node) {
+  if (ShadowRoot.supported) return node.text;
+  StringBuffer buffer = new StringBuffer();
+  htmlToText(
+      node, buffer, new TrySelection.empty(node), treatRootAsInline: true);
+  return '$buffer';
+}
diff --git a/site/try/src/ui.dart b/site/try/src/ui.dart
index 1fefeb8..2909888 100644
--- a/site/try/src/ui.dart
+++ b/site/try/src/ui.dart
@@ -104,7 +104,7 @@
   buildCode(interaction);
 
   (mainEditorPane = new DivElement())
-      ..classes.addAll(['well', 'mainEditorPane'])
+      ..classes.addAll(['mainEditorPane'])
       ..style.backgroundColor = currentTheme.background.color
       ..style.color = currentTheme.foreground.color
       ..style.font = codeFont
@@ -119,7 +119,12 @@
 
   var inputWrapper = new DivElement()
       ..append(mainEditorPane)
-      ..style.position = 'relative';
+      ..classes.add('well')
+      ..style.padding = '0px'
+      ..style.overflowX = 'hidden'
+      ..style.overflowY = 'scroll'
+      ..style.position = 'relative'
+      ..style.maxHeight = '80vh';
 
   var inputHeader = new DivElement()..appendText('Code');
 
@@ -257,7 +262,6 @@
     }
   }).catchError((error) {
     codePicker.style.visibility = 'visible';
-    print(error);
     OptionElement none = new OptionElement()
         ..appendText('Pick an example')
         ..disabled = true;
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index ad2554b..1baf670 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -39,6 +39,17 @@
 # co19 issue #615: Expect import missing
 LibTest/collection/LinkedList/LinkedList_A01_t01: Fail, OK
 
+# co19 issue #685: Non-bool operand of && and || produces a static type warning
+Language/12_Expressions/04_Booleans/1_Boolean_Conversion_A01_t02: Fail, OK
+
+# co19 issue #686: Abstract methods are allowed in concrete classes if they override a concrete method
+Language/07_Classes/07_Classes_A03_t06: Fail, OK
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A03_t04: Fail, OK
+Language/12_Expressions/16_Getter_Lookup_A02_t05: Fail, OK
+Language/12_Expressions/16_Getter_Lookup_A02_t06: Fail, OK
+
+Language/07_Classes/4_Abstract_Instance_Members_A07_t02: Fail # Issue 18914
+
 LibTest/isolate/IsolateStream/any_A01_t01: Fail # co19-roll r706: Please triage this failure.
 LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail # co19-roll r706: Please triage this failure.
 LibTest/isolate/IsolateStream/contains_A01_t01: Fail # co19-roll r706: Please triage this failure.
@@ -76,15 +87,6 @@
 
 
 Language/12_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A01_t19: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t10: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t11: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t12: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t13: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t14: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t15: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A02_t02: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A03_t01: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A03_t02: MissingStaticWarning
 Language/12_Expressions/29_Assignable_Expressions_A01_t09: MissingStaticWarning
 Language/13_Statements/06_For/1_For_Loop_A01_t07: MissingStaticWarning
 Language/13_Statements/06_For/1_For_Loop_A01_t08: MissingStaticWarning
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 0d27176..2401404 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -4,9 +4,6 @@
 
 [ $compiler == dart2analyzer ]
 
-LayoutTests/fast/dom/Range/range-comparePoint_t01: Crash # Issue 18549
-LayoutTests/fast/dom/Range/range-isPointInRange_t01: Crash # Issue 18549
-
 LibTest/core/RegExp/firstMatch_A01_t01: Fail
 
 # invalid argument for constant constructor
@@ -42,6 +39,9 @@
 # co19 issue #615: Expect import missing
 LibTest/collection/LinkedList/LinkedList_A01_t01: Fail, OK
 
+# co19 issue #685: Non-bool operand of && and || produces a static type warning
+Language/12_Expressions/04_Booleans/1_Boolean_Conversion_A01_t02: Fail, OK
+
 LibTest/isolate/IsolateStream/any_A01_t01: Fail # co19-roll r706: Please triage this failure.
 LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail # co19-roll r706: Please triage this failure.
 LibTest/isolate/IsolateStream/contains_A01_t01: Fail # co19-roll r706: Please triage this failure.
@@ -79,15 +79,6 @@
 
 
 Language/12_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A01_t19: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t10: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t11: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t12: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t13: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t14: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t15: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A02_t02: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A03_t01: MissingStaticWarning
-Language/12_Expressions/20_Logical_Boolean_Expressions_A03_t02: MissingStaticWarning
 Language/12_Expressions/29_Assignable_Expressions_A01_t09: MissingStaticWarning
 Language/13_Statements/06_For/1_For_Loop_A01_t07: MissingStaticWarning
 Language/13_Statements/06_For/1_For_Loop_A01_t08: MissingStaticWarning
@@ -226,3 +217,6 @@
 WebPlatformTest/dom/nodes/Node-isEqualNode_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-parentNode_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-replaceChild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+
+LayoutTests/fast/dom/Range/range-comparePoint_t01: Crash
+LayoutTests/fast/dom/Range/range-isPointInRange_t01: Crash
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 8e70936..be3eb8d 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -95,7 +95,6 @@
 Language/12_Expressions/12_Instance_Creation/1_New_A06_t06: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/22_Equality_A01_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/22_Equality_A05_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/27_Unary_Expressions_A01_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/30_Identifier_Reference_A02_t01: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/02_Expression_Statements_A01_t08: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/06_For_A01_t11: fail # co19-roll r546: Please triage this failure
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 6b21199..7fbd470 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -61,7 +61,7 @@
 [ $compiler == none && $runtime == vm && $mode == debug ]
 LibTest/core/List/List_class_A01_t01: Pass, Slow
 
-[ $compiler == none && $runtime == vm && $arch != x64 ]
+[ $compiler == none && $runtime == vm && ($arch != x64 && $arch != simarm64) ]
 LibTest/core/int/operator_left_shift_A01_t02: Fail # co19 issue 129
 
 [ $compiler == none && $runtime == vm && $arch == mips ]
@@ -76,16 +76,13 @@
 LibTest/isolate/Isolate/spawnUri_A01_t04: Crash, Pass # dartbug.com/17440
 LibTest/isolate/Isolate/spawn_A01_t04: Crash, Pass # dartbug.com/17440
 
-[ $compiler == none && $runtime == vm && ($arch == simarm || $arch == simmips) ]
-LibTest/core/Uri/Uri_A06_t03: Skip # Timeouts, co19-roll r576: Please triage this failure
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip # Timeouts
-LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # Timeouts
+[ $compiler == none && $runtime == vm && ($arch == simarm || $arch == simmips || $arch == simarm64) ]
+LibTest/core/Uri/Uri_A06_t03: Skip  # Timeout
+LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip  # Timeout
+LibTest/collection/ListBase/ListBase_class_A01_t01: Skip  # Timeout
 
 [ $runtime == vm ]
 LibTest/isolate/Isolate/spawn_A02_t01: Skip # co19 issue 667
 LibTest/html/*: SkipByDesign # dart:html not supported on VM.
 LayoutTests/fast/*: SkipByDesign # DOM not supported on VM.
 WebPlatformTest/*: SkipByDesign # dart:html not supported on VM.
-
-[ $compiler == none && $runtime == vm && $arch == simarm64 ]
-*: Skip
diff --git a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
index 3b8578d..81ead79 100644
--- a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
@@ -18,7 +18,6 @@
   // and classes, are used in production code.*/
   // Helper methods for debugging should never be called from production code:
   "implementation/helpers/": const [" is never "],
-  "implementation/util/setlet.dart": const [" is never "],
   
   // Some things in dart_printer are not yet used
   "implementation/dart_backend/dart_printer.dart" : const [" is never "]
@@ -35,19 +34,19 @@
   var helperUri = currentDirectory.resolve(
       'sdk/lib/_internal/compiler/implementation/helpers/helpers.dart');
   void checkLive(member) {
-    if (member.isFunction()) {
+    if (member.isFunction) {
       if (compiler.enqueuer.resolution.isLive(member)) {
         compiler.reportHint(member, MessageKind.GENERIC,
             {'text': "Helper function in production code '$member'."});
       }
-    } else if (member.isClass()) {
+    } else if (member.isClass) {
       if (member.isResolved) {
         compiler.reportHint(member, MessageKind.GENERIC,
             {'text': "Helper class in production code '$member'."});
       } else {
         member.forEachLocalMember(checkLive);
       }
-    } else if (member.isTypedef()) {
+    } else if (member.isTypedef) {
       if (member.isResolved) {
         compiler.reportHint(member, MessageKind.GENERIC,
             {'text': "Helper typedef in production code '$member'."});
diff --git a/tests/compiler/dart2js/codegen_helper.dart b/tests/compiler/dart2js/codegen_helper.dart
index be3029c..52f4312 100644
--- a/tests/compiler/dart2js/codegen_helper.dart
+++ b/tests/compiler/dart2js/codegen_helper.dart
@@ -29,7 +29,7 @@
     Map<String, String> result = new Map<String, String>();
     var backend = compiler.backend;
     for (var element in backend.generatedCode.keys) {
-      if (element.getCompilationUnit().script.readableUri != uri) continue;
+      if (element.compilationUnit.script.readableUri != uri) continue;
       var name = element.name;
       var code = backend.assembleCode(element);
       result[name] = code;
diff --git a/tests/compiler/dart2js/dart_backend_test.dart b/tests/compiler/dart2js/dart_backend_test.dart
index 62a3651..cb3a5e4 100644
--- a/tests/compiler/dart2js/dart_backend_test.dart
+++ b/tests/compiler/dart2js/dart_backend_test.dart
@@ -173,7 +173,7 @@
 }
 
 testClassWithMethod() {
-  testDart2Dart('main(){var a=new A();a.foo();}class A{void foo(){}}');
+  testDart2Dart(r'main(){var a=new A();a.foo();}class A{void foo(){}}');
 }
 
 testExtendsImplements() {
@@ -182,10 +182,8 @@
 }
 
 testVariableDefinitions() {
-  testDart2Dart('main(){var x,y;final String s=null;}',
-      continuation: (String s) { Expect.equals('main(){}', s); });
-  testDart2Dart('main(){final int x=0,y=0;final String s=null;}',
-      continuation: (String s) { Expect.equals('main(){}', s); });
+  testDart2Dart('main(){var x,y;final String s=null;}');
+  testDart2Dart('main(){final int x=0,y=0;final String s=null;}');
   testDart2Dart('foo(f,g){}main(){foo(1,2);}');
   testDart2Dart('foo(f(arg)){}main(){foo(main);}');
   // A couple of static/finals inside a class.
@@ -389,9 +387,9 @@
   var expectedResult =
     'topfoo(){}'
     'class A{foo(){}}'
-    'A_topfoo(){}'
+    'A_topfoo(){var x=5;}'
     'class A_A{num foo(){}A_A.fromFoo(){}A myliba;List<A_A> mylist;}'
-    'A getA(){}'
+    'A getA()=>null;'
     'main(){var a=new A();a.foo();var b=new A_A.fromFoo();b.foo();'
         'var GREATVAR=b.myliba;b.mylist;a=getA();A_topfoo();topfoo();}';
   testDart2DartWithLibrary(mainSrc, librarySrc,
diff --git a/tests/compiler/dart2js/dart_printer_test.dart b/tests/compiler/dart2js/dart_printer_test.dart
index 3829354..3321202 100644
--- a/tests/compiler/dart2js/dart_printer_test.dart
+++ b/tests/compiler/dart2js/dart_printer_test.dart
@@ -1,3 +1,7 @@
+// 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 dart_printer_test;
 
 import "package:expect/expect.dart";
@@ -85,9 +89,9 @@
 
 class AstBuilder extends Listener {
   final List stack = [];
-  final StringValidator stringValidator 
-         = new StringValidator(new PrintDiagnosticListener()); 
-  
+  final StringValidator stringValidator
+         = new StringValidator(new PrintDiagnosticListener());
+
   String asName(e) {
     if (e is Identifier)
       return e.name;
@@ -96,7 +100,7 @@
     else
       throw 'Expression is not a name: ${e.runtimeType}';
   }
-  
+
   TypeAnnotation asType(x) {
     if (x is TypeAnnotation)
       return x;
@@ -107,7 +111,7 @@
     else
       throw "Not a type: ${x.runtimeType}";
   }
-  
+
   Parameter asParameter(x) {
     if (x is Parameter)
       return x;
@@ -116,7 +120,7 @@
     else
       throw "Not a parameter: ${x.runtimeType}";
   }
-  
+
   void push(node) {
     stack.add(node);
   }
@@ -150,7 +154,7 @@
     String name = pop(asName);
     return new TypeAnnotation(name, args);
   }
-  
+
   // EXPRESSIONS
   endCascade() {
     throw "Cascade not supported yet";
@@ -178,10 +182,10 @@
       var part = parts[i];
       if (part is Expression) {
         members.add(part);
-      } else { 
+      } else {
         assert(part is Token);
         DartString str = stringValidator.validateInterpolationPart(
-            part as Token, 
+            part as Token,
             quoting,
             isFirst: i == 0,
             isLast: i == parts.length - 1);
@@ -340,7 +344,7 @@
     List<Argument> args = pop();
     String constructorName = pop(asName);
     TypeAnnotation type = popTypeAnnotation();
-    push(new CallNew(type, args, constructorName: constructorName, 
+    push(new CallNew(type, args, constructorName: constructorName,
                      isConst:true));
   }
   handleParenthesizedExpression(t) {
@@ -361,7 +365,7 @@
   handleUnaryPrefixExpression(Token t) {
     push(new UnaryOperator(t.value, pop()));
   }
-  
+
   handleFunctionTypedFormalParameter(tok) {
     // handled in endFormalParameter
   }
@@ -418,7 +422,7 @@
   handleNoType(Token token) {
     push(null);
   }
-  
+
   endReturnStatement(bool hasExpression, begin, end) {
     // This is also called for functions whose body is "=> expression"
     if (hasExpression) {
@@ -427,31 +431,31 @@
       push(new Return());
     }
   }
-  
+
   endExpressionStatement(Token token) {
     push(new ExpressionStatement(pop()));
   }
-  
+
   endDoWhileStatement(Token doKeyword, Token whileKeyword, Token end) {
     Expression condition = pop();
     Statement body = pop();
     push(new DoWhile(body, condition));
   }
-  
+
   endWhileStatement(Token whileKeyword, Token end) {
     Statement body = pop();
     Expression condition = pop();
     push(new While(condition, body));
   }
-  
+
   endBlock(int count, Token begin, Token end) {
     push(new Block(popList(count, <Statement>[])));
   }
-  
+
   endRethrowStatement(Token throwToken, Token endToken) {
     push(new Rethrow());
   }
-  
+
   endTryStatement(int catchCount, Token tryKeyword, Token finallyKeyword) {
     Statement finallyBlock = null;
     if (finallyKeyword != null) {
@@ -461,7 +465,7 @@
     Statement tryBlock = pop();
     push(new Try(tryBlock, catchBlocks, finallyBlock));
   }
-  
+
   void handleCatchBlock(Token onKeyword, Token catchKeyword) {
     Statement block = pop();
     String exceptionVar = null;
@@ -474,23 +478,23 @@
       }
     }
     TypeAnnotation type = onKeyword == null ? null : pop();
-    push(new CatchBlock(block, 
+    push(new CatchBlock(block,
       onType: type,
       exceptionVar: exceptionVar,
       stackVar: stackVar
     ));
   }
-  
+
   endSwitchStatement(Token switchKeyword, Token end) {
     List<SwitchCase> cases = pop();
     Expression expression = pop();
     push(new Switch(expression, cases));
   }
-  
+
   endSwitchBlock(int caseCount, Token begin, Token end) {
     push(popList(caseCount, <SwitchCase>[]));
   }
-  
+
   handleSwitchCase(int labelCount, int caseCount, Token defaultKeyword,
                    int statementCount, Token first, Token end) {
     List<Statement> statements = popList(statementCount, <Statement>[]);
@@ -500,26 +504,26 @@
     }
     push(new SwitchCase(cases, statements));
   }
-  
+
   handleCaseMatch(Token caseKeyword, Token colon) {
     // do nothing, leave case expression on stack
   }
-  
+
   handleBreakStatement(bool hasTarget, Token breakKeyword, Token end) {
     String target = hasTarget ? pop(asName) : null;
     push(new Break(target));
   }
-  
+
   handleContinueStatement(bool hasTarget, Token continueKeyword, Token end) {
     String target = hasTarget ? pop(asName) : null;
     push(new Continue(target));
   }
-  
+
   handleEmptyStatement(Token token) {
     push(new EmptyStatement());
   }
-  
-  
+
+
   VariableDeclaration asVariableDeclaration(x) {
     if (x is VariableDeclaration)
       return x;
@@ -527,31 +531,31 @@
       return new VariableDeclaration(x.name);
     throw "Not a variable definition: ${x.runtimeType}";
   }
-  
+
   endVariablesDeclaration(int count, Token end) {
-    List<VariableDeclaration> variables = 
+    List<VariableDeclaration> variables =
         popList(count, <VariableDeclaration>[], asVariableDeclaration);
     TypeAnnotation type = popTypeAnnotation();
-    push(new VariableDeclarations(variables, 
+    push(new VariableDeclarations(variables,
       type: type,
       isFinal: false, // TODO(asgerf): Parse modifiers.
       isConst: false
     ));
   }
-  
+
   endInitializer(Token assign) {
     Expression init = pop();
     String name = pop(asName);
     push(new VariableDeclaration(name, init));
   }
-  
+
   endIfStatement(Token ifToken, Token elseToken) {
     Statement elsePart = (elseToken == null) ? null : pop();
     Statement thenPart = pop();
     Expression condition = pop();
     push(new If(condition, thenPart, elsePart));
   }
-  
+
   endForStatement(int updateCount, Token begin, Token end) {
     Statement body = pop();
     List<Expression> updates = popList(updateCount, <Expression>[]);
@@ -560,24 +564,24 @@
     Node initializer = pop();
     push(new For(initializer, exp, updates, body));
   }
-  
+
   handleNoExpression(Token token) {
     push(null);
   }
-  
+
   endForIn(Token begin, Token inKeyword, Token end) {
     Statement body = pop();
     Expression exp = pop();
     Node declaredIdentifier = pop();
     push(new ForIn(declaredIdentifier, exp, body));
   }
-  
+
   handleAssertStatement(Token assertKeyword, Token semicolonToken) {
     Expression exp = pop();
     Expression call = new CallFunction(new Identifier("assert"), [exp]);
     push(new ExpressionStatement(call));
   }
-  
+
   endLabeledStatement(int labelCount) {
     Statement statement = pop();
     for (int i=0; i<labelCount; i++) {
@@ -586,16 +590,16 @@
     }
     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, returnType));
+    push(new FunctionDeclaration(name, parameters, body, returnType));
   }
-  
+
   endFunctionBody(int count, Token begin, Token end) {
     push(new Block(popList(count, <Statement>[])));
   }
@@ -625,7 +629,7 @@
         continue; // do not check things from Object, such as hashCode
       }
       MethodMirror mm = xm.type.instanceMembers[name];
-      if (mm.isGetter) { 
+      if (mm.isGetter) {
         var xv = xm.getField(name).reflectee;
         var yv = ym.getField(name).reflectee;
         checkDeepEqual(xv,yv);
@@ -730,29 +734,29 @@
 }
 
 void main() {
-  // To check if these tests are effective, one should manually alter 
-  // something in [Unparser] and see if a test fails.  
-  
+  // To check if these tests are effective, one should manually alter
+  // something in [Unparser] and see if a test fails.
+
   checkExpression(" a +  b  + c");
   checkExpression("(a +  b) + c");
   checkExpression(" a + (b  + c)");
-  
+
   checkExpression(" a +  b  - c");
   checkExpression("(a +  b) - c");
   checkExpression(" a + (b  - c)");
-  
+
   checkExpression(" a -  b  + c");
   checkExpression("(a -  b) + c");
   checkExpression(" a - (b  + c)");
-  
+
   checkExpression(" a *  b  + c");
   checkExpression("(a *  b) + c");
   checkExpression(" a * (b  + c)");
-  
+
   checkExpression(" a +  b  * c");
   checkExpression("(a +  b) * c");
   checkExpression(" a + (b  * c)");
-  
+
   checkExpression(" a *  b  * c");
   checkExpression("(a *  b) * c");
   checkExpression(" a * (b  * c)");
@@ -760,7 +764,7 @@
   checkExpression("a is T");
   checkExpression("a is! T");
   checkExpression("!(a is T)");
-  
+
   checkExpression("a is T.x");
   checkExpression("a is! T.x");
   checkExpression("!(a is T.x)");
@@ -768,7 +772,7 @@
 
   checkExpression("a as T.x");
   checkExpression("(a as T).x");
-  
+
   checkExpression("a == b");
   checkExpression("a != b");
   checkExpression("!(a == b)", "a != b");
@@ -776,7 +780,7 @@
   checkExpression("a && b ? c : d");
   checkExpression("(a && b) ? c : d");
   checkExpression("a && (b ? c : d)");
-  
+
   checkExpression("a || b ? c : d");
   checkExpression("(a || b) ? c : d");
   checkExpression("a || (b ? c : d)");
@@ -787,10 +791,10 @@
 
   checkExpression(" a ? b : c = d");
   checkExpression(" a ? b : (c = d)");
-  
+
   checkExpression("(a == b) == c");
   checkExpression("a == (b == c)");
-  
+
   checkExpression(" a <  b  == c");
   checkExpression("(a <  b) == c");
   checkExpression(" a < (b  == c)");
@@ -798,16 +802,16 @@
   checkExpression(" a ==  b  < c");
   checkExpression("(a ==  b) < c");
   checkExpression(" a == (b  < c)");
-  
+
   checkExpression("x.f()");
   checkExpression("(x.f)()");
-  
+
   checkExpression("x.f()()");
   checkExpression("(x.f)()()");
-  
+
   checkExpression("x.f().g()");
   checkExpression("(x.f)().g()");
-  
+
   checkExpression("x.f()");
   checkExpression("x.f(1 + 2)");
   checkExpression("x.f(1 + 2, 3 + 4)");
@@ -815,24 +819,24 @@
   checkExpression("x.f(1 + 2, foo:3 + 4, bar: 5)");
   checkExpression("x.f(foo:3 + 4)");
   checkExpression("x.f(foo:3 + 4, bar: 5)");
-  
+
   checkExpression("x.f.g.h");
   checkExpression("(x.f).g.h");
   checkExpression("(x.f.g).h");
-  
+
   checkExpression(" a =  b  + c");
   checkExpression(" a = (b  + c)");
   checkExpression("(a =  b) + c");
 
   checkExpression("a + (b = c)");
-  
-  checkExpression("dx * dx + dy * dy < r * r", 
+
+  checkExpression("dx * dx + dy * dy < r * r",
                   "((dx * dx) + (dy * dy)) < (r * r)");
-  checkExpression("mid = left + right << 1", 
+  checkExpression("mid = left + right << 1",
                   "mid = ((left + right) << 1)");
   checkExpression("a + b % c * -d ^  e - f  ~/ x & ++y / z++ | w > a ? b : c");
   checkExpression("a + b % c * -d ^ (e - f) ~/ x & ++y / z++ | w > a ? b : c");
-  
+
   checkExpression("'foo'");
   checkExpression("'foo' 'bar'", "'foobar'");
 
@@ -840,7 +844,7 @@
   checkExpression("{x: 1+2}.length");
   checkExpression("<String,int>{}.length");
   checkExpression("<String,int>{x: 1+2}.length");
-  
+
   checkExpression("[].length");
   checkExpression("[1+2].length");
   checkExpression("<num>[].length");
@@ -853,7 +857,7 @@
   checkExpression("x-- - y");
   checkExpression("x-- - -y");
   checkExpression("x - --y");
-  
+
   checkExpression("x && !y");
   checkExpression("!x && y");
   checkExpression("!(x && y)");
@@ -865,10 +869,10 @@
   checkExpression("x-- - -super");
   checkExpression("x - -super");
   checkExpression("x && !super");
-  
+
   checkExpression("super.f(1, 2) + 3");
   checkExpression("super.f + 3");
-  
+
   checkExpression(r"'foo\nbar'");
   checkExpression(r"'foo\r\nbar'");
   checkExpression(r"'foo\rbar'");
@@ -877,7 +881,7 @@
   checkExpression(r"r'foo\nbar'");
   checkExpression("''");
   checkExpression("r''");
-  
+
   var sq = "'";
   var dq = '"';
   checkExpression("'$dq$dq' \"$sq$sq\"");
@@ -886,19 +890,26 @@
   checkExpression("'$dq$dq$dq' '\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n' \"$sq$sq$sq\"");
   checkExpression("'$dq$dq$dq' '\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r' \"$sq$sq$sq\"");
   checkExpression("'$dq$dq$dq' '\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n' \"$sq$sq$sq\"");
-  
+
   checkExpression(r"'$foo'");
   checkExpression(r"'${foo}x'");
   checkExpression(r"'${foo}x\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'");
   checkExpression(r"'abc' '${foo}' r'\\\\\\\'");
-  
+
   checkExpression(r"'${$x}'");
   checkExpression(r"'${$x}y'");
   checkExpression("null + null");
-  
+
+  checkExpression("(x) => x",
+                  '',
+                  '(x){return x;}');
+  checkStatement("fn(x) => x;",
+                  '',
+                  'fn(x){return x;}');
+
   checkExpression("throw x");
   checkStatement("throw x;");
-  
+
   checkStatement("var x, y, z;");
   checkStatement("final x, y, z;");
   checkStatement("dynamic x, y, z;");
@@ -907,11 +918,11 @@
   checkStatement("final dynamic x, y, z;");
   checkStatement("final String x, y, z;");
   checkStatement("final List<int> x, y, z;");
-  
+
   checkStatement("var x = y, z;");
   checkStatement("var x, y = z;");
   checkStatement("var x = y = z;");
-  
+
   // Note: We sometimes have to pass an expected string to account for
   //       block flattening which does not preserve structural AST equality
   checkStatement("if (x)   if (y) foo();   else bar();  ");
@@ -923,13 +934,14 @@
   checkStatement("if (x) while (y) { if (z) foo(); } else bar();  ");
   checkStatement("if (x) while (y) { if (z) foo();   else bar(); }",
                  "if (x) while (y)   if (z) foo();   else bar();  ");
-  
+
   checkStatement("{var x = 1; {var x = 2;} return x;}");
   checkStatement("{var x = 1; {x = 2;} return x;}",
+                 "{var x = 1;  x = 2;  return x;}",
                  "{var x = 1;  x = 2;  return x;}");
-  
+
   checkStatement("if (x) {var x = 1;}");
-  
+
   checkStatement("({'foo': 1}).bar();");
   checkStatement("({'foo': 1}).length;");
   checkStatement("({'foo': 1}).length + 1;");
@@ -942,18 +954,18 @@
   checkStatement("({'foo': 1}) as Map;");
   checkStatement("({'foo': 1}) is util.Map;");
   checkStatement("({'foo': 1}) + 1;");
-  
+
   checkStatement("[1].bar();");
   checkStatement("1.bar();");
   checkStatement("'foo'.bar();");
 
   checkStatement("do while(x); while (y);");
   checkStatement("{do; while(x); while (y);}");
-  
+
   checkStatement('switch(x) { case 1: case 2: return y; }');
   checkStatement('switch(x) { default: return y; }');
   checkStatement('switch(x) { case 1: x=y; default: return y; }');
   checkStatement('switch(x) { case 1: x=y; y=z; break; default: return y; }');
-  
+
 }
 
diff --git a/tests/compiler/dart2js/deferred_dont_inline_deferred_constants_test.dart b/tests/compiler/dart2js/deferred_dont_inline_deferred_constants_test.dart
new file mode 100644
index 0000000..487b733
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_dont_inline_deferred_constants_test.dart
@@ -0,0 +1,143 @@
+// 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 the additional runtime type support is output to the right
+// Files when using deferred loading.
+
+import 'package:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+import 'memory_source_file_helper.dart';
+import "dart:async";
+
+import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+       as dart2js;
+
+class MemoryOutputSink extends EventSink<String> {
+  StringBuffer mem = new StringBuffer();
+  void add(String event) {
+    mem.write(event);
+  }
+  void addError(String event, [StackTrace stackTrace]) {
+    Expect.isTrue(false);
+  }
+  void close() {}
+}
+
+void main() {
+  Uri script = currentDirectory.resolveUri(Platform.script);
+  Uri libraryRoot = script.resolve('../../../sdk/');
+  Uri packageRoot = script.resolve('./packages/');
+
+  var provider = new MemorySourceFileProvider(MEMORY_SOURCE_FILES);
+  var handler = new FormattingDiagnosticHandler(provider);
+
+  Map<String, MemoryOutputSink> outputs = new Map<String, MemoryOutputSink>();
+
+  MemoryOutputSink outputSaver(name, extension) {
+    if (name == '') {
+      name = 'main';
+    }
+    return outputs.putIfAbsent("$name.$extension", () {
+      return new MemoryOutputSink();
+    });
+  }
+
+  Compiler compiler = new Compiler(provider.readStringFromUri,
+                                   outputSaver,
+                                   handler.diagnosticHandler,
+                                   libraryRoot,
+                                   packageRoot,
+                                   [],
+                                   {});
+  asyncTest(() => compiler.run(Uri.parse('memory:main.dart')).then((_) {
+    String mainOutput = outputs['main.js'].mem.toString();
+    String lib1Output = outputs['out_lib1.part.js'].mem.toString();
+    String lib2Output = outputs['out_lib2.part.js'].mem.toString();
+    String lib12Output = outputs['out_lib1_lib2.part.js'].mem.toString();
+    // Test that the deferred constants are not inlined into the main file.
+    RegExp re1 = new RegExp(r"= .string1");
+    RegExp re2 = new RegExp(r"= .string2");
+    RegExp re3 = new RegExp(r"= 1010");
+    Expect.isTrue(re1.hasMatch(lib1Output));
+    Expect.isTrue(re2.hasMatch(lib1Output));
+    Expect.isTrue(re3.hasMatch(lib1Output));
+    Expect.isFalse(re1.hasMatch(mainOutput));
+    Expect.isFalse(re2.hasMatch(mainOutput));
+    Expect.isFalse(re3.hasMatch(mainOutput));
+    // Test that the non-deferred constant is inlined.
+    Expect.isTrue(new RegExp(r"print\(.string3.\)").hasMatch(mainOutput));
+    Expect.isFalse(new RegExp(r"= .string3").hasMatch(mainOutput));
+    Expect.isTrue(new RegExp(r"print\(.string4.\)").hasMatch(mainOutput));
+
+    // C(1) is shared between main, lib1 and lib2. Test that lib1 and lib2 each
+    // has a reference to it. It is defined in the main output file.
+    Expect.isTrue(new RegExp(r"C.C_1 =").hasMatch(mainOutput));
+    Expect.isFalse(new RegExp(r"= C.C_1").hasMatch(mainOutput));
+
+    Expect.isTrue(new RegExp(r"= C.C_1").hasMatch(lib1Output));
+    Expect.isTrue(new RegExp(r"= C.C_1").hasMatch(lib2Output));
+
+    // C(2) is shared between lib1 and lib2, each of them has their own
+    // reference to it.
+    Expect.isFalse(new RegExp(r"= C.C_2").hasMatch(mainOutput));
+
+    Expect.isTrue(new RegExp(r"= C.C_2").hasMatch(lib1Output));
+    Expect.isTrue(new RegExp(r"= C.C_2").hasMatch(lib2Output));
+    Expect.isTrue(new RegExp(r"C.C_2 =").hasMatch(lib12Output));
+
+    // "string4" is shared between lib1 and lib2, but it can be inlined.
+    Expect.isTrue(new RegExp(r"= .string4").hasMatch(lib1Output));
+    Expect.isTrue(new RegExp(r"= .string4").hasMatch(lib2Output));
+    Expect.isFalse(new RegExp(r"= .string4").hasMatch(lib12Output));
+  }));
+}
+
+// Make sure that deferred constants are not inlined into the main hunk.
+const Map MEMORY_SOURCE_FILES = const {"main.dart": """
+import "dart:async";
+
+import 'lib1.dart' deferred as lib1;
+import 'lib2.dart' deferred as lib2;
+
+const c = "string3";
+
+class C {
+  final p;
+  const C(this.p);
+}
+
+void main() {
+  lib1.loadLibrary().then((_) {
+    lib2.loadLibrary().then((_) {
+      print(lib1.C1);
+      print(lib1.C2);
+      print(lib1.C.C3);
+      print(c);
+      print(lib1.C4);
+      print(lib2.C4);
+      print(lib1.C5);
+      print(lib2.C5);
+      print(lib1.C6);
+      print(lib2.C6);
+      print("string4");
+      print(const C(1));
+    });
+  });
+}
+""", "lib1.dart": """
+import "main.dart" as main;
+const C1 = "string1";
+const C2 = 1010;
+class C {
+  static const C3 = "string2";
+}
+const C4 = "string4";
+const C5 = const main.C(1);
+const C6 = const main.C(2);
+""", "lib2.dart": """
+import "main.dart" as main;
+const C4 = "string4";
+const C5 = const main.C(1);
+const C6 = const main.C(2);
+"""};
diff --git a/tests/compiler/dart2js/deferred_follow_constant_dependencies_test.dart b/tests/compiler/dart2js/deferred_follow_constant_dependencies_test.dart
new file mode 100644
index 0000000..cbd5447
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_follow_constant_dependencies_test.dart
@@ -0,0 +1,84 @@
+// 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 constants depended on by other constants are correctly deferred.
+
+import 'package:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+import 'memory_source_file_helper.dart';
+import "dart:async";
+import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+  hide Compiler;
+
+
+class FakeOutputStream<T> extends EventSink<T> {
+  void add(T event) {}
+  void addError(T event, [StackTrace stackTrace]) {}
+  void close() {}
+}
+
+void main() {
+  Uri script = currentDirectory.resolveUri(Platform.script);
+  Uri libraryRoot = script.resolve('../../../sdk/');
+  Uri packageRoot = script.resolve('./packages/');
+
+  var provider = new MemorySourceFileProvider(MEMORY_SOURCE_FILES);
+  var handler = new FormattingDiagnosticHandler(provider);
+
+  Compiler compiler = new Compiler(provider.readStringFromUri,
+                                   (name, extension) => new FakeOutputStream(),
+                                   handler.diagnosticHandler,
+                                   libraryRoot,
+                                   packageRoot,
+                                   [],
+                                   {});
+  asyncTest(() => compiler.run(Uri.parse('memory:main.dart')).then((_) {
+    var outputUnitForElement = compiler.deferredLoadTask.outputUnitForElement;
+    var outputUnitForConstant = compiler.deferredLoadTask.outputUnitForConstant;
+    var mainOutputUnit = compiler.deferredLoadTask.mainOutputUnit;
+    var lib = compiler.libraries["memory:lib.dart"];
+    var backend = compiler.backend;
+    List<Constant> allConstants = [];
+
+    addConstantWithDependendencies(Constant c) {
+      allConstants.add(c);
+      c.getDependencies().forEach(addConstantWithDependendencies);
+    }
+
+    backend.constants.compiledConstants.forEach(addConstantWithDependendencies);
+    for (String stringValue in ["cA", "cB", "cC"]) {
+      Constant constant = allConstants.firstWhere((constant) {
+        return constant is StringConstant
+            && constant.value.slowToString() == stringValue;
+      });
+      Expect.notEquals(null, outputUnitForConstant(constant));
+      Expect.notEquals(mainOutputUnit, outputUnitForConstant(constant));
+    }
+  }));
+}
+
+// The main library imports lib1 and lib2 deferred and use lib1.foo1 and
+// lib2.foo2.  This should trigger seperate outputunits for main, lib1 and lib2.
+//
+// Both lib1 and lib2 import lib3 directly and
+// both use lib3.foo3.  Therefore a shared output unit for lib1 and lib2 should
+// be created.
+//
+// lib1 and lib2 also import lib4 deferred, but lib1 uses lib4.bar1 and lib2
+// uses lib4.bar2.  So two output units should be created for lib4, one for each
+// import.
+const Map MEMORY_SOURCE_FILES = const {"main.dart": """
+import 'lib.dart' deferred as lib;
+
+void main() {
+  print(lib.L);
+}
+""", "lib.dart": """
+class C {
+  final a;
+  const C(this.a);
+}
+
+const L = const {"cA": const C(const {"cB": "cC"})};
+""",};
\ No newline at end of file
diff --git a/tests/compiler/dart2js/deferred_mirrors_test.dart b/tests/compiler/dart2js/deferred_mirrors_test.dart
index 12e2b7d..5f7eea1 100644
--- a/tests/compiler/dart2js/deferred_mirrors_test.dart
+++ b/tests/compiler/dart2js/deferred_mirrors_test.dart
@@ -9,7 +9,6 @@
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'memory_source_file_helper.dart';
-import "dart:async";
 import "memory_compiler.dart";
 
 import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
@@ -38,8 +37,7 @@
     var field2 = lib2.find("field2");
 
     Expect.notEquals(outputUnitForElement(main), outputUnitForElement(foo1));
-    Expect.equals(outputUnitForElement(foo1), outputUnitForElement(sin));
-    Expect.equals(outputUnitForElement(foo2), outputUnitForElement(sin));
+    Expect.equals(outputUnitForElement(main), outputUnitForElement(sin));
     Expect.equals(outputUnitForElement(foo2), outputUnitForElement(field2));
   });
   runTest('memory:main2.dart', (compiler) {
@@ -59,7 +57,23 @@
     var foo = lib3.find("foo");
 
     Expect.notEquals(outputUnitForElement(main), outputUnitForElement(foo));
-    Expect.equals(outputUnitForElement(foo), outputUnitForElement(C));
+    Expect.equals(outputUnitForElement(main), outputUnitForElement(C));
+  });
+  runTest('memory:main4.dart', (compiler) {
+    var main = compiler.mainApp.find(dart2js.Compiler.MAIN);
+    Expect.isNotNull(main, "Could not find 'main'");
+    compiler.deferredLoadTask.onResolutionComplete(main);
+    var outputUnitForElement = compiler.deferredLoadTask.outputUnitForElement;
+
+    var mainLib = compiler.libraries["memory:main4.dart"];
+    var lib4 = compiler.libraries["memory:lib4.dart"];
+    var lib5 = compiler.libraries["memory:lib5.dart"];
+    var lib6 = compiler.libraries["memory:lib6.dart"];
+    var foo5 = lib5.find("foo");
+    var foo6 = lib6.find("foo");
+
+    Expect.notEquals(outputUnitForElement(main), outputUnitForElement(foo5));
+    Expect.equals(outputUnitForElement(foo5), outputUnitForElement(foo6));
   });
 }
 
@@ -147,4 +161,34 @@
   currentMirrorSystem().findLibrary(#main3);
 }
 """,
+// Check that exports and imports are handled correctly with mirrors.
+"main4.dart": """
+library main3;
+
+@MirrorsUsed(targets: const ["lib5.foo","lib6.foo"])
+import "dart:mirrors";
+
+import "lib4.dart" deferred as lib;
+
+void main() {
+  lib.loadLibrary().then((_) {
+    currentMirrorSystem().findLibrary(#lib5);
+  });
+}
+""",
+"lib4.dart": """
+import "lib5.dart";
+export "lib6.dart";
+
+""",
+"lib5.dart": """
+library lib5;
+
+foo() {}
+""",
+"lib6.dart": """
+library lib6;
+
+foo() {}
+""",
 };
diff --git a/tests/compiler/dart2js/find_my_name_test.dart b/tests/compiler/dart2js/find_my_name_test.dart
index f36c662..4de23ca 100644
--- a/tests/compiler/dart2js/find_my_name_test.dart
+++ b/tests/compiler/dart2js/find_my_name_test.dart
@@ -36,9 +36,9 @@
   cls.parseNode(compiler);
   cls.forEachLocalMember((Element e) {
     String name = e.name;
-    if (e.isConstructor()) {
+    if (e.isConstructor) {
       name = Elements.reconstructConstructorName(e).replaceFirst(r'$', '.');
     }
-    Expect.equals(code.indexOf(name, skip), e.position().charOffset);
+    Expect.equals(code.indexOf(name, skip), e.position.charOffset);
   });
 }
diff --git a/tests/compiler/dart2js/js_parser_statements_test.dart b/tests/compiler/dart2js/js_parser_statements_test.dart
index e46d304..733e4ac 100644
--- a/tests/compiler/dart2js/js_parser_statements_test.dart
+++ b/tests/compiler/dart2js/js_parser_statements_test.dart
@@ -142,4 +142,13 @@
   testStatement('function foo(r, #) { return #[r](#) }',
       [['a', 'b'], 'g', ['b', 'a']],
       'function foo(r, a, b) {\n  return g[r](b, a);\n}');
+
+  // Sequence is printed flattened
+  var seq1 = js('1, 2, 3');
+  testStatement('x = #', [seq1], 'x = (1, 2, 3);');
+  testStatement('x = (#, #)', [seq1, seq1], 'x = (1, 2, 3, 1, 2, 3);');
+  testStatement('x = #, #', [seq1, seq1], 'x = (1, 2, 3), 1, 2, 3;');
+  testStatement(
+      'for (i = 0, j = #, k = 0; ; ++i, ++j, ++k){}', [seq1],
+      'for (i = 0, j = (1, 2, 3), k = 0;; ++i, ++j, ++k) {\n}');
 }
diff --git a/tests/compiler/dart2js/list_tracer_node_type_test.dart b/tests/compiler/dart2js/list_tracer_node_type_test.dart
index da1e3ae..092f554 100644
--- a/tests/compiler/dart2js/list_tracer_node_type_test.dart
+++ b/tests/compiler/dart2js/list_tracer_node_type_test.dart
@@ -59,7 +59,8 @@
 String generateTest(String call) {
   return """
 main() {
-  var a = [42];
+  List differentType = [true, false];
+  List a = [42];
   return a.$call + 42;
 }
 """;
@@ -91,17 +92,20 @@
     Expect.isFalse(generated.contains('iae'));
   }));
 
-  var selectors = const <String>[
+  var memberInvocations = const <String>[
     'first',
     'last',
     'single',
-    'singleWhere',
-    'elementAt',
-    'removeAt',
-    'removeLast'
+    'singleWhere((x) => true)',
+    'elementAt(0)',
+    'removeAt(0)',
+    'removeLast()',
   ];
-  selectors.map((name) => generateTest('$name()')).forEach((String test) {
-    asyncTest(() => compileAll(test).then((generated) {
+  memberInvocations.map((member) => generateTest('$member'))
+      .forEach((String test) {
+    asyncTest(() => compileAll(test, expectedErrors: 0, expectedWarnings: 0)
+        .then((generated) {
+      Expect.isTrue(generated.contains('+ 42'));
       Expect.isFalse(generated.contains('if (typeof t1'));
       Expect.isFalse(generated.contains('if (t1 == null)'));
     }));
diff --git a/tests/compiler/dart2js/members_test.dart b/tests/compiler/dart2js/members_test.dart
index 2fc70b5..6d697a9 100644
--- a/tests/compiler/dart2js/members_test.dart
+++ b/tests/compiler/dart2js/members_test.dart
@@ -25,7 +25,7 @@
                           {bool isSetter: false,
                            int checkType: CHECK_INTERFACE}) {
   Name memberName =
-      new Name(name, cls.element.getLibrary(), isSetter: isSetter);
+      new Name(name, cls.element.library, isSetter: isSetter);
   MemberSignature member = checkType == CHECK_CLASS
         ? cls.element.lookupClassMember(memberName)
         : cls.element.lookupInterfaceMember(memberName);
@@ -125,7 +125,7 @@
           "'$member'. Expected '${declarer}'.");
     } else {
       DeclaredMember declared = member;
-      Expect.equals(cls.element, declared.element.getEnclosingClass());
+      Expect.equals(cls.element, declared.element.enclosingClass);
       Expect.equals(cls, declared.declarer);
     }
     Expect.equals(isSetter, member.isSetter);
diff --git a/tests/compiler/dart2js/memory_compiler.dart b/tests/compiler/dart2js/memory_compiler.dart
index fa257a8..5d0431c 100644
--- a/tests/compiler/dart2js/memory_compiler.dart
+++ b/tests/compiler/dart2js/memory_compiler.dart
@@ -188,7 +188,7 @@
     Map cachedTreeElements =
         cachedCompiler.enqueuer.resolution.resolvedElements;
     cachedTreeElements.forEach((element, treeElements) {
-      if (element.getLibrary().isPlatformLibrary) {
+      if (element.library.isPlatformLibrary) {
         compiler.enqueuer.resolution.resolvedElements[element] =
             treeElements;
       }
diff --git a/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart b/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
index 5a74894..13d9194 100644
--- a/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
@@ -86,8 +86,7 @@
   }
 }
 
-main() {
+main(hest) {
   new Foo().fisk();
-  var hest;
 }
 """};
diff --git a/tests/compiler/dart2js/mirrors_helper.dart b/tests/compiler/dart2js/mirrors_helper.dart
index 8bba108..aca1317 100644
--- a/tests/compiler/dart2js/mirrors_helper.dart
+++ b/tests/compiler/dart2js/mirrors_helper.dart
@@ -48,6 +48,7 @@
 
   bool operator==(Object other) => false;
   int operator-() => 0;
+  operator$foo() {}
 }
 
 class Boz extends Foo {
diff --git a/tests/compiler/dart2js/mirrors_test.dart b/tests/compiler/dart2js/mirrors_test.dart
index 13cffcc1..0f618b4 100644
--- a/tests/compiler/dart2js/mirrors_test.dart
+++ b/tests/compiler/dart2js/mirrors_test.dart
@@ -491,6 +491,7 @@
 //
 //   bool operator==(Object other) => false;
 //   int operator -() => 0;
+//   operator$foo() {}
 // }
 void testBaz(MirrorSystem system, LibraryMirror helperLibrary,
              Map<Symbol, DeclarationMirror> declarations) {
@@ -580,7 +581,7 @@
 
   var bazClassMembers = bazClass.declarations;
   Expect.isNotNull(bazClassMembers, "Declared members map is null");
-  Expect.equals(8, bazClassMembers.length,
+  Expect.equals(9, bazClassMembers.length,
                 "Unexpected number of declared members");
 
   ////////////////////////////////////////////////////////////////////////////
@@ -836,6 +837,35 @@
   Expect.isTrue(operator_negate.isOperator);
   Expect.stringEquals('-', operatorName(operator_negate));
 
+
+  ////////////////////////////////////////////////////////////////////////////
+  // operator$foo() {}
+  ////////////////////////////////////////////////////////////////////////////
+  var operator$foo = bazClassMembers[#operator$foo];
+  Expect.isNotNull(operator$foo, "operator\$foo not found");
+  Expect.equals(#operator$foo, operator$foo.simpleName);
+  Expect.equals(#mirrors_helper.Baz.operator$foo, operator$foo.qualifiedName);
+  Expect.equals(operator$foo.owner, bazClass);
+  Expect.isFalse(operator$foo.isTopLevel);
+  Expect.isTrue(operator$foo is MethodMirror);
+  Expect.isFalse(operator$foo.isConstructor);
+  Expect.isFalse(operator$foo.isPrivate);
+  Expect.isFalse(operator$foo.isStatic);
+  Expect.isTrue(operator$foo.isRegularMethod);
+  Expect.isFalse(operator$foo.isConstConstructor);
+  Expect.isFalse(operator$foo.isGenerativeConstructor);
+  Expect.isFalse(operator$foo.isRedirectingConstructor);
+  Expect.isFalse(operator$foo.isFactoryConstructor);
+  Expect.isFalse(operator$foo.isGetter);
+  Expect.isFalse(operator$foo.isSetter);
+  Expect.isFalse(operator$foo.isOperator);
+
+  Expect.equals(dynamicType, operator$foo.returnType);
+
+  var operator$fooParameters = operator$foo.parameters;
+  Expect.isNotNull(operator$fooParameters, "Method parameters is null");
+  Expect.equals(0, operator$fooParameters.length, "Unexpected parameter count");
+
   ////////////////////////////////////////////////////////////////////////////
   //   Baz();
   ////////////////////////////////////////////////////////////////////////////
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 5ce9930..4d4123d 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -114,9 +114,14 @@
     operator[](index) => this[index];
     operator[]=(index, value) { this[index] = value; }
     add(value) { this[length + 1] = value; }
-    removeAt(index) {}
     insert(index, value) {}
-    removeLast() {}
+    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 {}
@@ -220,6 +225,13 @@
     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 DateTime {
@@ -413,14 +425,12 @@
       visitor.scope = new MethodScope(visitor.scope, element);
     }
     visitor.visit(tree);
-    visitor.scope = new LibraryScope(element.getLibrary());
+    visitor.scope = new LibraryScope(element.library);
     return visitor.mapping;
   }
 
   resolverVisitor() {
-    Element mockElement =
-      new FunctionElementX('', ElementKind.FUNCTION, Modifiers.EMPTY,
-                           mainApp.entryCompilationUnit, false);
+    Element mockElement = new MockElement(mainApp.entryCompilationUnit);
     ResolverVisitor visitor =
         new ResolverVisitor(this, mockElement,
                             new CollectingTreeElements(mockElement));
@@ -587,3 +597,13 @@
     }
   };
 }
+
+class MockElement extends FunctionElementX {
+  MockElement(Element enclosingElement)
+      : super('', ElementKind.FUNCTION, Modifiers.EMPTY,
+              enclosingElement, false);
+
+  get node => null;
+
+  parseNode(_) => null;
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/reexport_handled_test.dart b/tests/compiler/dart2js/reexport_handled_test.dart
index ff81d14..f2982ed 100644
--- a/tests/compiler/dart2js/reexport_handled_test.dart
+++ b/tests/compiler/dart2js/reexport_handled_test.dart
@@ -34,7 +34,7 @@
     Expect.isTrue(exportingLibrary.exportsHandled);
     var foo = findInExports(exportingLibrary, 'foo');
     Expect.isNotNull(foo);
-    Expect.isTrue(foo.isField());
+    Expect.isTrue(foo.isField);
 
     // Load reexporting library when exports are handled on the exporting library.
     return compiler.libraryLoader.loadLibrary(
@@ -42,7 +42,7 @@
   }).then((reexportingLibrary) {
     var foo = findInExports(reexportingLibrary, 'foo');
     Expect.isNotNull(foo);
-    Expect.isTrue(foo.isField());
+    Expect.isTrue(foo.isField);
   }));
 }
 
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 832e784..1080622 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -631,7 +631,7 @@
   VariableDefinitions cNode = cElement.variables.parseNode(cElement, compiler);
   Expect.equals(bNode, cNode);
   Expect.isNull(bNode.type);
-  Expect.isTrue(bNode.modifiers.isVar());
+  Expect.isTrue(bNode.modifiers.isVar);
 }
 
 resolveConstructor(String script, String statement, String className,
@@ -647,10 +647,10 @@
   Element element;
   if (constructor != '') {
     element = classElement.lookupConstructor(
-        new Selector.callConstructor(constructor, classElement.getLibrary()));
+        new Selector.callConstructor(constructor, classElement.library));
   } else {
     element = classElement.lookupConstructor(
-        new Selector.callDefaultConstructor(classElement.getLibrary()));
+        new Selector.callDefaultConstructor(classElement.library));
   }
 
   FunctionExpression tree = element.parseNode(compiler);
diff --git a/tests/compiler/dart2js/stats_test.dart b/tests/compiler/dart2js/stats_test.dart
new file mode 100644
index 0000000..fd1796b
--- /dev/null
+++ b/tests/compiler/dart2js/stats_test.dart
@@ -0,0 +1,92 @@
+// 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 '../../../sdk/lib/_internal/compiler/implementation/helpers/helpers.dart';
+
+class CollectingOutput implements StatsOutput {
+  final StringBuffer sb = new StringBuffer();
+
+  void println(String text) {
+    sb.write('$text\n');
+  }
+
+  String toString() => sb.toString();
+}
+
+void main() {
+  testRecordElement();
+  testRecordFrequency();
+  testRecordCounter();
+}
+
+void testRecordElement() {
+  test((Stats stats) {
+    stats.recordElement('foo', 'a', data: 'first-a-data');
+    stats.recordElement('foo', 'a', data: 'second-a-data');
+    stats.recordElement('foo', 'b');
+    stats.recordElement('bar', 'a', data: 'third-a-data');
+    stats.recordElement('bar', 'c');
+   }, r'''
+foo: 2
+ value=a data=second-a-data
+ b
+bar: 2
+ value=a data=third-a-data
+ c
+''');
+}
+
+void testRecordFrequency() {
+  test((Stats stats) {
+    stats.recordFrequency('foo', 'a', 'first-a-data');
+    stats.recordFrequency('foo', 'a', 'second-a-data');
+    stats.recordFrequency('bar', 'b', 'first-b-data');
+    stats.recordFrequency('foo', 'c');
+    stats.recordFrequency('bar', 'b');
+  }, r'''
+foo:
+ a: 2
+  first-a-data
+  second-a-data
+ c: 1
+bar:
+ b: 2
+  first-b-data
+''');
+}
+
+void testRecordCounter() {
+  test((Stats stats) {
+    stats.recordCounter('foo', 'a');
+    stats.recordCounter('foo', 'a');
+    stats.recordCounter('foo', 'b');
+    stats.recordCounter('bar', 'c', 'first-c-data');
+    stats.recordCounter('bar', 'c', 'second-c-data');
+    stats.recordCounter('bar', 'd');
+    stats.recordCounter('bar', 'd');
+    stats.recordCounter('baz');
+    stats.recordCounter('baz');
+    }, r'''
+foo: 3
+ count=2 example=a
+ count=1 example=b
+bar: 4
+ count=2 examples=2
+  c:
+   first-c-data
+   second-c-data
+  d
+baz: 2
+''');
+}
+
+void test(f(Stats stats), expectedDump) {
+  CollectingOutput output = new CollectingOutput();
+  Stats stats = new ActiveStats(new ConsolePrinter(output: output));
+  f(stats);
+  stats.dumpStats();
+  print(output.toString());
+  Expect.equals(expectedDump, output.toString());
+}
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index 5a0644c..02868b7 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -1980,7 +1980,7 @@
 
   compiler = new MockCompiler(coreSource: CORE_SOURCE);
   types = compiler.types;
-  voidType = compiler.types.voidType;
+  voidType = const VoidType();
   intType = compiler.intClass.computeType(compiler);
   doubleType = compiler.doubleClass.computeType(compiler);
   boolType = compiler.boolClass.computeType(compiler);
@@ -2013,7 +2013,7 @@
        !elements.isEmpty;
        elements = elements.tail) {
     element = elements.head;
-    if (element.isClass()) {
+    if (element.isClass) {
       ClassElement classElement = element;
       classElement.ensureResolved(compiler);
       classElement.forEachLocalMember((Element e) {
@@ -2059,8 +2059,7 @@
   Node node = listener.popNode();
   Element compilationUnit =
     new CompilationUnitElementX(new Script(null, null, null), compiler.mainApp);
-  Element function = new FunctionElementX(
-      '', ElementKind.FUNCTION, Modifiers.EMPTY, compilationUnit, false);
+  Element function = new MockElement(compilationUnit);
   TreeElements elements = compiler.resolveNodeStatement(node, function);
   TypeCheckerVisitor checker = new TypeCheckerVisitor(compiler, elements,
                                                                 types);
diff --git a/tests/compiler/dart2js/type_combination_test.dart b/tests/compiler/dart2js/type_combination_test.dart
index 886a93b..b063bf5 100644
--- a/tests/compiler/dart2js/type_combination_test.dart
+++ b/tests/compiler/dart2js/type_combination_test.dart
@@ -679,7 +679,7 @@
   MockCompiler compiler = new MockCompiler();
   JavaScriptBackend backend = compiler.backend;
   compiler.interceptorsLibrary.forEachLocalMember((element) {
-    if (element.isClass()) {
+    if (element.isClass) {
       compiler.enqueuer.resolution.registerInstantiatedClass(
           element, compiler.globalDependencies);
     }
diff --git a/tests/compiler/dart2js/type_inference6_test.dart b/tests/compiler/dart2js/type_inference6_test.dart
new file mode 100644
index 0000000..d0da1e7
--- /dev/null
+++ b/tests/compiler/dart2js/type_inference6_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2011, 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:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+import 'compiler_helper.dart';
+import 'type_mask_test_helper.dart';
+
+import 'dart:async';
+
+const String TEST = r"""
+foo() {
+  var a = [1, 2, 3];
+  return a.first;
+}
+
+main() {
+  foo();
+}
+""";
+
+Future runTest() {
+  Uri uri = new Uri(scheme: 'source');
+  var compiler = compilerFor(TEST, uri);
+  return compiler.runCompiler(uri).then((_) {
+    var typesTask = compiler.typesTask;
+    var typesInferrer = typesTask.typesInferrer;
+    var element = findElement(compiler, "foo");
+    var mask = typesInferrer.getReturnTypeOfElement(element);
+    Expect.equals(typesTask.uint31Type, simplify(mask, compiler));
+  });
+}
+
+main() {
+  asyncStart();
+  runTest().then((_) {
+    // Make sure that the type is still correct when we do a second compilation.
+    return runTest();
+  }).whenComplete(asyncEnd);
+}
diff --git a/tests/compiler/dart2js/type_test_helper.dart b/tests/compiler/dart2js/type_test_helper.dart
index b64cecb..daeae99 100644
--- a/tests/compiler/dart2js/type_test_helper.dart
+++ b/tests/compiler/dart2js/type_test_helper.dart
@@ -20,10 +20,10 @@
 
 GenericType instantiate(TypeDeclarationElement element,
                         List<DartType> arguments) {
-  if (element.isClass()) {
+  if (element.isClass) {
     return new InterfaceType(element, new Link<DartType>.fromList(arguments));
   } else {
-    assert(element.isTypedef());
+    assert(element.isTypedef);
     return new TypedefType(element, new Link<DartType>.fromList(arguments));
   }
 }
@@ -80,9 +80,9 @@
   Element getElement(String name) {
     var element = compiler.mainApp.find(name);
     Expect.isNotNull(element);
-    if (element.isClass()) {
+    if (element.isClass) {
       element.ensureResolved(compiler);
-    } else if (element.isTypedef()) {
+    } else if (element.isTypedef) {
       element.computeType(compiler);
     }
     return element;
@@ -94,7 +94,7 @@
 
   DartType operator[] (String name) {
     if (name == 'dynamic') return compiler.types.dynamicType;
-    if (name == 'void') return compiler.types.voidType;
+    if (name == 'void') return const VoidType();
     return getElementType(name);
   }
 
@@ -132,8 +132,7 @@
         namedParameterTypes.addLast(type);
       });
     }
-    return new FunctionType(
-        compiler.functionClass,
+    return new FunctionType.synthesized(
         returnType, parameterTypes, optionalParameterTypes,
         namedParameterNames.toLink(), namedParameterTypes.toLink());
   }
diff --git a/tests/compiler/dart2js_extra/isolate2_test.dart b/tests/compiler/dart2js_extra/isolate2_test.dart
deleted file mode 100644
index ea06acd..0000000
--- a/tests/compiler/dart2js_extra/isolate2_test.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2012, 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.
-
-// Dart test program for testing that exceptions in other isolates bring down
-// the program.
-// TODO(7769): Remove this test when
-// tests/isolate/isolate2_negative_test passes.
-
-library isolate2_negative_test;
-import 'dart:isolate';
-
-void entry(SendPort replyTo) {
-  throw "foo";  /// 01: runtime error
-  replyTo.send("done");
-}
-
-main() {
-  var port = new ReceivePort();
-  Isolate.spawn(entry, port.sendPort);
-  port.first;
-}
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index c445f42..71bd37c 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -29,18 +29,18 @@
 string_from_environment_test: Skip
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer]
-bool_from_environment2_test/01: Fail
-bool_from_environment2_test/02: Fail
-bool_from_environment2_test/03: Fail
-bool_from_environment2_test/04: Fail
-int_from_environment3_test/01: Fail
-int_from_environment3_test/02: Fail
-int_from_environment3_test/03: Fail
-int_from_environment3_test/04: Fail
-string_from_environment3_test/01: Fail
-string_from_environment3_test/02: Fail
-string_from_environment3_test/03: Fail
-string_from_environment3_test/04: Fail
+bool_from_environment2_test/01: Fail # Issue 18755
+bool_from_environment2_test/02: Fail # Issue 18755
+bool_from_environment2_test/03: Fail # Issue 18755
+bool_from_environment2_test/04: Fail # Issue 18755
+int_from_environment3_test/01: Fail # Issue 18755
+int_from_environment3_test/02: Fail # Issue 18755
+int_from_environment3_test/03: Fail # Issue 18755
+int_from_environment3_test/04: Fail # Issue 18755
+string_from_environment3_test/01: Fail # Issue 18755
+string_from_environment3_test/02: Fail # Issue 18755
+string_from_environment3_test/03: Fail # Issue 18755
+string_from_environment3_test/04: Fail # Issue 18755
 
 [ $compiler == none ]
 unicode_test: Fail        # Bug 6706
@@ -105,7 +105,7 @@
 
 [ $compiler == dart2js && ($runtime == firefox || $runtime == safari || $runtime == chrome || $runtime == drt) ]
 
-[ $compiler == dart2js && ($runtime == chrome || $runtime == drt || $runtime == safari || $runtime == safarimobilesim) ]
+[ $compiler == dart2js && ($runtime == drt || $runtime == safari || $runtime == safarimobilesim) ]
 string_trimlr_test/none: Fail # Bug in v8. Fixed in v8 r19222, 2014-02-10.
 
 [ $compiler == dart2js && ( $runtime == drt) ]
@@ -130,12 +130,12 @@
 error_stack_trace1_test: Fail # Fails in minified mode, test depends on method names.
 
 [ $compiler == dartanalyzer ]
-symbol_test/02: Fail
-symbol_test/03: Fail
-int_parse_radix_test: fail
-list_insert_test: fail
-list_removeat_test: fail
-symbol_test/01: fail # test issue 13730; It is static type warning if "const" instance creation argument type is not compatible with parameter type
+int_parse_radix_test: Fail, OK # Test contains errors but doesn’t mark them as expected
+list_insert_test: Fail, OK # Test contains errors but doesn’t mark them as expected
+list_removeat_test: Fail, OK # Test contains errors but doesn’t mark them as expected
+symbol_test/01: Fail, OK # Test Issue 13730; It is static type warning if "const" instance creation argument type is not compatible with parameter type
+symbol_test/02: Fail # Issue 18755
+symbol_test/03: Fail # Issue 18755
 
 [ $compiler == dart2analyzer ]
 symbol_test/02: Fail
@@ -149,10 +149,7 @@
 int_parse_radix_test: Skip # Timeout
 
 [ $arch == simarm && $checked ]
-num_parse_test: Pass, Timeout
-
-[ $arch == simarm64 ]
-*: Skip
+num_parse_test: Skip  # Pass, Timeout
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 error_stack_trace_test: StaticWarning, OK # Test generates errors on purpose.
diff --git a/tests/corelib/map_test.dart b/tests/corelib/map_test.dart
index a432b48..564cf88 100644
--- a/tests/corelib/map_test.dart
+++ b/tests/corelib/map_test.dart
@@ -14,6 +14,7 @@
   test(new MapView(new HashMap()));
   test(new MapView(new SplayTreeMap()));
   test(new MapBaseMap());
+  test(new MapMixinMap());
   testLinkedHashMap();
   testMapLiteral();
   testNullValue();
@@ -28,6 +29,7 @@
   testWeirdStringKeys(new SplayTreeMap());
   testWeirdStringKeys(new SplayTreeMap<String, String>());
   testWeirdStringKeys(new MapBaseMap<String, String>());
+  testWeirdStringKeys(new MapMixinMap<String, String>());
 
   testNumericKeys(new Map());
   testNumericKeys(new Map<num, String>());
@@ -40,6 +42,7 @@
   testNumericKeys(new LinkedHashMap.identity());
   testNumericKeys(new LinkedHashMap<num, String>.identity());
   testNumericKeys(new MapBaseMap<num, String>());
+  testNumericKeys(new MapMixinMap<num, String>());
 
   testNaNKeys(new Map());
   testNaNKeys(new Map<num, String>());
@@ -48,6 +51,7 @@
   testNaNKeys(new LinkedHashMap());
   testNaNKeys(new LinkedHashMap<num, String>());
   testNaNKeys(new MapBaseMap<num, String>());
+  testNaNKeys(new MapMixinMap<num, String>());
   // Identity maps fail the NaN-keys tests because the test assumes that
   // NaN is not equal to NaN.
 
@@ -96,6 +100,7 @@
                                   hashCode: (int v) => v.hashCode,
                                   isValidKey: (v) => v is int));
   testOtherKeys(new MapBaseMap<int, int>());
+  testOtherKeys(new MapMixinMap<int, int>());
 
   testUnmodifiableMap(const {1 : 37});
   testUnmodifiableMap(new UnmodifiableMapView({1 : 37}));
@@ -775,7 +780,7 @@
 
 
 // Slow implementation of Map based on MapBase.
-class MapBaseMap<K, V> extends MapBase<K, V> {
+abstract class MapBaseOperations<K, V> {
   final List _keys = <K>[];
   final List _values = <V>[];
   int _modCount = 0;
@@ -824,6 +829,9 @@
   }
 }
 
+class MapBaseMap<K, V> = MapBase<K, V> with MapBaseOperations<K, V>;
+class MapMixinMap<K, V> = MapBaseOperations<K, V> with MapMixin<K, V>;
+
 class TestKeyIterable<K> extends IterableBase<K> {
   final _map;
   TestKeyIterable(this._map);
diff --git a/tests/html/html.status b/tests/html/html.status
index deef6ce..92ca0f7 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -16,7 +16,7 @@
 [ $compiler == dart2js && $browser ]
 custom/created_callback_test: Fail # Support for created constructor.
 
-[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim || $runtime == ff || $runtime == chrome || $ie) ]
+[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim || $runtime == ff  || $ie) ]
 custom/entered_left_view_test/viewless_document: Fail # Polyfill does not handle this
 custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Polyfill does not support
 
diff --git a/tests/isolate/handle_error2_test.dart b/tests/isolate/handle_error2_test.dart
new file mode 100644
index 0000000..8a72a0e
--- /dev/null
+++ b/tests/isolate/handle_error2_test.dart
@@ -0,0 +1,89 @@
+// 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 handle_error_test;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+isomain1(replyPort) {
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (v) {
+    switch (v) {
+      case 0:
+        replyPort.send(42);
+        break;
+      case 1:
+        throw new ArgumentError("whoops");
+      case 2:
+        throw new RangeError.value(37);
+      case 3:
+        port.close();
+    }
+  };
+  replyPort.send(port.sendPort);
+}
+
+/// Do Isolate.spawn(entry) and get a sendPort from the isolate that it
+/// expects commands on.
+/// The isolate has errors set to non-fatal.
+/// Returns a list of `[isolate, commandPort]` in a future.
+Future spawn(entry) {
+  ReceivePort reply = new ReceivePort();
+  Future isolate = Isolate.spawn(entry, reply.sendPort, paused: true);
+  return isolate.then((Isolate isolate) {
+    isolate.setErrorsFatal(false);
+    isolate.resume(isolate.pauseCapability);
+    Future result = reply.first.then((sendPort) {
+      return [isolate, sendPort];
+    });
+    return result;
+  });
+}
+
+main(){
+  asyncStart();
+  RawReceivePort reply = new RawReceivePort(null);
+  RawReceivePort reply2 = new RawReceivePort(null);
+  // Create two isolates waiting for commands, with errors non-fatal.
+  Future iso1 = spawn(isomain1);
+  Future iso2 = spawn(isomain1);
+  Future.wait([iso1, iso2]).then((l) {
+    var isolate1 = l[0][0];
+    var sendPort1 = l[0][1];
+    var isolate2 = l[1][0];
+    var sendPort2 = l[1][1];
+    Stream errors = isolate1.errors;  // Broadcast stream, never a done message.
+    int state = 1;
+    var subscription;
+    subscription = errors.listen(null, onError: (error, stack) {
+      switch (state) {
+        case 1:
+          Expect.equals(new ArgumentError("whoops").toString(), "$error");
+          state++;
+          break;
+        case 2:
+          Expect.equals(new RangeError.value(37).toString(), "$error");
+          state++;
+          reply.close();
+          subscription.cancel();
+          asyncEnd();
+          break;
+        default:
+          throw "Bad state for error: $state: $error";
+      }
+    });
+    sendPort1.send(0);
+    sendPort2.send(0);
+    sendPort1.send(1);
+    sendPort2.send(1);
+    sendPort1.send(2);
+    sendPort2.send(2);
+    sendPort1.send(3);
+    sendPort2.send(3);
+  });
+}
+
diff --git a/tests/isolate/handle_error3_test.dart b/tests/isolate/handle_error3_test.dart
new file mode 100644
index 0000000..f992df0
--- /dev/null
+++ b/tests/isolate/handle_error3_test.dart
@@ -0,0 +1,116 @@
+// 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 handle_error_test;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+isomain1(replyPort) {
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (v) {
+    switch (v) {
+      case 0:
+        replyPort.send(42);
+        break;
+      case 1:
+        throw new ArgumentError("whoops");
+      case 2:
+        throw new RangeError.value(37);
+      case 3:
+        port.close();
+    }
+  };
+  replyPort.send(port.sendPort);
+}
+
+/// Do Isolate.spawn(entry) and get a sendPort from the isolate that it
+/// expects commands on.
+/// The isolate has errors set to non-fatal.
+/// Returns a list of `[isolate, commandPort]` in a future.
+Future spawn(entry) {
+  ReceivePort reply = new ReceivePort();
+  Future isolate = Isolate.spawn(entry, reply.sendPort, paused: true);
+  return isolate.then((Isolate isolate) {
+    isolate.setErrorsFatal(false);
+    isolate.resume(isolate.pauseCapability);
+    Future result = reply.first.then((sendPort) {
+      return [isolate, sendPort];
+    });
+    return result;
+  });
+}
+
+main(){
+  asyncStart();
+  asyncStart();
+  RawReceivePort reply = new RawReceivePort(null);
+  RawReceivePort reply2 = new RawReceivePort(null);
+  // Create two isolates waiting for commands, with errors non-fatal.
+  Future iso1 = spawn(isomain1);
+  Future iso2 = spawn(isomain1);
+  Future.wait([iso1, iso2]).then((l) {
+    var isolate1 = l[0][0];
+    var sendPort1 = l[0][1];
+    var isolate2 = l[1][0];
+    var sendPort2 = l[1][1];
+    // Capture errors from one isolate as stream.
+    Stream errors = isolate1.errors;  // Broadcast stream, never a done message.
+    int state = 1;
+    var subscription;
+    subscription = errors.listen(null, onError: (error, stack) {
+      switch (state) {
+        case 1:
+          Expect.equals(new ArgumentError("whoops").toString(), "$error");
+          state++;
+          break;
+        case 2:
+          Expect.equals(new RangeError.value(37).toString(), "$error");
+          state++;
+          reply.close();
+          subscription.cancel();
+          asyncEnd();
+          break;
+        default:
+          throw "Bad state for error: $state: $error";
+      }
+    });
+    // Capture errors from other isolate as raw messages.
+    RawReceivePort errorPort2 = new RawReceivePort();
+    int state2 = 1;
+    errorPort2.handler = (message) {
+      String error = message[0];
+      String stack = message[1];
+      switch (state2) {
+        case 1:
+          Expect.equals(new ArgumentError("whoops").toString(), "$error");
+          state2++;
+          break;
+        case 2:
+          Expect.equals(new RangeError.value(37).toString(), "$error");
+          state2++;
+          reply.close();
+          isolate2.removeErrorListener(errorPort2.sendPort);
+          errorPort2.close();
+          asyncEnd();
+          break;
+        default:
+          throw "Bad state-2 for error: $state: $error";
+      }
+    };
+    isolate2.addErrorListener(errorPort2.sendPort);
+
+    sendPort1.send(0);
+    sendPort2.send(0);
+    sendPort1.send(1);
+    sendPort2.send(1);
+    sendPort1.send(2);
+    sendPort2.send(2);
+    sendPort1.send(3);
+    sendPort2.send(3);
+  });
+}
+
diff --git a/tests/isolate/handle_error_test.dart b/tests/isolate/handle_error_test.dart
new file mode 100644
index 0000000..1b10247
--- /dev/null
+++ b/tests/isolate/handle_error_test.dart
@@ -0,0 +1,71 @@
+// 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 handle_error_test;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+isomain1(replyPort) {
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (v) {
+    switch (v) {
+      case 0:
+        replyPort.send(42);
+        break;
+      case 1:
+        throw new ArgumentError("whoops");
+      case 2:
+        throw new RangeError.value(37);
+      case 3:
+        port.close();
+    }
+  };
+  replyPort.send(port.sendPort);
+}
+
+main(){
+  asyncStart();
+  RawReceivePort reply = new RawReceivePort(null);
+  // Start paused so we have time to set up the error handler.
+  Isolate.spawn(isomain1, reply.sendPort, paused: true).then((Isolate isolate) {
+    isolate.setErrorsFatal(false);
+    Stream errors = isolate.errors;  // Broadcast stream, never a done message.
+    SendPort sendPort;
+    StreamSubscription subscription;
+    int state = 0;
+    reply.handler = (port) {
+      sendPort = port;
+      port.send(state);
+      reply.handler = (v) {
+        Expect.equals(0, state);
+        Expect.equals(42, v);
+        state++;
+        sendPort.send(state);
+      };
+    };
+    subscription = errors.listen(null, onError: (error, stack) {
+      switch (state) {
+        case 1:
+          Expect.equals(new ArgumentError("whoops").toString(), "$error");
+          state++;
+          sendPort.send(state);
+          break;
+        case 2:
+          Expect.equals(new RangeError.value(37).toString(), "$error");
+          state++;
+          sendPort.send(state);
+          reply.close();
+          subscription.cancel();
+          asyncEnd();
+          break;
+        default:
+          throw "Bad state for error: $state: $error";
+      }
+    });
+    isolate.resume(isolate.pauseCapability);
+  });
+}
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 0dd2952..1f685bf 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -9,15 +9,8 @@
 [ $runtime == vm && $arch == mips && $mode == debug ]
 mandel_isolate_test: Skip # Uses 600 MB Ram on our 1 GB test device.
 
-[ $runtime == vm && $arch == simarm && $mode == debug ]
-mandel_isolate_test: Crash, Pass # Issue 18670
-
-[ $runtime == vm && $arch == simarm64 ]
-*: Skip
-
 [ $compiler == none || $compiler == dart2dart ]
 serialization_test: SkipByDesign # Tests dart2js-specific serialization code
-isolate_throws_test/01: Skip # Issue 12587
 compile_time_error_test/01: Skip # Issue 12587
 capability_test: Fail   # Not implemented yet
 pause_test: Fail        # Not implemented yet
@@ -29,6 +22,9 @@
 kill2_test: Skip        # Not implemented yet, hangs.
 kill3_test: Skip        # Not implemented yet, hangs.
 kill_self_test: Skip    # Not implemented yet, hangs.
+handle_error_test: Skip # Not implemented yet, hangs.
+handle_error2_test: Skip # Not implemented yet, hangs.
+handle_error3_test: Skip # Not implemented yet, hangs.
 
 [ $compiler == dart2js && $jscl ]
 browser/*: SkipByDesign  # Browser specific tests
@@ -93,7 +89,6 @@
 [ $compiler == none && ( $runtime == dartium || $runtime == drt ) ]
 compile_time_error_test/none: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
 isolate_import_test/none: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
-isolate_throws_test/none: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
 simple_message_test/none: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
diff --git a/tests/isolate/isolate_throws_test.dart b/tests/isolate/isolate_throws_test.dart
deleted file mode 100644
index aecbe6e..0000000
--- a/tests/isolate/isolate_throws_test.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2012, 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.
-
-// Dart test program for testing that exceptions in other isolates bring down
-// the program.
-
-import 'dart:async';
-import 'dart:isolate';
-import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
-
-void entry(SendPort replyTo) {
-  throw "foo";  /// 01: runtime error
-  replyTo.send("done");
-}
-
-main() {
-  asyncStart();
-  ReceivePort rp = new ReceivePort();
-  Isolate.spawn(entry, rp.sendPort);
-  rp.first.then((msg) {
-    Expect.equals("done", msg);
-    asyncEnd();
-  });
-}
diff --git a/tests/language/arithmetic_smi_overflow_test.dart b/tests/language/arithmetic_smi_overflow_test.dart
new file mode 100644
index 0000000..a0abb27
--- /dev/null
+++ b/tests/language/arithmetic_smi_overflow_test.dart
@@ -0,0 +1,15 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+// VMOptions=--optimization_counter_threshold=5
+
+import "package:expect/expect.dart";
+
+main() {
+  for (var i = 0; i < 10; i++) {
+    Expect.equals(0x40000000, (i - i) - -1073741824);
+    Expect.equals(0x4000000000000000, (i - i) - -4611686018427387904);
+  }
+}
diff --git a/tests/language/const_constructor2_test.dart b/tests/language/const_constructor2_test.dart
index 2ebb00f..1335889 100644
--- a/tests/language/const_constructor2_test.dart
+++ b/tests/language/const_constructor2_test.dart
@@ -41,8 +41,8 @@
 }
 
 class G<W> implements F {
-  final field;
-  const G(W this.field);
+  final W field;
+  const G(field) : this.field = field;
 }
 
 main() {
diff --git a/tests/language/error_stacktrace_test.dart b/tests/language/error_stacktrace_test.dart
index 806f00a..9064dc0 100644
--- a/tests/language/error_stacktrace_test.dart
+++ b/tests/language/error_stacktrace_test.dart
@@ -84,9 +84,9 @@
     } on MyException catch (e) {
       i = 300;
       try {
-        // There should be no stackTrace in this normal excpetion object.
+        // There should be no stackTrace in this normal exception object.
         // We should get a NoSuchMethodError.
-        var trace = e.stackTrace;
+        var trace = e.stackTrace; /// static type warning
       } on NoSuchMethodError catch (e) {
         Expect.isNotNull(e.stackTrace, "Error needs a stackTrace on throw");
       }
diff --git a/tests/language/generic_field_mixin2_test.dart b/tests/language/generic_field_mixin2_test.dart
new file mode 100644
index 0000000..7413254
--- /dev/null
+++ b/tests/language/generic_field_mixin2_test.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.
+
+// Test that generic types in mixins are handled.
+
+import 'package:expect/expect.dart';
+
+class M<T> {
+  var field = T;
+}
+class A<U> {}
+class C1<V> = Object with M<V>;
+class C2 = Object with M<int>;
+class C3 = Object with M<String>;
+
+main() {
+  Expect.equals(int, new C1<int>().field);
+  Expect.equals(String, new C1<String>().field);
+
+  Expect.equals(int, new C2().field);
+
+  Expect.equals(String, new C3().field);
+}
\ No newline at end of file
diff --git a/tests/language/generic_field_mixin3_test.dart b/tests/language/generic_field_mixin3_test.dart
new file mode 100644
index 0000000..1af6d1e
--- /dev/null
+++ b/tests/language/generic_field_mixin3_test.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.
+
+// Test that generic types in mixins are handled.
+
+import 'package:expect/expect.dart';
+
+class M<T> {
+  var field = new A<int>() is A<T>;
+}
+class A<U> {}
+class C1<V> = Object with M<V>;
+class C2 = Object with M<int>;
+class C3 = Object with M<String>;
+
+main() {
+  Expect.isTrue(new C1<int>().field);
+  Expect.isFalse(new C1<String>().field);
+
+  Expect.isTrue(new C2().field);
+
+  Expect.isFalse(new C3().field);
+}
\ No newline at end of file
diff --git a/tests/language/generic_field_mixin4_test.dart b/tests/language/generic_field_mixin4_test.dart
new file mode 100644
index 0000000..b1490fd
--- /dev/null
+++ b/tests/language/generic_field_mixin4_test.dart
@@ -0,0 +1,32 @@
+// 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 generic types in mixins are handled.
+
+import 'package:expect/expect.dart';
+
+class M<T> {
+  var field = () {
+    try {
+      throw 0;
+    } on T catch (e) {
+      return true;
+    } catch (e) {
+    }
+    return false;
+  }();
+}
+class A<U> {}
+class C1<V> = Object with M<V>;
+class C2 = Object with M<int>;
+class C3 = Object with M<String>;
+
+main() {
+  Expect.isTrue(new C1<int>().field);
+  Expect.isFalse(new C1<String>().field);
+
+  Expect.isTrue(new C2().field);
+
+  Expect.isFalse(new C3().field);
+}
\ No newline at end of file
diff --git a/tests/language/generic_field_mixin5_test.dart b/tests/language/generic_field_mixin5_test.dart
new file mode 100644
index 0000000..62eea0a
--- /dev/null
+++ b/tests/language/generic_field_mixin5_test.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.
+
+// Test that generic types in mixins are handled.
+
+import 'package:expect/expect.dart';
+
+class M<T> {
+  var field = () { return T; } ();
+}
+class A<U> {}
+class C1<V> = Object with M<V>;
+class C2 = Object with M<int>;
+class C3 = Object with M<String>;
+
+main() {
+  Expect.equals(int, new C1<int>().field);
+  Expect.equals(String, new C1<String>().field);
+
+  Expect.equals(int, new C2().field);
+
+  Expect.equals(String, new C3().field);
+}
\ No newline at end of file
diff --git a/tests/language/generic_field_mixin6_test.dart b/tests/language/generic_field_mixin6_test.dart
new file mode 100644
index 0000000..d4d4095
--- /dev/null
+++ b/tests/language/generic_field_mixin6_test.dart
@@ -0,0 +1,61 @@
+// 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 generic types in mixins are handled.
+
+import 'package:expect/expect.dart';
+
+class M<T> {
+  T field = 0; /// 01: static type warning
+}
+class A<U> {}
+class C1<V> = Object with M<V>;
+class C2 = Object with M<int>;
+class C3 = Object with M<String>;
+
+main() {
+  checkNoDynamicTypeError(() => new C1<int>());  /// 01: continued
+  checkDynamicTypeError(() => new C1<String>()); /// 01: continued
+
+  checkNoDynamicTypeError(() => new C2());       /// 01: continued
+
+  checkDynamicTypeError(() => new C3());         /// 01: continued
+}
+
+/// Returns `true` if the program is running in checked mode.
+bool inCheckedMode() {
+  try {
+    var i = 42;
+    String s = i;
+  } on TypeError catch (e) {
+    return true;
+  }
+  return false;
+}
+
+/// Checks that a dynamic type error is thrown if and only if [f] is executed in
+/// checked mode.
+void checkDynamicTypeError(f(), [String message]) {
+  message = message != null ? ': $message' : '';
+  try {
+    f();
+    Expect.isFalse(inCheckedMode(),
+      'Missing type error in checked mode$message.');
+  } on TypeError catch (e) {
+    Expect.isTrue(inCheckedMode(),
+      'Unexpected type error in production mode.');
+  }
+}
+
+/// Checks that no dynamic type error is thrown when [f] is executed regardless
+/// of execution mode.
+void checkNoDynamicTypeError(f(), [String message]) {
+  message = message != null ? ': $message' : '';
+  try {
+    f();
+  } on TypeError catch (e) {
+    String mode = inCheckedMode() ? 'checked mode' : 'production mode';
+    Expect.fail('Unexpected type error in $mode$message.');
+  }
+}
diff --git a/tests/language/generic_field_mixin_test.dart b/tests/language/generic_field_mixin_test.dart
new file mode 100644
index 0000000..267a8b7
--- /dev/null
+++ b/tests/language/generic_field_mixin_test.dart
@@ -0,0 +1,28 @@
+// 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 generic types in mixins are handled.
+
+import 'package:expect/expect.dart';
+
+class M<T> {
+  var field = new A<T>();
+}
+class A<U> {}
+class C1<V> = Object with M<V>;
+class C2 = Object with M<int>;
+class C3 = Object with M<String>;
+
+main() {
+  Expect.isTrue(new C1<int>().field is A<int>);
+  Expect.isFalse(new C1<int>().field is A<String>);
+  Expect.isFalse(new C1<String>().field is A<int>);
+  Expect.isTrue(new C1<String>().field is A<String>);
+
+  Expect.isTrue(new C2().field is A<int>);
+  Expect.isFalse(new C2().field is A<String>);
+
+  Expect.isFalse(new C3().field is A<int>);
+  Expect.isTrue(new C3().field is A<String>);
+}
\ No newline at end of file
diff --git a/tests/language/if_flatten1_test.dart b/tests/language/if_flatten1_test.dart
new file mode 100644
index 0000000..0a37d56
--- /dev/null
+++ b/tests/language/if_flatten1_test.dart
@@ -0,0 +1,82 @@
+// 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';
+
+var global;
+
+setGlobal(v) {
+  global = v;
+}
+
+check_true_true(x, y, v) {
+  if (x) {
+    if (y) {
+      setGlobal(v);
+    }
+  }
+}
+
+check_false_true(x, y, v) {
+  if (x) {
+
+  } else {
+    if (y) {
+      setGlobal(v);
+    }
+  }
+}
+
+check_true_false(x, y, v) {
+  if (x) {
+    if (y) {
+
+    } else {
+      setGlobal(v);
+    }
+  }
+}
+
+check_false_false(x, y, v) {
+  if (x) {
+
+  } else {
+    if (y) {
+
+    } else {
+      setGlobal(v);
+    }
+  }
+}
+
+
+main() {
+  check_true_true(true,  true,  4);
+  check_true_true(false, false, 1);
+  check_true_true(false, true,  2);
+  check_true_true(true,  false, 3);
+
+  Expect.equals(4, global);
+
+  check_true_false(false, false, 1);
+  check_true_false(false, true,  2);
+  check_true_false(true,  false, 3);
+  check_true_false(true,  true,  4);
+
+  Expect.equals(3, global);
+
+  check_false_true(false, false, 1);
+  check_false_true(false, true,  2);
+  check_false_true(true,  false, 3);
+  check_false_true(true,  true,  4);
+
+  Expect.equals(2, global);
+
+  check_false_false(false, false, 1);
+  check_false_false(false, true,  2);
+  check_false_false(true,  false, 3);
+  check_false_false(true,  true,  4);
+
+  Expect.equals(1, global);
+}
diff --git a/tests/language/if_flatten2_test.dart b/tests/language/if_flatten2_test.dart
new file mode 100644
index 0000000..0cc1192
--- /dev/null
+++ b/tests/language/if_flatten2_test.dart
@@ -0,0 +1,72 @@
+// 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';
+
+check_true_true(x, y) {
+  if (x) {
+    if (y) {
+      return true;
+    }
+  }
+  return false;
+}
+
+check_false_true(x, y) {
+  if (x) {
+
+  } else {
+    if (y) {
+      return true;
+    }
+  }
+  return false;
+}
+
+check_true_false(x, y) {
+  if (x) {
+    if (y) {
+
+    } else {
+      return true;
+    }
+  }
+  return false;
+}
+
+check_false_false(x, y) {
+  if (x) {
+
+  } else {
+    if (y) {
+
+    } else {
+      return true;
+    }
+  }
+  return false;
+}
+
+
+main() {
+  Expect.equals(true, check_true_true(true, true));
+  Expect.equals(false, check_true_true(true, false));
+  Expect.equals(false, check_true_true(false, true));
+  Expect.equals(false, check_true_true(false, false));
+
+  Expect.equals(false, check_true_false(true, true));
+  Expect.equals(true, check_true_false(true, false));
+  Expect.equals(false, check_true_false(false, true));
+  Expect.equals(false, check_true_false(false, false));
+
+  Expect.equals(false, check_false_true(true, true));
+  Expect.equals(false, check_false_true(true, false));
+  Expect.equals(true, check_false_true(false, true));
+  Expect.equals(false, check_false_true(false, false));
+
+  Expect.equals(false, check_false_false(true, true));
+  Expect.equals(false, check_false_false(true, false));
+  Expect.equals(false, check_false_false(false, true));
+  Expect.equals(true, check_false_false(false, false));
+}
diff --git a/tests/language/issue15720_test.dart b/tests/language/issue15720_test.dart
new file mode 100644
index 0000000..638fc98
--- /dev/null
+++ b/tests/language/issue15720_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2011, 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.
+
+// Regression test for dart2js, issue 15720.
+
+class B {}
+
+confuse(x) {
+  if (new DateTime.now() == 42) return confuse(x);
+  return x;
+}
+
+main() {
+  Set<B> set = new Set<B>.from([]);
+
+  confuse(499);
+  confuse(set);
+
+  // Dart2js used to reuse a variable name, overwriting the `set` variable with
+  // one of the B's.
+  var t1 = new B();
+  var t2 = new B();
+  var t3 = new B();
+  var t4 = new B();
+
+  set.addAll([t1, t2, t3, t4]);
+  confuse(7);
+
+  set.addAll([t1, t2, t3, t4]);
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index 8a67e43..13e902c 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -123,21 +123,3 @@
 [ $compiler == none && $runtime == vm && $arch == mips && $mode == debug ]
 stack_overflow_test: Skip # Crashes. Issue 17440.
 stack_overflow_stacktrace_test: Skip # Crashes. Issue 17440.
-
-# arm64 port is WIP. No issue numbers until we're a bit further along.
-[ $compiler == none && $runtime == vm && $arch == simarm64 ]
-vm/regress_16873_test: Skip # Pass, Slow
-
-# Unimplemented features
-vm/string_polymorphic_test: Crash
-vm/optimization_test: Crash
-vm/math_vm_test: Crash
-vm/deopt_hoisted_smi_check_vm_test:Crash
-vm/reusable_boxes_test: Crash
-vm/allocation_sinking_vm_test: Crash
-double_modulo_test: Crash
-modulo_test: Crash
-guess_cid_test: Crash
-arithmetic_canonicalization_test: Crash
-try_catch_optimized1_test: Crash
-arithmetic_test: Crash
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 0332d8d..d8ff939 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -13,13 +13,8 @@
 override_field_test/03: fail
 method_override7_test/03: Fail # Issue 11496
 
-unicode_bom_test: Fail # Issue 16314
-
 type_check_const_function_typedef2_test/00: MissingCompileTimeError, Ok # Compile-time error in checked mode, because of constants.
 
-const_map2_test/00: MissingCompileTimeError # Issue 17209
-switch_case_test/none: CompileTimeError # Issue 17209
-
 call_closurization_test: StaticWarning # Issue 17476
 
 # Please add new failing tests before this line.
@@ -28,7 +23,7 @@
 #
 
 ref_before_declaration_test/none: fail # test issue 14879, "P" is not defined
-bad_initializer2_negative_test: fail # tester issue 14880, Analyzer reports compile-time error, but test runner is not satisfied
+bad_initializer2_negative_test: fail # Issue 14880, Analyzer reports compile-time error, but test runner is not satisfied
 
 # test issue 11124, It is warning, not error to don't initialize final field
 field3a_negative_test: Fail # Issue 11124
@@ -64,7 +59,7 @@
 getter_no_setter_test/none: fail
 
 # test issue 11584, positional arguments cannot be used for named parameters
-compile_time_constant_e_test: fail
+compile_time_constant_e_test: fail # Test Issue 11584
 
 # test issue 11585, static warning, not negative test
 constructor3_negative_test: fail
@@ -78,10 +73,6 @@
 import_combinators_negative_test: fail
 interface_static_non_final_fields_negative_test: fail
 
-# test issue 11918: mixin and const constructor
-const_constructor_mixin_test/01: fail
-const_constructor_mixin3_test/01: fail
-
 # test issue 11962, it is warning, not error to reference undeclared identifier
 prefix1_negative_test: fail
 prefix2_negative_test: fail
@@ -114,9 +105,6 @@
 # test issue 12381, It is compile-time error to invoke not existing function
 issue11724_test: fail # Issue 12381
 
-# test issue 12539, rules for finals were loosened, contradiction in spec was fixed
-const_syntax_test/09: fail # Issue 12539
-
 # test issue 12541; there shouldn't be a static warning
 static_field_test/01: fail # Issue 12541
 static_field_test/02: fail # Issue 12541
@@ -177,7 +165,6 @@
 override_inheritance_generic_test/08: MissingStaticWarning # Issue 17983
 override_inheritance_field_test/32: MissingStaticWarning # Issue 17983
 override_inheritance_field_test/09: MissingStaticWarning # Issue 17983
-override_inheritance_abstract_test/27: StaticWarning # Issue 17983
 
 # missing warning for override
 override_inheritance_generic_test/07: MissingStaticWarning # Issue 16135
@@ -188,15 +175,17 @@
 override_inheritance_field_test/33a: MissingStaticWarning, Pass # Issue 16498
 override_inheritance_generic_test/09: MissingStaticWarning, Pass # Issue 16498
 
-# missing warning for assignment to method
-assign_top_method_test/01: MissingStaticWarning # Issue 16672
+# The following tests are currently assumed to be failing because the test is wrong.
+#
+application_negative_test: CompileTimeError # Test Issue 14528
+bad_constructor_test/05: CompileTimeError # Test Issue 5337
+bad_initializer1_negative_test: CompileTimeError # Test Issue 14529
+bad_named_constructor_negative_test: CompileTimeError # Test Issue 18693
+body_less_constructor_wrong_arg_negative_test: CompileTimeError # Test Issue 18695
+empty_block_case_test: StaticWarning # Test Issue 18701
+error_stacktrace_test: StaticWarning # Test Issue 18702
+external_test/20: StaticWarning # Test Issue 18703
 
-abstract_object_method_test: StaticWarning
-application_negative_test: CompileTimeError
-bad_constructor_test/05: CompileTimeError
-bad_initializer1_negative_test: CompileTimeError
-bad_named_constructor_negative_test: CompileTimeError
-body_less_constructor_wrong_arg_negative_test: CompileTimeError
 const_counter_negative_test: CompileTimeError
 const_optional_args_negative_test: CompileTimeError
 constructor_redirect1_negative_test: CompileTimeError
@@ -204,24 +193,21 @@
 constructor_setter_negative_test: CompileTimeError
 duplicate_export_negative_test: CompileTimeError
 duplicate_interface_negative_test: CompileTimeError
-empty_block_case_test: StaticWarning
-error_stacktrace_test: StaticWarning
 export_ambiguous_main_negative_test: CompileTimeError
 extend_type_parameter2_negative_test: CompileTimeError
 extend_type_parameter_negative_test: CompileTimeError
-external_test/20: StaticWarning
 factory2_negative_test: CompileTimeError
-factory2_test: StaticWarning
+factory2_test: StaticWarning # Test Issue 18727
 factory3_negative_test: CompileTimeError
-factory3_test: StaticWarning
-factory4_test: StaticWarning
+factory3_test: StaticWarning # Test Issue 18727
+factory4_test: StaticWarning # Test Issue 18727
 factory_implementation_test/00: StaticWarning
 factory_negative_test: CompileTimeError
-factory_redirection_test/01: StaticWarning
-factory_redirection_test/03: StaticWarning
-factory_redirection_test/05: StaticWarning
-factory_redirection_test/06: StaticWarning
-factory_return_type_checked_test: StaticWarning
+factory_redirection_test/01: StaticWarning # Test Issue 11578
+factory_redirection_test/03: StaticWarning # Test Issue 11578
+factory_redirection_test/05: StaticWarning # Test Issue 11578
+factory_redirection_test/06: StaticWarning # Test Issue 11578
+factory_return_type_checked_test: StaticWarning # Test Issue 18728
 f_bounded_quantification4_test: StaticWarning
 f_bounded_quantification5_test: StaticWarning
 field1_negative_test: CompileTimeError
@@ -231,7 +217,7 @@
 field5_negative_test: CompileTimeError
 field6a_negative_test: CompileTimeError
 field6_negative_test: CompileTimeError
-first_class_types_literals_test: StaticWarning
+first_class_types_literals_test: StaticWarning # Issue 18731
 function_malformed_result_type_test: StaticWarning
 function_subtype_bound_closure7_test: StaticWarning
 function_subtype_checked0_test: StaticWarning
@@ -444,12 +430,14 @@
 vm/type_vm_test: StaticWarning
 void_type_test: StaticWarning
 
+issue13474_test: StaticWarning, OK # Test Issue
+
 # Issue 16391. The analyzer handle compile-time error in checked only in these
 # cases:
-compile_time_constant_checked2_test/01: CompileTimeError # Issue 16391
-compile_time_constant_checked2_test/05: CompileTimeError # Issue 16391
-compile_time_constant_checked3_test/01: CompileTimeError # Issue 16391
-compile_time_constant_checked3_test/05: CompileTimeError # Issue 16391
+compile_time_constant_checked2_test/01: CompileTimeError # Language Issue 16391
+compile_time_constant_checked2_test/05: CompileTimeError # Language Issue 16391
+compile_time_constant_checked3_test/01: CompileTimeError # Language Issue 16391
+compile_time_constant_checked3_test/05: CompileTimeError # Language Issue 16391
 list_literal1_test/01: CompileTimeError # Issue 16391
 map_literal1_test/01: CompileTimeError # Issue 16391
 
@@ -457,12 +445,6 @@
 deferred_constraints_type_annotation_old_syntax_test/*: Pass, Fail
 deferred_constraints_constants_old_syntax_test/*: Pass, Fail
 
-# Issue 18562- 'is', 'as' and 'catch' aren't type annotations, thus we don't
-# generate the "The deferred types cannot be used in a declaration" warning
-deferred_constraints_type_annotation_test/as_operation: MissingStaticWarning
-deferred_constraints_type_annotation_test/is_check: MissingStaticWarning
-deferred_constraints_type_annotation_test/catch_check: MissingStaticWarning
-
 # The following lines have been left in to quickly switch back to having deferred loading
 # off by default again.
 # Deferred loading support, tests marked as failing until support is enabled by default.
@@ -477,28 +459,9 @@
 
 # Issues to be fixed now that type parameters have been fixed
 # (issues 14221, 15553)
-const_constructor2_test/01: StaticWarning
-const_constructor2_test/02: StaticWarning
-const_constructor2_test/03: StaticWarning
-const_constructor2_test/04: StaticWarning
-const_constructor2_test/05: StaticWarning
-const_constructor2_test/06: StaticWarning
-const_constructor2_test/07: StaticWarning
-const_constructor2_test/08: StaticWarning
-const_constructor2_test/09: StaticWarning
-const_constructor2_test/10: StaticWarning
-const_constructor2_test/11: StaticWarning
-const_constructor2_test/12: StaticWarning
-const_constructor2_test/19: StaticWarning
-const_constructor2_test/20: StaticWarning
-const_constructor2_test/21: StaticWarning
-const_constructor2_test/22: StaticWarning
-const_constructor2_test/23: StaticWarning
-const_constructor2_test/24: StaticWarning
-const_constructor2_test/none: StaticWarning
-factory1_test/00: StaticWarning
-factory1_test/01: StaticWarning
-factory1_test/none: StaticWarning
+factory1_test/00: StaticWarning # Test Issue 18726
+factory1_test/01: StaticWarning # Test Issue 18726
+factory1_test/none: StaticWarning # Test Issue 18726
 generic_closure_test: StaticWarning
 local_function2_test: StaticWarning
 redirecting_factory_long_test: StaticWarning
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 46fe07f..fd819b5 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -13,13 +13,8 @@
 override_field_test/03: fail
 method_override7_test/03: Fail # Issue 11496
 
-#unicode_bom_test: Fail # Issue 16314
-
 type_check_const_function_typedef2_test/00: MissingCompileTimeError, Ok # Compile-time error in checked mode, because of constants.
 
-const_map2_test/00: MissingCompileTimeError # Issue 17209
-switch_case_test/none: CompileTimeError # Issue 17209
-
 call_closurization_test: StaticWarning # Issue 17476
 
 # Please add new failing tests before this line.
@@ -28,7 +23,7 @@
 #
 
 ref_before_declaration_test/none: fail # test issue 14879, "P" is not defined
-bad_initializer2_negative_test: fail # tester issue 14880, Analyzer reports compile-time error, but test runner is not satisfied
+bad_initializer2_negative_test: fail # Issue 14880, Analyzer reports compile-time error, but test runner is not satisfied
 
 # test issue 11124, It is warning, not error to don't initialize final field
 field3a_negative_test: Fail # Issue 11124
@@ -64,7 +59,7 @@
 getter_no_setter_test/none: fail
 
 # test issue 11584, positional arguments cannot be used for named parameters
-compile_time_constant_e_test: fail
+compile_time_constant_e_test: fail # Test Issue 11584
 
 # test issue 11585, static warning, not negative test
 constructor3_negative_test: fail
@@ -78,13 +73,6 @@
 import_combinators_negative_test: fail
 interface_static_non_final_fields_negative_test: fail
 
-# test issue 11697: switch/case and static const class member
-switch_case_static_const_test: fail
-
-# test issue 11918: mixin and const constructor
-const_constructor_mixin_test/01: fail
-const_constructor_mixin3_test/01: fail
-
 # test issue 11962, it is warning, not error to reference undeclared identifier
 prefix1_negative_test: fail
 prefix2_negative_test: fail
@@ -117,9 +105,6 @@
 # test issue 12381, It is compile-time error to invoke not existing function
 issue11724_test: fail # Issue 12381
 
-# test issue 12539, rules for finals were loosened, contradiction in spec was fixed
-const_syntax_test/09: fail # Issue 12539
-
 # test issue 12541; there shouldn't be a static warning
 static_field_test/01: fail # Issue 12541
 static_field_test/02: fail # Issue 12541
@@ -191,41 +176,41 @@
 override_inheritance_field_test/33a: MissingStaticWarning, Pass # Issue 16498
 override_inheritance_generic_test/09: MissingStaticWarning, Pass # Issue 16498
 
-# missing warning for assignment to method
-assign_top_method_test/01: MissingStaticWarning # Issue 16672
+abstract_object_method_test: StaticWarning # Issue 14527
 
-abstract_object_method_test: StaticWarning
-application_negative_test: CompileTimeError
-bad_constructor_test/05: CompileTimeError
-bad_initializer1_negative_test: CompileTimeError
-bad_named_constructor_negative_test: CompileTimeError
-body_less_constructor_wrong_arg_negative_test: CompileTimeError
+# The following tests are currently assumed to be failing because the test is wrong.
+#
+application_negative_test: CompileTimeError # Test Issue 14528
+bad_constructor_test/05: CompileTimeError # Test Issue 5337
+bad_initializer1_negative_test: CompileTimeError # Test Issue 14529
+bad_named_constructor_negative_test: CompileTimeError # Test Issue 18693
+body_less_constructor_wrong_arg_negative_test: CompileTimeError # Test Issue 18695
+empty_block_case_test: StaticWarning # Test Issue 18701
+error_stacktrace_test: StaticWarning # Test Issue 18702
+external_test/20: StaticWarning # Test Issue 18703
+
 const_counter_negative_test: CompileTimeError
-const_map3_test/00: MissingCompileTimeError
 const_optional_args_negative_test: CompileTimeError
 constructor_redirect1_negative_test: CompileTimeError
 constructor_redirect2_negative_test: CompileTimeError
 constructor_setter_negative_test: CompileTimeError
 duplicate_export_negative_test: CompileTimeError
 duplicate_interface_negative_test: CompileTimeError
-empty_block_case_test: StaticWarning
-error_stacktrace_test: StaticWarning
 export_ambiguous_main_negative_test: CompileTimeError
 extend_type_parameter2_negative_test: CompileTimeError
 extend_type_parameter_negative_test: CompileTimeError
-external_test/20: StaticWarning
 factory2_negative_test: CompileTimeError
-factory2_test: StaticWarning
+factory2_test: StaticWarning # Test Issue 18727
 factory3_negative_test: CompileTimeError
-factory3_test: StaticWarning
-factory4_test: StaticWarning
+factory3_test: StaticWarning # Test Issue 18727
+factory4_test: StaticWarning # Test Issue 18727
 factory_implementation_test/00: StaticWarning
 factory_negative_test: CompileTimeError
-factory_redirection_test/01: StaticWarning
-factory_redirection_test/03: StaticWarning
-factory_redirection_test/05: StaticWarning
-factory_redirection_test/06: StaticWarning
-factory_return_type_checked_test: StaticWarning
+factory_redirection_test/01: StaticWarning # Test Issue 11578
+factory_redirection_test/03: StaticWarning # Test Issue 11578
+factory_redirection_test/05: StaticWarning # Test Issue 11578
+factory_redirection_test/06: StaticWarning # Test Issue 11578
+factory_return_type_checked_test: StaticWarning # Test Issue 18728
 f_bounded_quantification4_test: StaticWarning
 f_bounded_quantification5_test: StaticWarning
 field1_negative_test: CompileTimeError
@@ -235,7 +220,7 @@
 field5_negative_test: CompileTimeError
 field6a_negative_test: CompileTimeError
 field6_negative_test: CompileTimeError
-first_class_types_literals_test: StaticWarning
+first_class_types_literals_test: StaticWarning # Issue 18731
 function_malformed_result_type_test: StaticWarning
 function_subtype_bound_closure7_test: StaticWarning
 function_subtype_checked0_test: StaticWarning
@@ -448,12 +433,14 @@
 vm/type_vm_test: StaticWarning
 void_type_test: StaticWarning
 
+issue13474_test: StaticWarning, OK # Test Issue
+
 # Issue 16391. The analyzer handle compile-time error in checked only in these
 # cases:
-compile_time_constant_checked2_test/01: CompileTimeError # Issue 16391
-compile_time_constant_checked2_test/05: CompileTimeError # Issue 16391
-compile_time_constant_checked3_test/01: CompileTimeError # Issue 16391
-compile_time_constant_checked3_test/05: CompileTimeError # Issue 16391
+compile_time_constant_checked2_test/01: CompileTimeError # Language Issue 16391
+compile_time_constant_checked2_test/05: CompileTimeError # Language Issue 16391
+compile_time_constant_checked3_test/01: CompileTimeError # Language Issue 16391
+compile_time_constant_checked3_test/05: CompileTimeError # Language Issue 16391
 list_literal1_test/01: CompileTimeError # Issue 16391
 map_literal1_test/01: CompileTimeError # Issue 16391
 
@@ -461,36 +448,23 @@
 deferred_constraints_type_annotation_old_syntax_test/*: Pass, Fail
 deferred_constraints_constants_old_syntax_test/*: Pass, Fail
 
-# Issue 18562- 'is', 'as' and 'catch' aren't type annotations, thus we don't
-# generate the "The deferred types cannot be used in a declaration" warning
-deferred_constraints_type_annotation_test/as_operation: MissingStaticWarning
-deferred_constraints_type_annotation_test/is_check: MissingStaticWarning
-deferred_constraints_type_annotation_test/catch_check: MissingStaticWarning
+# The following lines have been left in to quickly switch back to having deferred loading
+# off by default again.
+# Deferred loading support, tests marked as failing until support is enabled by default.
+#deferred_closurize_load_library_test: Pass, Fail
+#deferred_not_loaded_check_test/*: Pass, Fail
+#deferred_shadow_load_library_test: Pass, Fail
+#deferred_constraints_constants_test/*: Pass, Fail
+#deferred_load_library_wrong_args_test/*: Pass, Fail
+#deferred_constraints_type_annotation_test/*: Pass, Fail
+#deferred_load_inval_code_test: Pass, Fail
+#deferred_not_loaded_check_test: Pass, Fail
 
 # Issues to be fixed now that type parameters have been fixed
 # (issues 14221, 15553)
-const_constructor2_test/01: StaticWarning
-const_constructor2_test/02: StaticWarning
-const_constructor2_test/03: StaticWarning
-const_constructor2_test/04: StaticWarning
-const_constructor2_test/05: StaticWarning
-const_constructor2_test/06: StaticWarning
-const_constructor2_test/07: StaticWarning
-const_constructor2_test/08: StaticWarning
-const_constructor2_test/09: StaticWarning
-const_constructor2_test/10: StaticWarning
-const_constructor2_test/11: StaticWarning
-const_constructor2_test/12: StaticWarning
-const_constructor2_test/19: StaticWarning
-const_constructor2_test/20: StaticWarning
-const_constructor2_test/21: StaticWarning
-const_constructor2_test/22: StaticWarning
-const_constructor2_test/23: StaticWarning
-const_constructor2_test/24: StaticWarning
-const_constructor2_test/none: StaticWarning
-factory1_test/00: StaticWarning
-factory1_test/01: StaticWarning
-factory1_test/none: StaticWarning
+factory1_test/00: StaticWarning # Test Issue 18726
+factory1_test/01: StaticWarning # Test Issue 18726
+factory1_test/none: StaticWarning # Test Issue 18726
 generic_closure_test: StaticWarning
 local_function2_test: StaticWarning
 redirecting_factory_long_test: StaticWarning
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 27041c4..b46eadb 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -72,6 +72,8 @@
 positional_parameters_type_test/01: MissingRuntimeError, OK
 positional_parameters_type_test/02: MissingRuntimeError, OK
 issue13474_test: RuntimeError, OK
+generic_field_mixin3_test: Crash # Issue 18651
+
 
 [ $compiler == dart2js && $minified ]
 cyclic_type_test/0*: Fail # Issue 12605
@@ -88,6 +90,9 @@
 mixin_mixin_bound2_test: RuntimeError # Issue 12605
 
 [ $compiler == dart2js ]
+generic_field_mixin4_test: Crash # Issue 18651
+generic_field_mixin5_test: Crash # Issue 18651
+
 type_variable_conflict2_test/01: RuntimeError # Issue 16180
 type_variable_conflict2_test/02: Crash # Issue 16180
 type_variable_conflict2_test/06: Crash # Issue 16180
diff --git a/tests/language/logical_rewrite_test.dart b/tests/language/logical_rewrite_test.dart
new file mode 100644
index 0000000..506bff3
--- /dev/null
+++ b/tests/language/logical_rewrite_test.dart
@@ -0,0 +1,111 @@
+// 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';
+
+cneg_and(x, y) {
+    if ((x && y) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+cneg_and_not(x, y) {
+    if ((x && (y ? false : true)) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+cneg_not_and(x, y) {
+    if (((x ? false : true) && y) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+cneg_not_and_not(x, y) {
+    if (((x ? false : true) && (y ? false : true)) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+cneg_or(x, y) {
+    if ((x || y) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+cneg_or_not(x, y) {
+    if ((x || (y ? false : true)) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+cneg_not_or(x, y) {
+    if (((x ? false : true) || y) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+cneg_not_or_not(x, y) {
+    if (((x ? false : true) || (y ? false : true)) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+main() {
+    Expect.equals(1, cneg_and(true, true));
+    Expect.equals(0, cneg_and(true, false));
+    Expect.equals(0, cneg_and(false, true));
+    Expect.equals(0, cneg_and(false, false));
+
+    Expect.equals(0, cneg_and_not(true, true));
+    Expect.equals(1, cneg_and_not(true, false));
+    Expect.equals(0, cneg_and_not(false, true));
+    Expect.equals(0, cneg_and_not(false, false));
+
+    Expect.equals(0, cneg_not_and(true, true));
+    Expect.equals(0, cneg_not_and(true, false));
+    Expect.equals(1, cneg_not_and(false, true));
+    Expect.equals(0, cneg_not_and(false, false));
+
+    Expect.equals(0, cneg_not_and_not(true, true));
+    Expect.equals(0, cneg_not_and_not(true, false));
+    Expect.equals(0, cneg_not_and_not(false, true));
+    Expect.equals(1, cneg_not_and_not(false, false));
+
+    Expect.equals(1, cneg_or(true, true));
+    Expect.equals(1, cneg_or(true, false));
+    Expect.equals(1, cneg_or(false, true));
+    Expect.equals(0, cneg_or(false, false));
+
+    Expect.equals(1, cneg_or_not(true, true));
+    Expect.equals(1, cneg_or_not(true, false));
+    Expect.equals(0, cneg_or_not(false, true));
+    Expect.equals(1, cneg_or_not(false, false));
+
+    Expect.equals(1, cneg_not_or(true, true));
+    Expect.equals(0, cneg_not_or(true, false));
+    Expect.equals(1, cneg_not_or(false, true));
+    Expect.equals(1, cneg_not_or(false, false));
+
+    Expect.equals(0, cneg_not_or_not(true, true));
+    Expect.equals(1, cneg_not_or_not(true, false));
+    Expect.equals(1, cneg_not_or_not(false, true));
+    Expect.equals(1, cneg_not_or_not(false, false));
+}
diff --git a/tests/language/malformed_bound_test.dart b/tests/language/malformed_bound_test.dart
new file mode 100644
index 0000000..061c3b9
--- /dev/null
+++ b/tests/language/malformed_bound_test.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.
+
+// Test that a malformed type variable bound is treated as dynamic.
+
+class C<T
+  extends Malformed /// 01: static type warning, runtime error
+> {
+  f(T t) => t.foo; /// 01: continued
+}
+
+main() {
+  new C<int>()
+    .f(1) /// 01: continued
+  ;
+}
diff --git a/tests/language/mega_load_test.dart b/tests/language/mega_load_test.dart
index a5d4591..e7fc237 100644
--- a/tests/language/mega_load_test.dart
+++ b/tests/language/mega_load_test.dart
@@ -2,6 +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.
 // Test megamorphic, but single target field load.
+// VMOptions=--optimization-counter-threshold=10
 
 import "package:expect/expect.dart";
 
@@ -149,7 +150,7 @@
 main() {
   var list = allocateObjects();
   // Make sure the optimizer triggers the compilation of callThemAll.
-  for (var i = 0; i < 500; i++) {
+  for (var i = 0; i < 20; i++) {
     callThemAll(list);
   }
 }
diff --git a/tests/language/regress_18435_test.dart b/tests/language/regress_18435_test.dart
new file mode 100644
index 0000000..267562f
--- /dev/null
+++ b/tests/language/regress_18435_test.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.
+
+// Regression test for issue 18435.
+
+import "package:expect/expect.dart";
+
+main() {
+  const MISSING_VALUE = "MISSING_VALUE";
+
+  void foo([var p1 = MISSING_VALUE, var p2 = MISSING_VALUE]) {
+    Expect.equals("P1", p1);
+    Expect.equals("P2", p2);
+  }
+
+  void bar([var p1 = "MISSING_VALUE", var p2 = "MISSING_VALUE"]) {
+    Expect.equals("P1", p1);
+    Expect.equals("P2", p2);
+  }
+
+  foo("P1", "P2");
+  bar("P1", "P2");
+}
diff --git a/tests/language/regress_18865_test.dart b/tests/language/regress_18865_test.dart
index 26ab350..ba64c4c 100644
--- a/tests/language/regress_18865_test.dart
+++ b/tests/language/regress_18865_test.dart
@@ -11,5 +11,5 @@
 }
 
 main () {
-    A.foo();
+  A.foo();
 }
diff --git a/tests/language/switch_case_test.dart b/tests/language/switch_case_test.dart
index 60c150e..15a57ba 100644
--- a/tests/language/switch_case_test.dart
+++ b/tests/language/switch_case_test.dart
@@ -24,6 +24,7 @@
 }
 
 class D implements C {
+  int get x => 0;
   const factory D() = C.fromD;
 }
 
diff --git a/tests/language/vm/store_elimination_vm_test.dart b/tests/language/vm/store_elimination_vm_test.dart
new file mode 100644
index 0000000..8a3dcd7
--- /dev/null
+++ b/tests/language/vm/store_elimination_vm_test.dart
@@ -0,0 +1,122 @@
+// Copyright (c) 2012, 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 correctness of side effects tracking used by load to load forwarding.
+
+// VMOptions=--optimization-counter-threshold=10
+
+import "package:expect/expect.dart";
+
+class C {
+  var x;
+  var y;
+  final z = 123;
+}
+
+class D {
+  var x = 0.0;
+}
+
+var array = [0, 0];
+
+s1(a) {
+  a.x = 42;
+  a.x = 43;
+  return a.x;
+}
+
+void foo(a) {
+  Expect.equals(42, a.x);
+}
+
+s1a(a) {
+  a.x = 42;
+  foo(a);
+  a.x = 43;
+  return a.x;
+}
+
+s2() {
+  var t = new C();
+  return t;
+}
+
+s3(a, b) {
+  a.x = b + 1;
+  if (b % 2 == 0) {
+    a.x = 0;
+  } else {
+    a.x = 0;
+  }
+  return a.x;
+}
+
+s4(a, b) {
+  a.x = b + 1.0;
+  if (b % 2 == 0) {
+    a.x = b + 2.0;
+  }
+  a.x = b + 1.0;
+  return a.x;
+}
+
+test_with_context() {
+  f(a) {
+    var b = a + 1;
+    return (() => b + 1)();
+  }
+  for (var i = 0; i < 100000; i++) f(42);
+  Expect.equals(44, f(42));
+}
+
+test_with_instance() {
+  for (var i = 0; i < 20; i++) Expect.equals(43, s1(new C()));
+  for (var i = 0; i < 20; i++) Expect.equals(43, s1a(new C()));
+  for (var i = 0; i < 20; i++) Expect.equals(123, s2().z);
+  for (var i = 0; i < 20; i++) Expect.equals(0, s3(new C(), i));
+  for (var i = 0; i < 20; i++) Expect.equals(i + 1.0, s4(new D(), i));
+}
+
+arr1(a) {
+  a[0] = 42;
+  a[0] = 43;
+  Expect.equals(a[0], 43);
+  return a[0];
+}
+
+arr2(a, b) {
+  a[0] = 42;
+  a[b % 2] = 43;
+  Expect.equals(a[b % 2], 43);
+  return a[0];
+}
+
+test_with_array() {
+  for (var i = 0; i < 20; i++) Expect.equals(43, arr1(array));
+  for (var i = 0; i < 20; i++) {
+    Expect.equals(i % 2 == 0 ? 43 : 42, arr2(array, i));
+  }
+}
+
+var st = 0;
+
+static1(b) {
+  st = 42;
+  if (b % 2 == 0) {
+    st = 2;
+  }
+  st = b + 1;
+  Expect.equals(st, b + 1);
+  return st;
+}
+
+test_with_static() {
+  for (var i = 0; i < 20; i++) Expect.equals(i + 1, static1(i));
+}
+
+main() {
+  test_with_instance();
+  test_with_array();
+  test_with_context();
+  test_with_static();
+}
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index 9d9085a..f682dc4 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -6,24 +6,17 @@
 lib/_internal: Skip # Slow like a hell - timeouts.
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-lib/_blink/dartium/_blink_dartium: CompileTimeError # Issue 16522
-lib/_chrome/dart2js/chrome_dart2js: CompileTimeError # Issue 16522
 lib/html/dart2js/html_dart2js: CompileTimeError # Issue 16522
-lib/html/dartium/html_dartium: CompileTimeError # Issue 16522
-lib/html/html_common/html_common: CompileTimeError # Issue 16522
 lib/html/html_common/html_common_dart2js: CompileTimeError # Issue 16522
-lib/indexed_db/dart2js/indexed_db_dart2js: CompileTimeError # Issue 16524
-lib/indexed_db/dartium/indexed_db_dartium: CompileTimeError # Issue 16524
+lib/_chrome/dart2js/chrome_dart2js: CompileTimeError # Issue 16522
+lib/html/html_common/html_common_dart2js: CompileTimeError # Issue 16522
+lib/indexed_db/dart2js/indexed_db_dart2js: CompileTimeError # Issue 16522
+lib/js/dart2js/js_dart2js: CompileTimeError # Issue 16522
+lib/svg/dart2js/svg_dart2js: CompileTimeError # Issue 16522
+lib/typed_data/dart2js/native_typed_data_dart2js: CompileTimeError # Issue 16522
+lib/typed_data/dart2js/typed_data_dart2js: CompileTimeError # Issue 16522
+lib/web_audio/dart2js/web_audio_dart2js: CompileTimeError # Issue 16522
+lib/web_gl/dart2js/web_gl_dart2js: CompileTimeError # Issue 16522
+lib/web_sql/dart2js/web_sql_dart2js: CompileTimeError # Issue 16522
+
 lib/_internal/compiler/samples/compile_loop/compile_loop: CompileTimeError  # Issue 16524
-lib/_internal/compiler/samples/darttags/darttags: CompileTimeError  # Issue 16524
-lib/js/dart2js/js_dart2js: CompileTimeError # Issue 16524
-lib/svg/dart2js/svg_dart2js: CompileTimeError # Issue 16524
-lib/svg/dartium/svg_dartium: CompileTimeError # Issue 16524
-lib/typed_data/dart2js/native_typed_data_dart2js: CompileTimeError # Issue 16524
-lib/typed_data/dart2js/typed_data_dart2js: CompileTimeError # Issue 16524
-lib/web_audio/dart2js/web_audio_dart2js: CompileTimeError # Issue 16524
-lib/web_audio/dartium/web_audio_dartium: CompileTimeError # Issue 16524
-lib/web_gl/dart2js/web_gl_dart2js: CompileTimeError # Issue 16524
-lib/web_gl/dartium/web_gl_dartium: CompileTimeError # Issue 16524
-lib/web_sql/dart2js/web_sql_dart2js: CompileTimeError # Issue 16524
-lib/web_sql/dartium/web_sql_dartium: CompileTimeError # Issue 16524
diff --git a/tests/lib/async/stream_controller_test.dart b/tests/lib/async/stream_controller_test.dart
index f729edc..6cb1e69 100644
--- a/tests/lib/async/stream_controller_test.dart
+++ b/tests/lib/async/stream_controller_test.dart
@@ -6,9 +6,12 @@
 library stream_controller_test;
 
 import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
 import 'dart:async';
 import 'event_helper.dart';
 
+fail(e) { Expect.fail("Unexepected error: $e"); }
+
 void testMultiController() {
   // Test normal flow.
   var c = new StreamController(sync: true);
@@ -436,10 +439,107 @@
   Expect.equals(c.stream, c.stream);
 }
 
+void testCancelThrow() {
+  asyncStart();
+  asyncStart();
+  asyncStart();
+  StreamController c = new StreamController(onCancel: () {
+    asyncEnd();
+    throw "ERROR";
+  });
+  c.add(1);
+  c.add(2);
+  c.add(3);
+  Future done = c.close();
+  StreamSubscription sub;
+  sub = c.stream.listen((v) {
+    Expect.equals(1, v);
+    Future f = sub.cancel();
+    f.catchError((e) {
+      // Must complete with error from onCancel.
+      Expect.equals("ERROR", e);
+      asyncEnd();
+    });
+  });
+  done.catchError(fail).whenComplete(asyncEnd);  // Must complete without error.
+}
+
+void testCancelThrow2() {
+  asyncStart();
+  asyncStart();
+  asyncStart();
+  asyncStart();
+  asyncStart();
+  StreamController c2 = new StreamController(onCancel: () {
+    asyncEnd();
+    throw "ERROR";
+  });
+  c2.add(1);
+  c2.add(2);
+  Future done2 = c2.close();
+  done2.catchError(fail).whenComplete(asyncEnd);  // Should not get error;
+
+  StreamController c = new StreamController();
+  var sub;
+  sub = c.stream.listen((v) {
+    Expect.equals(1, v);
+    Future f = sub.cancel();
+    f.catchError((e) {
+      // Error from addStream stream's cancel must go only here.
+      asyncEnd();
+      Expect.equals("ERROR", e);
+    });
+  });
+  var addDone = c.addStream(c2.stream);
+  addDone.catchError(fail).whenComplete(asyncEnd);  // Should not get error.
+  var done = c.done;
+  done.catchError(fail).whenComplete(asyncEnd);  // Should not get error.
+}
+
+void testCancelThrow3() {
+  asyncStart();
+  asyncStart();
+  asyncStart();
+  asyncStart();
+  asyncStart();
+  asyncStart();
+  StreamController c2 = new StreamController(onCancel: () {
+    asyncEnd();
+    throw "ERROR2";
+  });
+  c2.add(1);
+  c2.add(2);
+  var done2 = c2.close();
+  done2.catchError(fail).whenComplete(asyncEnd);  // Should not get error;
+
+  StreamController c = new StreamController(onCancel: () {
+    asyncEnd();
+    throw "ERROR1";
+  });
+  var sub;
+  sub = c.stream.listen((v) {
+    Expect.equals(1, v);
+    Future f = sub.cancel();
+    f.catchError((e) {
+      // Only the last error ends up here.
+      Expect.equals("ERROR1", e);
+      asyncEnd();
+    });
+  });
+  var addDone = c.addStream(c2.stream);
+  addDone.catchError(fail).whenComplete(asyncEnd);  // Error must not go here.
+  c.done.catchError(fail).whenComplete(asyncEnd); // Error must not go here.
+}
+
 main() {
+  asyncStart();
   testMultiController();
   testSingleController();
   testExtraMethods();
   testClosed();
   testStreamEquals();
+  testCancelThrow();
+  testCancelThrow2();
+  testCancelThrow3();
+  asyncEnd();
 }
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index da8892f..6c18683 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -19,6 +19,7 @@
 mirrors/delegate_test: RuntimeError # Issue 13864
 async/deferred/deferred_in_isolate_test: RuntimeError # Issue 16898
 mirrors/deferred_mirrors_metadata_test: Fail # Issue 16898
+mirrors/deferred_mirrors_metatarget_test: Fail # Issue 16898
 
 [ $compiler == dart2js && $checked && $runtime == drt && $nocsp ]
 async/stream_transform_test: RuntimeError # Issue 16719
@@ -85,6 +86,7 @@
 mirrors/metadata_allowed_values_test/11: MissingCompileTimeError # Issue 14548
 mirrors/metadata_allowed_values_test/13: MissingCompileTimeError # Issue 14548
 mirrors/metadata_allowed_values_test/14: MissingCompileTimeError # Issue 14548
+mirrors/metadata_scope_test/none: CompileTimeError # Issue 10905
 mirrors/method_mirror_name_test: RuntimeError # Issue 6335
 mirrors/method_mirror_properties_test: RuntimeError # Issue 11861
 mirrors/method_mirror_source_test : RuntimeError # Issue 6490
@@ -147,7 +149,7 @@
 async/timer_cancel_test: RuntimeError,OK # Needs Timer to run.
 async/timer_cancel1_test: RuntimeError,OK # Needs Timer to run.
 async/timer_cancel2_test: RuntimeError,OK # Needs Timer to run.
-async/timer_isolate_test: RuntimeError, OK # Needs Timer to run.
+async/timer_isolate_test: Fail, OK # Needs Timer to run.
 async/timer_repeat_test: RuntimeError,OK # Needs Timer to run.
 async/timer_test: RuntimeError,OK # Needs Timer to run.
 async/stream_controller_async_test: RuntimeError # Timer interface not supported; dartbug.com/7728.
@@ -181,7 +183,6 @@
 
 [ $compiler == dart2js && $checked ]
 convert/utf85_test: Pass, Slow # Issue 12029.
-mirrors/intercepted_object_test: RuntimeError # Issue 18569
 
 [ $compiler == dart2js ]
 convert/chunked_conversion_utf88_test: Slow, Pass
@@ -274,15 +275,12 @@
 async/timer_test: Fail, Pass # See Issue 10982
 
 [ $arch == simmips || $arch == mips ]
-convert/chunked_conversion_utf88_test: Pass, Slow # Issue 12025.
-convert/streamed_conversion_json_utf8_decode_test: Pass, Slow
+convert/chunked_conversion_utf88_test: Skip  # Pass, Slow Issue 12025.
+convert/streamed_conversion_json_utf8_decode_test: Skip  # Pass, Slow
 
 [ $arch == simarm ]
-convert/chunked_conversion_utf88_test: Pass, Slow # Issue 12644.
-convert/utf85_test: Pass, Slow # Issue 12644.
-
-[ $arch == simarm64 ]
-*: Skip
+convert/chunked_conversion_utf88_test: Skip  # Pass, Slow Issue 12644.
+convert/utf85_test: Skip  # Pass, Slow Issue 12644.
 
 [ $compiler == none && $runtime == dartium ]
 async/schedule_microtask5_test: Pass, Timeout # Issue 13719: Please triage this failure.
@@ -308,7 +306,7 @@
 async/schedule_microtask_test: Fail # Issue 9002
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-mirrors/generic_f_bounded_mixin_application_test: CompileTimeError # Issue 14116
+mirrors/generic_f_bounded_mixin_application_test: StaticWarning # Test Issue
 
 mirrors/redirecting_factory_test/01: StaticWarning # test issue X, The return type 'Class<T2, T1>' of the redirected constructor is not assignable to 'Class<T1, T2>'
 mirrors/redirecting_factory_test/none: StaticWarning # test issue X, The return type 'Class<T2, T1>' of the redirected constructor is not assignable to 'Class<T1, T2>
@@ -319,7 +317,6 @@
 mirrors/removed_api_test: StaticWarning, OK # Deliberately refers to undeclared members.
 
 mirrors/deferred_mirrors_metadata_test: Fail # Issue 17522
-mirrors/metadata_scope_test/01: MissingCompileTimeError # Issue 17894
 
 [ $compiler == dart2js && $runtime == d8 && $system == windows ]
 async/*deferred*: Skip # Issue 17458
diff --git a/tests/lib/math/double_pow_test.dart b/tests/lib/math/double_pow_test.dart
index e8b0696..4736b5c 100644
--- a/tests/lib/math/double_pow_test.dart
+++ b/tests/lib/math/double_pow_test.dart
@@ -11,7 +11,7 @@
   // We find a ulp (unit in the last place) by shifting the original number
   // to the right. This only works if we are not too close to infinity or if
   // we work with denormals.
-  // We special case or 0.0, but not for infinity.
+  // We special case for 0.0, but not for infinity.
   if (a == 0.0) {
     final minimalDouble = 4.9406564584124654e-324;
     Expect.equals(true, b.abs() <= minimalDouble);
@@ -19,7 +19,7 @@
   }
   if (b == 0.0) {
     // No need to look if they are close. Otherwise the check for 'a' above
-    // whould have triggered.
+    // would have triggered.
     Expect.equals(a, b);
   }
   final double shiftRightBy52 = 2.220446049250313080847263336181640625e-16;
diff --git a/tests/lib/mirrors/deferred_mirrors_metatarget_lib.dart b/tests/lib/mirrors/deferred_mirrors_metatarget_lib.dart
new file mode 100644
index 0000000..423ded8
--- /dev/null
+++ b/tests/lib/mirrors/deferred_mirrors_metatarget_lib.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.
+
+library lib;
+
+@MirrorsUsed(metaTargets: "MetaTarget")
+import "dart:mirrors";
+
+class MetaTarget {
+  const MetaTarget();
+}
+
+@MetaTarget()
+class A {
+  String toString() => "A";
+}
+
+String foo() {
+  ClassMirror a = currentMirrorSystem().findLibrary(#lib).declarations[#A];
+  return a.newInstance(const Symbol(""), []).invoke(#toString, []).reflectee;
+}
\ No newline at end of file
diff --git a/tests/lib/mirrors/deferred_mirrors_metatarget_test.dart b/tests/lib/mirrors/deferred_mirrors_metatarget_test.dart
new file mode 100644
index 0000000..f0091c8
--- /dev/null
+++ b/tests/lib/mirrors/deferred_mirrors_metatarget_test.dart
@@ -0,0 +1,18 @@
+// 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 metaTargets can be reached via the mirrorSystem.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+import "deferred_mirrors_metatarget_lib.dart" deferred as lib;
+
+void main() {
+  asyncStart();
+  lib.loadLibrary().then((_) {
+    Expect.equals("A", lib.foo());
+    asyncEnd();
+  });
+}
diff --git a/tests/lib/mirrors/metadata_scope_test.dart b/tests/lib/mirrors/metadata_scope_test.dart
index 2ccf397..6fa070e 100644
--- a/tests/lib/mirrors/metadata_scope_test.dart
+++ b/tests/lib/mirrors/metadata_scope_test.dart
@@ -16,7 +16,7 @@
 // Note there is no compile-time constant 'foo' in scope. In particular, A.foo
 // is not in scope here.
 @Annotation(foo)  /// 01: compile-time error
-class A {
+class A <@Annotation(foo) T> {
   @Annotation(foo)
   static foo() {}
 
@@ -25,7 +25,7 @@
 }
 
 @Annotation(B.foo)
-class B {
+class B <@Annotation(B.foo) T> {
   @Annotation(B.foo)
   static foo() {}
 
@@ -37,7 +37,7 @@
 
 // Note the top-level function baz is in scope here, not C.baz.
 @Annotation(baz)
-class C {
+class C <@Annotation(baz) T> {
   @Annotation(baz)
   static baz() {}
 }
@@ -48,13 +48,16 @@
 
 main() {
   reflectClass(A).metadata;
+  checkMetadata(reflectClass(A).declarations[#T], [const Annotation(A.foo)]);
   checkMetadata(reflectClass(A).declarations[#foo], [const Annotation(A.foo)]);
   checkMetadata(reflectClass(A).declarations[#bar], [const Annotation(A.foo)]);
   checkMetadata(reflectClass(B), [const Annotation(B.foo)]);
+  checkMetadata(reflectClass(B).declarations[#T], [const Annotation(B.foo)]);
   checkMetadata(reflectClass(B).declarations[#foo], [const Annotation(B.foo)]);
   checkMetadata(reflectClass(B).declarations[#bar], [const Annotation(B.foo)]);
   // The top-level function baz, not C.baz.
   checkMetadata(reflectClass(C), [const Annotation(baz)]);
   // C.baz, not the top-level function baz.
+  checkMetadata(reflectClass(C).declarations[#T], [const Annotation(C.baz)]);
   checkMetadata(reflectClass(C).declarations[#baz], [const Annotation(C.baz)]);
 }
diff --git a/tests/standalone/io/directory_list_sync_test.dart b/tests/standalone/io/directory_list_sync_test.dart
index 99d18fb..2c99a67 100644
--- a/tests/standalone/io/directory_list_sync_test.dart
+++ b/tests/standalone/io/directory_list_sync_test.dart
@@ -6,8 +6,9 @@
 
 void main() {
   File script = new File.fromUri(Platform.script);
-  // tests/standalone/io/../../..
-  Directory startingDir = script.parent.parent.parent.parent;
+  // tests/standalone/io/../..
+  Directory startingDir = script.parent.parent.parent;
+  print("Recursively listing entries in directory ${startingDir.path} ...");
   List<FileSystemEntity> each =
       startingDir.listSync(recursive: true, followLinks: false);
   print("Found: ${each.length} entities");
diff --git a/tests/standalone/io/http_date_test.dart b/tests/standalone/io/http_date_test.dart
index 6e5cd6b..439c65d 100644
--- a/tests/standalone/io/http_date_test.dart
+++ b/tests/standalone/io/http_date_test.dart
@@ -43,9 +43,9 @@
   }
 
   test(1999, DateTime.JUNE, 11, 18, 46, 53, "Fri, 11 Jun 1999 18:46:53 GMT");
-  test(1970, DateTime.JANUARY, 1, 0, 0, 0, "Thu, 1 Jan 1970 00:00:00 GMT");
-  test(1970, DateTime.JANUARY, 1, 9, 9, 9, "Thu, 1 Jan 1970 09:09:09 GMT");
-  test(2012, DateTime.MARCH, 5, 23, 59, 59, "Mon, 5 Mar 2012 23:59:59 GMT");
+  test(1970, DateTime.JANUARY, 1, 0, 0, 0, "Thu, 01 Jan 1970 00:00:00 GMT");
+  test(1970, DateTime.JANUARY, 1, 9, 9, 9, "Thu, 01 Jan 1970 09:09:09 GMT");
+  test(2012, DateTime.MARCH, 5, 23, 59, 59, "Mon, 05 Mar 2012 23:59:59 GMT");
 }
 
 void testParseHttpDateFailures() {
diff --git a/tests/standalone/io/http_headers_test.dart b/tests/standalone/io/http_headers_test.dart
index edaa64a..5442ae8 100644
--- a/tests/standalone/io/http_headers_test.dart
+++ b/tests/standalone/io/http_headers_test.dart
@@ -369,32 +369,32 @@
     DateTime date = new DateTime.utc(2014, DateTime.JANUARY, 5, 23, 59, 59, 0);
     cookie.expires = date;
     checkCookie(cookie, "$name=$value"
-                "; Expires=Sun, 5 Jan 2014 23:59:59 GMT");
+                "; Expires=Sun, 05 Jan 2014 23:59:59 GMT");
     cookie.maxAge = 567;
     checkCookie(cookie, "$name=$value"
-                "; Expires=Sun, 5 Jan 2014 23:59:59 GMT"
+                "; Expires=Sun, 05 Jan 2014 23:59:59 GMT"
                 "; Max-Age=567");
     cookie.domain = "example.com";
     checkCookie(cookie, "$name=$value"
-                "; Expires=Sun, 5 Jan 2014 23:59:59 GMT"
+                "; Expires=Sun, 05 Jan 2014 23:59:59 GMT"
                 "; Max-Age=567"
                 "; Domain=example.com");
     cookie.path = "/xxx";
     checkCookie(cookie, "$name=$value"
-                "; Expires=Sun, 5 Jan 2014 23:59:59 GMT"
+                "; Expires=Sun, 05 Jan 2014 23:59:59 GMT"
                 "; Max-Age=567"
                 "; Domain=example.com"
                 "; Path=/xxx");
     cookie.secure = true;
     checkCookie(cookie, "$name=$value"
-                "; Expires=Sun, 5 Jan 2014 23:59:59 GMT"
+                "; Expires=Sun, 05 Jan 2014 23:59:59 GMT"
                 "; Max-Age=567"
                 "; Domain=example.com"
                 "; Path=/xxx"
                 "; Secure");
     cookie.httpOnly = true;
     checkCookie(cookie, "$name=$value"
-                "; Expires=Sun, 5 Jan 2014 23:59:59 GMT"
+                "; Expires=Sun, 05 Jan 2014 23:59:59 GMT"
                 "; Max-Age=567"
                 "; Domain=example.com"
                 "; Path=/xxx"
diff --git a/tests/standalone/io/raw_datagram_socket_test.dart b/tests/standalone/io/raw_datagram_socket_test.dart
index 86fb5e4..9b952d6 100644
--- a/tests/standalone/io/raw_datagram_socket_test.dart
+++ b/tests/standalone/io/raw_datagram_socket_test.dart
@@ -93,40 +93,42 @@
 testBroadcast() {
   test(bindAddress, broadcastAddress, enabled) {
     asyncStart();
-    Future.wait([RawDatagramSocket.bind(bindAddress, 0),
-                 RawDatagramSocket.bind(bindAddress, 0)]).then((values) {
-      var broadcastTimer;
-      var sender = values[0];
-      var receiver = values[1];
-      // On Windows at least the receiver needs to have broadcast
-      // enabled whereas on Linux at least the sender needs to.
-      receiver.broadcastEnabled = enabled;
-      sender.broadcastEnabled = enabled;
-      receiver.listen((event) {
-        if (event == RawSocketEvent.READ) {
-          Expect.isTrue(enabled);
-          sender.close();
-          receiver.close();
-          broadcastTimer.cancel();
-          asyncEnd();
-        }
-      });
+    Future.wait([
+        RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false),
+        RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false)])
+      .then((values) {
+        var broadcastTimer;
+        var sender = values[0];
+        var receiver = values[1];
+        // On Windows at least the receiver needs to have broadcast
+        // enabled whereas on Linux at least the sender needs to.
+        receiver.broadcastEnabled = enabled;
+        sender.broadcastEnabled = enabled;
+        receiver.listen((event) {
+          if (event == RawSocketEvent.READ) {
+            Expect.isTrue(enabled);
+            sender.close();
+            receiver.close();
+            broadcastTimer.cancel();
+            asyncEnd();
+          }
+        });
 
-      int sendCount = 0;
-      send(_) {
-        int bytes =
-            sender.send(new Uint8List(1), broadcastAddress, receiver.port);
-        Expect.isTrue(bytes == 0 || bytes == 1);
-        sendCount++;
-        if (!enabled && sendCount == 50) {
-          sender.close();
-          receiver.close();
-          broadcastTimer.cancel();
-          asyncEnd();
+        int sendCount = 0;
+        send(_) {
+          int bytes =
+              sender.send(new Uint8List(1), broadcastAddress, receiver.port);
+          Expect.isTrue(bytes == 0 || bytes == 1);
+          sendCount++;
+          if (!enabled && sendCount == 50) {
+            sender.close();
+            receiver.close();
+            broadcastTimer.cancel();
+            asyncEnd();
+          }
         }
-      }
-      broadcastTimer = new Timer.periodic(new Duration(milliseconds: 10), send);
-    });
+        broadcastTimer = new Timer.periodic(new Duration(milliseconds: 10), send);
+      });
   }
 
   var broadcast = new InternetAddress("255.255.255.255");
@@ -137,44 +139,51 @@
 testLoopbackMulticast() {
   test(bindAddress, multicastAddress, enabled) {
     asyncStart();
-    Future.wait([RawDatagramSocket.bind(bindAddress, 0),
-                 RawDatagramSocket.bind(bindAddress, 0)]).then((values) {
-      var senderTimer;
-      var sender = values[0];
-      var receiver = values[1];
+    Future.wait([
+        RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false),
+        RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false)])
+      .then((values) {
+        var senderTimer;
+        var sender = values[0];
+        var receiver = values[1];
 
-      sender.joinMulticast(multicastAddress);
-      receiver.joinMulticast(multicastAddress);
-      // On Windows at least the receiver needs to have multicast
-      // loop enabled whereas on Linux at least the sender needs to.
-      receiver.multicastLoopback = enabled;
-      sender.multicastLoopback = enabled;
+        sender.joinMulticast(multicastAddress);
+        receiver.joinMulticast(multicastAddress);
+        // On Windows at least the receiver needs to have multicast
+        // loop enabled whereas on Linux at least the sender needs to.
+        receiver.multicastLoopback = enabled;
+        sender.multicastLoopback = enabled;
 
-      receiver.listen((event) {
-        if (event == RawSocketEvent.READ) {
-          Expect.isTrue(enabled);
-          sender.close();
-          receiver.close();
-          senderTimer.cancel();
-          asyncEnd();
+        receiver.listen((event) {
+          if (event == RawSocketEvent.READ) {
+            if (!enabled) {
+              var data = receiver.receive();
+              print(data.port);
+              print(data.address);
+            }
+            Expect.isTrue(enabled);
+            sender.close();
+            receiver.close();
+            senderTimer.cancel();
+            asyncEnd();
+          }
+        });
+
+        int sendCount = 0;
+        send(_) {
+          int bytes =
+              sender.send(new Uint8List(1), multicastAddress, receiver.port);
+          Expect.isTrue(bytes == 0 || bytes == 1);
+          sendCount++;
+          if (!enabled && sendCount == 50) {
+            sender.close();
+            receiver.close();
+            senderTimer.cancel();
+            asyncEnd();
+          }
         }
+        senderTimer = new Timer.periodic(new Duration(milliseconds: 10), send);
       });
-
-      int sendCount = 0;
-      send(_) {
-        int bytes =
-            sender.send(new Uint8List(1), multicastAddress, receiver.port);
-        Expect.isTrue(bytes == 0 || bytes == 1);
-        sendCount++;
-        if (!enabled && sendCount == 50) {
-          sender.close();
-          receiver.close();
-          senderTimer.cancel();
-          asyncEnd();
-        }
-      }
-      senderTimer = new Timer.periodic(new Duration(milliseconds: 10), send);
-    });
   }
 
   test(InternetAddress.ANY_IP_V4, new InternetAddress("228.0.0.4"), true);
@@ -195,106 +204,109 @@
   var ackSeq = 0;
   Timer ackTimer;
 
-  Future.wait([RawDatagramSocket.bind(bindAddress, 0),
-               RawDatagramSocket.bind(bindAddress, 0)]).then((values) {
-  var sender = values[0];
-  var receiver = values[1];
-  if (bindAddress.isMulticast) {
-    sender.multicastLoopback = true;
-    receiver.multicastLoopback = true;
-    sender.joinMulticast(bindAddress);
-    receiver.joinMulticast(bindAddress);
-  }
+  Future.wait([
+      RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false),
+      RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false)])
+    .then((values) {
+      var sender = values[0];
+      var receiver = values[1];
+      if (bindAddress.isMulticast) {
+        sender.multicastLoopback = true;
+        receiver.multicastLoopback = true;
+        sender.joinMulticast(bindAddress);
+        receiver.joinMulticast(bindAddress);
+      }
 
-  Uint8List createDataPackage(int seq) {
-    var data = new Uint8List(1000);
-    (new ByteData.view(data.buffer, 0, 4)).setUint32(0, seq);
-    return data;
-  }
+      Uint8List createDataPackage(int seq) {
+        var data = new Uint8List(1000);
+        (new ByteData.view(data.buffer, 0, 4)).setUint32(0, seq);
+        return data;
+      }
 
-  Uint8List createAckPackage(int seq) {
-    var data = new Uint8List(4);
-    new ByteData.view(data.buffer, 0, 4).setUint32(0, seq);
-    return data;
-  }
+      Uint8List createAckPackage(int seq) {
+        var data = new Uint8List(4);
+        new ByteData.view(data.buffer, 0, 4).setUint32(0, seq);
+        return data;
+      }
 
-  int packageSeq(Datagram datagram) =>
-      new ByteData.view((datagram.data as Uint8List).buffer).getUint32(0);
+      int packageSeq(Datagram datagram) =>
+          new ByteData.view((datagram.data as Uint8List).buffer).getUint32(0);
 
-  void sendData(int seq) {
-    // Send a datagram acknowledging the received sequence.
-    int bytes = sender.send(createDataPackage(seq), bindAddress, receiver.port);
-    Expect.isTrue(bytes == 0 || bytes == 1000);
-  }
+      void sendData(int seq) {
+        // Send a datagram acknowledging the received sequence.
+        int bytes = sender.send(
+            createDataPackage(seq), bindAddress, receiver.port);
+        Expect.isTrue(bytes == 0 || bytes == 1000);
+      }
 
-  void sendAck(address, port) {
-    // Send a datagram acknowledging the received sequence.
-    int bytes = receiver.send(createAckPackage(receivedSeq), address, port);
-    Expect.isTrue(bytes == 0 || bytes == 4);
-    // Start a "long" timer for more data.
-    if (ackTimer != null) ackTimer.cancel();
-    ackTimer = new Timer.periodic(
-        new Duration(milliseconds: 100), (_) => sendAck(address, port));
-  }
+      void sendAck(address, port) {
+        // Send a datagram acknowledging the received sequence.
+        int bytes = receiver.send(createAckPackage(receivedSeq), address, port);
+        Expect.isTrue(bytes == 0 || bytes == 4);
+        // Start a "long" timer for more data.
+        if (ackTimer != null) ackTimer.cancel();
+        ackTimer = new Timer.periodic(
+            new Duration(milliseconds: 100), (_) => sendAck(address, port));
+      }
 
-  sender.listen((event) {
-    switch (event) {
-      case RawSocketEvent.READ:
-        var datagram = sender.receive();
-        if (datagram != null) {
-          Expect.equals(datagram.port, receiver.port);
-          if (!bindAddress.isMulticast) {
-            Expect.equals(receiver.address, datagram.address);
-          }
-          ackSeq = packageSeq(datagram);
-          if (ackSeq < total) {
-            sender.writeEventsEnabled = true;
-          } else {
-            sender.close();
-            receiver.close();
-            ackTimer.cancel();
-            asyncEnd();
-          }
+      sender.listen((event) {
+        switch (event) {
+          case RawSocketEvent.READ:
+            var datagram = sender.receive();
+            if (datagram != null) {
+              Expect.equals(datagram.port, receiver.port);
+              if (!bindAddress.isMulticast) {
+                Expect.equals(receiver.address, datagram.address);
+              }
+              ackSeq = packageSeq(datagram);
+              if (ackSeq < total) {
+                sender.writeEventsEnabled = true;
+              } else {
+                sender.close();
+                receiver.close();
+                ackTimer.cancel();
+                asyncEnd();
+              }
+            }
+            break;
+          case RawSocketEvent.WRITE:
+            // Send the next package.
+            sendData(ackSeq + 1);
+            break;
+          case RawSocketEvent.CLOSED:
+            break;
+          default:
+            throw "Unexpected event $event";
         }
-        break;
-      case RawSocketEvent.WRITE:
-        // Send the next package.
-        sendData(ackSeq + 1);
-        break;
-      case RawSocketEvent.CLOSED:
-        break;
-      default:
-        throw "Unexpected event $event";
-    }
-  });
+      });
 
-  receiver.writeEventsEnabled = false;
-  receiver.listen((event) {
-    switch (event) {
-      case RawSocketEvent.READ:
-        var datagram = receiver.receive();
-        if (datagram != null) {
-          Expect.equals(datagram.port, sender.port);
-          if (!bindAddress.isMulticast) {
-            Expect.equals(receiver.address, datagram.address);
-          }
-          var seq = packageSeq(datagram);
-          if (seq == receivedSeq + 1) {
-            receivedSeq = seq;
-            sendAck(bindAddress, sender.port);
-          }
+      receiver.writeEventsEnabled = false;
+      receiver.listen((event) {
+        switch (event) {
+          case RawSocketEvent.READ:
+            var datagram = receiver.receive();
+            if (datagram != null) {
+              Expect.equals(datagram.port, sender.port);
+              if (!bindAddress.isMulticast) {
+                Expect.equals(receiver.address, datagram.address);
+              }
+              var seq = packageSeq(datagram);
+              if (seq == receivedSeq + 1) {
+                receivedSeq = seq;
+                sendAck(bindAddress, sender.port);
+              }
+            }
+            break;
+          case RawSocketEvent.WRITE:
+            throw "Unexpected WRITE";
+            break;
+          case RawSocketEvent.CLOSED:
+            break;
+          default:
+            throw "Unexpected event $event";
         }
-        break;
-      case RawSocketEvent.WRITE:
-        throw "Unexpected WRITE";
-        break;
-      case RawSocketEvent.CLOSED:
-        break;
-      default:
-        throw "Unexpected event $event";
-    }
-  });
-  });
+      });
+    });
 }
 
 
diff --git a/tests/standalone/issue14236_test.dart b/tests/standalone/issue14236_test.dart
index 26ec20a..f103ca2 100644
--- a/tests/standalone/issue14236_test.dart
+++ b/tests/standalone/issue14236_test.dart
Binary files differ
diff --git a/tests/standalone/javascript_compatibility_errors_test.dart b/tests/standalone/javascript_compatibility_errors_test.dart
new file mode 100644
index 0000000..888ff20
--- /dev/null
+++ b/tests/standalone/javascript_compatibility_errors_test.dart
@@ -0,0 +1,145 @@
+// 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.
+
+// VMOptions=--warn_on_javascript_compatibility --warning_as_error --optimization_counter_threshold=5
+
+import "package:expect/expect.dart";
+
+f(x, y) {
+  // Unoptimized code.
+  1 is double;  /// 00: compile-time error
+  if (1 is double) { x++; }  /// 01: compile-time error
+  try { 1 as double; } on CastError catch (e) { }  /// 02: compile-time error
+  try { var y = 1 as double; } on CastError catch (e) { }  /// 03: compile-time error
+  1.0 is int;  /// 04: compile-time error
+  if (1.0 is int) { x++; }  /// 05: compile-time error
+  try { 1.0 as int; } on CastError catch (e) { }  /// 06: compile-time error
+  try { var z = 1.0 as int; } on CastError catch (e) { }  /// 07: compile-time error
+
+  x is double;  /// 10: ok
+  if (x is double) { }  /// 11: ok
+  try { x as double; } on CastError catch (e) { }  /// 12: ok
+  try { var z = x as double; } on CastError catch (e) { }  /// 13: ok
+  y is int;  /// 14: ok
+  if (y is int) { }  /// 15: ok
+  try { y as int; } on CastError catch (e) { }  /// 16: ok
+  try { var z = y as int; } on CastError catch (e) { }  /// 17: ok
+
+  "${1.0}";  /// 20: compile-time error
+  var z = "${1.0}";  /// 21: compile-time error
+  (1.0).toString();  /// 22: ok
+  var z = (1.0).toString();  /// 23: ok
+  "$y";  /// 24: ok
+  var z = "$y";  /// 25: ok
+  y.toString();  /// 26: ok
+  var z = y.toString();  /// 27: ok
+
+  if (x > 10) {
+    // Optimized code.
+    x is double;  /// 30: ok
+    if (x is double) { }  /// 31: ok
+    try { x as double; } on CastError catch (e) { }  /// 32: ok
+    try { var z = x as double; } on CastError catch (e) { }  /// 33: ok
+    y is int;  /// 34: ok
+    if (y is int) { }  /// 35: ok
+    try { y as int; } on CastError catch (e) { }  /// 36: ok
+    try { var z = y as int; } on CastError catch (e) { }  /// 37: ok
+
+    "${1.0}";  /// 40: compile-time error
+    var z = "${1.0}";  /// 41: compile-time error
+    (1.0).toString();  /// 42: ok
+    var z = (1.0).toString();  /// 43: ok
+    "$y";  /// 44: ok
+    var z = "$y";  /// 45: ok
+    y.toString();  /// 46: ok
+    var z = y.toString();  /// 47: ok
+  }
+}
+
+k(x, y) {
+  // Unoptimized code.
+  1.5 is double;
+  if (1.5 is double) { x++; }
+  try { 1.5 as double; } on CastError catch (e) { }
+  try { var y = 1.5 as double; } on CastError catch (e) { }
+  1.5 is int;
+  if (1.5 is int) { x++; }
+  try { 1.5 as int; } on CastError catch (e) { }
+  try { var z = 1.5 as int; } on CastError catch (e) { }
+
+  1.5 is double;
+  if (1.5 is double) { x++; }
+  try { 1.5 as double; } on CastError catch (e) { }
+  try { var y = 1.5 as double; } on CastError catch (e) { }
+  1.5 is int;
+  if (1.5 is int) { x++; }
+  try { 1.5 as int; } on CastError catch (e) { }
+  try { var z = 1.5 as int; } on CastError catch (e) { }
+
+  x is double;
+  if (x is double) { }
+  try { x as double; } on CastError catch (e) { }
+  try { var z = x as double; } on CastError catch (e) { }
+  y is int;
+  if (y is int) { }
+  try { y as int; } on CastError catch (e) { }
+  try { var z = y as int; } on CastError catch (e) { }
+
+  "${1.5}";
+  var z = "${1.5}";
+  (1.5).toString();
+  z = (1.5).toString();
+  "$y";
+  z = "$y";
+  y.toString();
+  z = y.toString();
+
+  if (x > 10) {
+    // Optimized code.
+    x is double;
+    if (x is double) { }
+    try { x as double; } on CastError catch (e) { }
+    try { var z = x as double; } on CastError catch (e) { }
+    y is int;
+    if (y is int) { }
+    try { y as int; } on CastError catch (e) { }
+    try { var z = y as int; } on CastError catch (e) { }
+
+    "${1.5}";
+    var z = "${1.5}";
+    (1.5).toString();
+    z = (1.5).toString();
+    "$y";
+    z = "$y";
+    y.toString();
+    z = y.toString();
+  }
+}
+
+g(x, y) => f(x, y);  // Test inlining calls.
+h(x, y) => g(x, y);
+
+// We don't test for _JavascriptCompatibilityError since it's not visible.
+// It should not be visible since it doesn't exist on dart2js.
+bool isJavascriptCompatibilityError(e) =>
+    e is Error && "$e".contains("Javascript Compatibility Error");
+
+main() {
+  // Since the warning (or error in case of --warning_as_error) is issued at
+  // most once per location, the Expect.throw must guard the whole loop.
+  Expect.throws(
+      () {
+        for (var i = 0; i < 20; i++) {
+          h(i, i * 1.0);
+        }
+      },
+      isJavascriptCompatibilityError);
+
+  // No warnings (errors) should be issued after this point.
+  for (var i = 0; i < 20; i++) {
+    k(i * 1.0, i);
+    k(i * 1.0, i + 0.5);
+  }
+}
+
diff --git a/tests/standalone/javascript_compatibility_warnings_test.dart b/tests/standalone/javascript_compatibility_warnings_test.dart
new file mode 100644
index 0000000..9d44700
--- /dev/null
+++ b/tests/standalone/javascript_compatibility_warnings_test.dart
@@ -0,0 +1,68 @@
+// 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.
+
+// VMOptions=--warn_on_javascript_compatibility --no_warning_as_error --optimization_counter_threshold=5
+
+import "package:expect/expect.dart";
+
+f(x, y) {
+  // Unoptimized code.
+  1 is double;  /// 00: ok
+  if (1 is double) { x++; }  /// 01: ok
+  try { 1 as double; } on CastError catch (e) { }  /// 02: ok
+  try { var y = 1 as double; } on CastError catch (e) { }  /// 03: ok
+  1.0 is int;  /// 04: ok
+  if (1.0 is int) { x++; }  /// 05: ok
+  try { 1.0 as int; } on CastError catch (e) { }  /// 06: ok
+  try { var z = 1.0 as int; } on CastError catch (e) { }  /// 07: ok
+
+  x is double;  /// 10: ok
+  if (x is double) { }  /// 11: ok
+  try { x as double; } on CastError catch (e) { }  /// 12: ok
+  try { var z = x as double; } on CastError catch (e) { }  /// 13: ok
+  y is int;  /// 14: ok
+  if (y is int) { }  /// 15: ok
+  try { y as int; } on CastError catch (e) { }  /// 16: ok
+  try { var z = y as int; } on CastError catch (e) { }  /// 17: ok
+
+  "${1.0}";  /// 20: ok
+  var z = "${1.0}";  /// 21: ok
+  (1.0).toString();  /// 22: ok
+  var z = (1.0).toString();  /// 23: ok
+  "$y";  /// 24: ok
+  var z = "$y";  /// 25: ok
+  y.toString();  /// 26: ok
+  var z = y.toString();  /// 27: ok
+
+  if (x > 10) {
+    // Optimized code.
+    x is double;  /// 30: ok
+    if (x is double) { }  /// 31: ok
+    try { x as double; } on CastError catch (e) { }  /// 32: ok
+    try { var z = x as double; } on CastError catch (e) { }  /// 33: ok
+    y is int;  /// 34: ok
+    if (y is int) { }  /// 35: ok
+    try { y as int; } on CastError catch (e) { }  /// 36: ok
+    try { var z = y as int; } on CastError catch (e) { }  /// 37: ok
+
+    "${1.0}";  /// 40: ok
+    var z = "${1.0}";  /// 41: ok
+    (1.0).toString();  /// 42: ok
+    var z = (1.0).toString();  /// 43: ok
+    "$y";  /// 44: ok
+    var z = "$y";  /// 45: ok
+    y.toString();  /// 46: ok
+    var z = y.toString();  /// 47: ok
+  }
+}
+
+g(x, y) => f(x, y);  // Test inlining calls.
+h(x, y) => g(x, y);
+
+main() {
+  for (var i = 0; i < 20; i++) {
+    h(i, i* 1.0);
+  }
+}
+
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 62de2f0..90ed933 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -11,6 +11,8 @@
 
 issue14236_test: Pass # Do not remove this line. It serves as a marker for Issue 14516 comment #4.
 
+javascript_compatibility_errors_test/none: Fail, OK  # Not possible to exclude or annotate with '/// none:'
+
 [ $runtime == vm ]
 package/package_isolate_test: Fail # Issue 12474
 
@@ -33,9 +35,6 @@
 # of allowed open files ('ulimit -n' says something like 256).
 io/socket_many_connections_test: Skip
 
-[ $runtime == vm && $system == windows && $mode == debug ]
-io/raw_datagram_socket_test: Crash  # Issue 18402
-
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 typed_array_test: Fail # Issue 13921
 typed_array_int64_uint64_test: Fail # Issue 13921
@@ -84,6 +83,8 @@
 oom_error_stacktrace_test: RuntimeError, OK # (OOM on JS may produce a stacktrace).
 vmservice/*: Skip # Do not run standalone vm service tests with dart2js.
 issue14236_test: Skip # dart2js does not deal with Script snapshots.
+javascript_compatibility_errors_test: Skip
+javascript_compatibility_warnings_test: Skip
 
 [ $compiler == dart2js && $jscl ]
 assert_test: RuntimeError, OK # Assumes unspecified fields on the AssertionError.
@@ -120,15 +121,14 @@
 io/signals_test: Skip # Starts 10 dart subprocesses, uses too much memory
 io/file_read_special_device_test: Fail # dartbug.com/17440
 
-[ $arch == simarm64 ]
-*: Skip
-
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) && $unchecked ]
 assert_test: Fail # Issue 13719: Please triage this failure.
 
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 javascript_int_overflow_literal_test/01: Fail # Issue 13719: Please triage this failure.
 javascript_int_overflow_test: Fail # Issue 13719: Please triage this failure.
+javascript_compatibility_errors_test: Skip
+javascript_compatibility_warnings_test: Skip
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 io/directory_invalid_arguments_test: StaticWarning
@@ -140,4 +140,6 @@
 package/package_test: StaticWarning
 typed_data_test: StaticWarning
 typed_data_view_test: StaticWarning
+javascript_compatibility_errors_test: Skip
+javascript_compatibility_warnings_test: Skip
 
diff --git a/tests/try/cursor_position_test.dart b/tests/try/cursor_position_test.dart
index ef7932f..f791796 100644
--- a/tests/try/cursor_position_test.dart
+++ b/tests/try/cursor_position_test.dart
@@ -6,38 +6,41 @@
 
 // Test that cursor positions are correctly updated after adding new content.
 
-library trydart.cursor_position_test;
-
-import 'dart:html';
-import 'dart:async';
-
-import '../../site/try/src/interaction_manager.dart' show
-    InteractionManager;
-
-import '../../site/try/src/ui.dart' show
-    hackDiv,
-    mainEditorPane,
-    observer;
-
-import '../../site/try/src/user_option.dart' show
-    UserOption;
-
-import '../../pkg/expect/lib/expect.dart';
-
-import '../../pkg/async_helper/lib/async_helper.dart';
+import 'test_try.dart';
 
 void main() {
   InteractionManager interaction = mockTryDartInteraction();
 
-  List<TestCase> tests = <TestCase>[
+  TestCase twoLines =
+      new TestCase('Test adding two lines programmatically.', () {
+        clearEditorPaneWithoutNotifications();
+        mainEditorPane.appendText('\n\n');
+        Text text = mainEditorPane.firstChild;
+        window.getSelection().collapse(text, 1);
+        checkSelectionIsCollapsed(text, 1);
+      }, checkAtBeginningOfSecondLine);
 
-    new TestCase('Test adding two lines programmatically.', () {
-      clearEditorPaneWithoutNotifications();
-      mainEditorPane.appendText('\n\n');
-      Text text = mainEditorPane.firstChild;
-      window.getSelection().collapse(text, 1);
-      checkSelectionIsCollapsed(text, 1);
-    }, checkAtBeginningOfSecondLine),
+  runTests(<TestCase>[
+    twoLines,
+
+    new TestCase('Test adding a new text node.', () {
+      // This test relies on the previous test leaving two lines.
+      Text text = new Text('fisk');
+      window.getSelection().getRangeAt(0).insertNode(text);
+      window.getSelection().collapse(text, text.length);
+      checkSelectionIsCollapsed(text, text.length);
+    }, checkAtEndOfSecondLineWithFisk),
+
+    twoLines,
+
+    new TestCase('Test adding a new wrapped text node.', () {
+      // This test relies on the previous test leaving two lines.
+      Text text = new Text('fisk');
+      Node node = new SpanElement()..append(text);
+      window.getSelection().getRangeAt(0).insertNode(node);
+      window.getSelection().collapse(text, text.length);
+      checkSelectionIsCollapsed(text, text.length);
+    }, checkAtEndOfSecondLineWithFisk),
 
     new TestCase('Test adding a new line with mock key event.', () {
       clearEditorPaneWithoutNotifications();
@@ -45,9 +48,7 @@
       simulateEnterKeyDown(interaction);
     }, checkAtBeginningOfSecondLine),
 
-  ];
-
-  runTests(tests.iterator, completerForAsyncTest());
+  ]);
 }
 
 void simulateEnterKeyDown(InteractionManager interaction) {
@@ -55,11 +56,6 @@
       new MockKeyboardEvent('keydown', keyCode: KeyCode.ENTER));
 }
 
-void clearEditorPaneWithoutNotifications() {
-  mainEditorPane.nodes.clear();
-  observer.takeRecords();
-}
-
 void checkSelectionIsCollapsed(Node node, int offset) {
   var selection = window.getSelection();
   Expect.isTrue(selection.isCollapsed, 'selection.isCollapsed');
@@ -78,49 +74,15 @@
   checkSelectionIsCollapsed(mainEditorPane.nodes[1].firstChild, 0);
 }
 
-runTests(Iterator<TestCase> iterator, Completer completer) {
-  if (iterator.moveNext()) {
-    TestCase test = iterator.current;
-    new Future(() {
-      print('${test.description}\nSetup.');
-      test.setup();
-      new Future(() {
-        test.validate();
-        print('${test.description}\nDone.');
-        runTests(iterator, completer);
-      });
-    });
-  } else {
-    completer.complete(null);
-  }
-}
-
-Completer completerForAsyncTest() {
-  Completer completer = new Completer();
-  asyncTest(() => completer.future.then((_) {
-    // Clear the DOM to work around a bug in test.dart.
-    document.body.nodes.clear();
-  }));
-  return completer;
-}
-
-InteractionManager mockTryDartInteraction() {
-  UserOption.storage = {};
-
-  InteractionManager interaction = new InteractionManager();
-
-  hackDiv = new DivElement();
-  mainEditorPane = new DivElement()
-      ..style.whiteSpace = 'pre'
-      ..contentEditable = 'true';
-
-  observer = new MutationObserver(interaction.onMutation);
-  observer.observe(
-      mainEditorPane, childList: true, characterData: true, subtree: true);
-
-  document.body.nodes.addAll([mainEditorPane, hackDiv]);
-
-  return interaction;
+void checkAtEndOfSecondLineWithFisk() {
+  checkLineCount(2);
+  SpanElement secondLine = mainEditorPane.nodes[1];
+  Text text = secondLine.firstChild.firstChild;
+  Expect.stringEquals('fisk', text.text);
+  Expect.equals(4, text.length);
+  Text newline = secondLine.firstChild.nextNode;
+  Expect.equals(newline, secondLine.lastChild);
+  checkSelectionIsCollapsed(newline, 0);
 }
 
 class MockKeyboardEvent extends KeyEvent {
@@ -132,13 +94,3 @@
 
   bool getModifierState(String keyArgument) => false;
 }
-
-typedef void VoidFunction();
-
-class TestCase {
-  final String description;
-  final VoidFunction setup;
-  final VoidFunction validate;
-
-  TestCase(this.description, this.setup, this.validate);
-}
diff --git a/tests/try/end_to_end_test.dart b/tests/try/end_to_end_test.dart
index 3452aa8..ae2d14e 100644
--- a/tests/try/end_to_end_test.dart
+++ b/tests/try/end_to_end_test.dart
@@ -19,15 +19,31 @@
 
 import 'package:async_helper/async_helper.dart';
 
-void onError(String message, String filename, int lineno) {
-  if (filename != null) {
-    message = '$filename:$lineno: $message';
+void onError(String message, String filename, int lineno, [int colno, error]) {
+  if (filename != null && filename != "" && lineno != 0) {
+    if (colno != null && colno != 0) {
+      message = '$filename:$lineno:$colno $message';
+    } else {
+      message = '$filename:$lineno: $message';
+    }
   }
-  print("Error occurred in Try Dart iframe: $message");
+  if (error != null) {
+    // See:
+    // https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror
+    var stack = error['stack'];
+    if (stack != null) {
+      message += '\n$stack';
+    }
+  }
+  message = "Error occurred in Try Dart iframe: $message";
+
+  // Synchronous, easier to read when running the browser manually.
+  window.console.log(message);
+
   new Future(() {
-    // Chrome seems to not call window.onerror when you throw in response to an
-    // error event.  So we throw the error in a future.
-    throw 'Error from iframe: $message';
+    // Browsers ignore errors throw in event listeners (or from
+    // window.onerror).
+    throw message;
   });
 }
 
@@ -40,10 +56,11 @@
     print('No contentWindow in iframe');
     throw 'No contentWindow in iframe';
   }
-  contentWindowProxy.callMethod('addEventListener', ['error', (eventProxy) {
-    onError(
-        eventProxy['message'], eventProxy['filename'], eventProxy['lineno']);
-  }]);
+
+  // Note: we have two options, use "iframe.contentWindow.onerror = ..." or
+  // "iframe.contentWindow.addEventListener('error', ...)".  The former seems
+  // to provide more details on both Chrome and Firefox (which provides no
+  // information at all in error events).
   contentWindowProxy['onerror'] = onError;
 }
 
@@ -61,9 +78,7 @@
       // Clean up after ourselves.
       window.localStorage.clear();
 
-      asyncSuccess(null);
-    } else {
-      window.console.dir(e.data);
+      asyncEnd();
     }
   });
 
@@ -72,6 +87,7 @@
   window.localStorage.clear();
 
   IFrameElement iframe = new IFrameElement()
+      ..src = '/root_build/try_dartlang_org/index.html'
       ..style.width = '90vw'
       ..style.height = '90vh'
       ..onLoad.listen(onIframeLoaded);
@@ -80,6 +96,4 @@
   // fired the load event.  That seems to matter according to some sources on
   // stackoverflow.
   installErrorHandlerOn(iframe);
-
-  iframe.src = '/root_build/try_dartlang_org/index.html';
 }
diff --git a/tests/try/mock_try.dart b/tests/try/mock_try.dart
new file mode 100644
index 0000000..1e2e3e50
--- /dev/null
+++ b/tests/try/mock_try.dart
@@ -0,0 +1,43 @@
+// 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:html' show
+    DivElement,
+    MutationObserver,
+    document;
+
+import '../../site/try/src/interaction_manager.dart' show
+    InteractionManager;
+
+import '../../site/try/src/ui.dart' show
+    hackDiv,
+    mainEditorPane,
+    observer;
+
+import '../../site/try/src/user_option.dart' show
+    UserOption;
+
+InteractionManager mockTryDartInteraction() {
+  UserOption.storage = {};
+
+  InteractionManager interaction = new InteractionManager();
+
+  hackDiv = new DivElement();
+  mainEditorPane = new DivElement()
+      ..style.whiteSpace = 'pre'
+      ..contentEditable = 'true';
+
+  observer = new MutationObserver(interaction.onMutation);
+  observer.observe(
+      mainEditorPane, childList: true, characterData: true, subtree: true);
+
+  document.body.nodes.addAll([mainEditorPane, hackDiv]);
+
+  return interaction;
+}
+
+void clearEditorPaneWithoutNotifications() {
+  mainEditorPane.nodes.clear();
+  observer.takeRecords();
+}
diff --git a/tests/try/source_update_test.dart b/tests/try/source_update_test.dart
new file mode 100644
index 0000000..1ea94ca
--- /dev/null
+++ b/tests/try/source_update_test.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.
+
+// SharedOptions=--package-root=sdk/lib/_internal/
+
+import 'test_try.dart';
+
+InteractionContext interaction;
+
+void main() {
+  interaction = mockTryDartInteraction();
+
+  runTests(<TestCase>[
+
+    new TestCase('Test setting full source', () {
+      clearEditorPaneWithoutNotifications();
+      mainEditorPane.appendText('Foo\nBar');
+    }, () {
+      expectSource('Foo\nBar');
+    }),
+
+    new TestCase('Test modifying a single line', () {
+      Element lastLine = mainEditorPane.lastChild;
+      lastLine.appendText('Baz');
+    }, () {
+      expectSource('Foo\nBarBaz');
+    }),
+
+  ]);
+}
+
+void expectSource(String expected) {
+  String actualSource = interaction.currentCompilationUnit.content;
+  Expect.stringEquals(expected, actualSource);
+}
diff --git a/tests/try/test_case.dart b/tests/try/test_case.dart
new file mode 100644
index 0000000..20542f2
--- /dev/null
+++ b/tests/try/test_case.dart
@@ -0,0 +1,61 @@
+// 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 trydart.test_case;
+
+import 'dart:html' show
+    document;
+
+import 'dart:async';
+
+import '../../pkg/async_helper/lib/async_helper.dart';
+
+typedef void VoidFunction();
+
+class TestCase {
+  final String description;
+  final VoidFunction setup;
+  final VoidFunction validate;
+
+  TestCase(this.description, this.setup, this.validate);
+}
+
+/**
+ * Executes [tests] each test in order using the following approach for each
+ * test:
+ *
+ *   1. Run setup synchronously.
+ *
+ *   2. Schedule a new (async) Future which runs validate followed by the next
+ *   test's setup.
+ *
+ *   3. Repeat step 2 until there are no more tests.
+ *
+ * The purpose of this test is to simulate edits (during setup), and then let
+ * the the mutation observer to process the mutations followed by validation.
+ */
+void runTests(List<TestCase> tests) {
+  Completer completer = new Completer();
+  asyncTest(() => completer.future.then((_) {
+    // Clear the DOM to work around a bug in test.dart.
+    document.body.nodes.clear();
+  }));
+
+  void iterateTests(Iterator<TestCase> iterator) {
+    if (iterator.moveNext()) {
+      TestCase test = iterator.current;
+      print('${test.description}\nSetup.');
+      test.setup();
+      new Future(() {
+        test.validate();
+        print('${test.description}\nDone.');
+        iterateTests(iterator);
+      });
+    } else {
+      completer.complete(null);
+    }
+  }
+
+  iterateTests(tests.iterator);
+}
diff --git a/tests/try/test_try.dart b/tests/try/test_try.dart
new file mode 100644
index 0000000..6a09719
--- /dev/null
+++ b/tests/try/test_try.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 trydart.test_try;
+
+export 'dart:html';
+
+export '../../site/try/src/interaction_manager.dart' show
+    InteractionContext,
+    InteractionManager;
+
+export '../../site/try/src/ui.dart' show
+    mainEditorPane;
+
+export '../../pkg/expect/lib/expect.dart';
+
+export 'test_case.dart';
+
+export 'mock_try.dart';
diff --git a/tests/try/try.status b/tests/try/try.status
index e591cc8..59a5f7c 100644
--- a/tests/try/try.status
+++ b/tests/try/try.status
@@ -10,4 +10,4 @@
 *: Skip
 
 [ $csp ]
-end_to_end_test: Skip, OK # http://dartbug.com/17935
+end_to_end_test: Fail, OK # http://dartbug.com/17935
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index f79ee07..35e6cba 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -20,6 +20,3 @@
 source_mirrors_test: Slow, Pass
 dummy_compiler_test: Slow, Pass
 source_mirrors_test: Slow, Pass
-
-[ $compiler == none && $runtime == vm && $arch == simarm64 ]
-*: Skip
diff --git a/tools/VERSION b/tools/VERSION
index 16152da..c879937 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -25,7 +25,7 @@
 #
 CHANNEL dev
 MAJOR 1
-MINOR 4
+MINOR 5
 PATCH 0
-PRERELEASE 6
-PRERELEASE_PATCH 9
+PRERELEASE 0
+PRERELEASE_PATCH 0
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index d0974e6..a1e2f5d 100644
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -7,6 +7,7 @@
 import hashlib
 import imp
 import os
+import platform
 import string
 import subprocess
 import sys
@@ -18,8 +19,6 @@
   '''Dynamically load the tools/utils.py python module.'''
   return imp.load_source('utils', os.path.join(DART_DIR, 'tools', 'utils.py'))
 
-utils = GetUtils()
-
 SYSTEM_RENAMES = {
   'win32': 'windows',
   'windows': 'windows',
@@ -222,7 +221,9 @@
 
   def _layzCalculateGSUtilPath(self):
     if not GSUtil.GSUTIL_PATH:
-      buildbot_gsutil = utils.GetBuildbotGSUtilPath()
+      buildbot_gsutil = '/b/build/scripts/slave/gsutil'
+      if platform.system() == 'Windows':
+        buildbot_gsutil = 'e:\\\\b\\build\\scripts\\slave\\gsutil'
       if os.path.isfile(buildbot_gsutil) and not GSUtil.USE_DART_REPO_VERSION:
         GSUtil.GSUTIL_IS_SHELL_SCRIPT = True
         GSUtil.GSUTIL_PATH = buildbot_gsutil
@@ -250,12 +251,14 @@
 
     env = dict(os.environ)
     # If we're on the buildbot, we use a specific boto file.
-    if utils.GetUserName() == 'chrome-bot':
+    user_name = os.environ.get(
+        'USERNAME' if sys.platform == 'win32' else 'USER', '')
+    if user_name == 'chrome-bot':
       boto_config = {
-        'linux': '/mnt/data/b/build/site_config/.boto',
-        'macos': '/Volumes/data/b/build/site_config/.boto',
-        'win32': r'e:\b\build\site_config\.boto',
-      }[utils.GuessOS()]
+        'Linux': '/mnt/data/b/build/site_config/.boto',
+        'Darwin': '/Volumes/data/b/build/site_config/.boto',
+        'Windows': r'e:\b\build\site_config\.boto',
+      }[platform.system()]
       env['AWS_CREDENTIAL_FILE'] = boto_config
       env['BOTO_CONFIG'] = boto_config
 
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index 06c3b07..3f0876c 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -281,9 +281,9 @@
         extras_flags = extras_flags + ['--host-checked']
       TestStep('dart2js_extra', mode, system, 'dart2js', runtime, extras,
                extras_flags, arch)
-
-      TestStep('try_dart', mode, system, 'dart2js', runtime, ['try'],
-               extras_flags, arch)
+      if mode == 'release':
+        TestStep('try_dart', mode, system, 'dart2js', runtime, ['try'],
+                 extras_flags, arch)
 
 
 def GetHasHardCodedCheckedMode(build_info):
@@ -370,8 +370,13 @@
       build and test to be run.
   """
   with bot.BuildStep('Build SDK'):
+    target = 'dart2js_bot'
+    # Try-dart takes more than 20 min in debug mode and makes the bot time out.
+    # We use the debug target which does not include try
+    if build_info.mode == 'debug':
+      target = 'dart2js_bot_debug'
     args = [sys.executable, './tools/build.py', '--mode=' + build_info.mode,
-            '--arch=' + build_info.arch, 'dart2js_bot']
+            '--arch=' + build_info.arch, target]
     print 'Build SDK and d8: %s' % (' '.join(args))
     bot.RunProcess(args)
 
diff --git a/tools/bots/linux_distribution_support.py b/tools/bots/linux_distribution_support.py
index 8b3e251..cf6a560 100644
--- a/tools/bots/linux_distribution_support.py
+++ b/tools/bots/linux_distribution_support.py
@@ -55,14 +55,53 @@
                               os.path.basename(entry)])
       gsutil.upload(full_path, remote_file, public=True)
 
+def InstallFromDep(builddir):
+  for entry in os.listdir(builddir):
+    if entry.endswith("_amd64.deb"):
+      path = os.path.join(builddir, entry)
+      Run(['sudo', 'dpkg', '-i', path])
+
+def UninstallDart():
+  Run(['sudo', 'dpkg', '-r', 'dart'])
+
+def CreateDartTestFile(tempdir):
+  filename = os.path.join(tempdir, 'test.dart')
+  with open(filename, 'w') as f:
+    f.write('import "dart:collection";\n\n')
+    f.write('void main() {\n')
+    f.write('  print("Hello world");\n')
+    f.write('}')
+  return filename
+
+def Run(args):
+  print "Running: %s" % ' '.join(args)
+  sys.stdout.flush()
+  bot.RunProcess(args)
+
+def TestInstallation(assume_installed=True):
+  paths = ['/usr/bin/dart']
+  for tool in ['dart2js', 'pub', 'dart', 'dartanalyzer']:
+    paths.append(os.path.join('/usr/lib/dart/bin', tool))
+  for path in paths:
+    if os.path.exists(path):
+      if not assume_installed:
+        print 'Assumed not installed, found %s' % path
+        sys.exit(1)
+    else:
+      if assume_installed:
+        print 'Assumed installed, but could not find %s' % path
+        sys.exit(1)
+
 def SrcSteps(build_info):
   # We always clobber the bot, to not leave old tarballs and packages
   # floating around the out dir.
   bot.Clobber(force=True)
+
   version = utils.GetVersion()
   builddir = os.path.join(bot_utils.DART_DIR,
                           utils.GetBuildDir(HOST_OS, HOST_OS),
                           'src_and_installation')
+
   if not os.path.exists(builddir):
     os.makedirs(builddir)
   tarfilename = 'dart-%s.tar.gz' % version
@@ -86,16 +125,50 @@
         sys.exit(1)
 
   with bot.BuildStep('Create src tarball'):
-    args = [sys.executable, './tools/create_tarball.py', '--tar_filename',
-            tarfile]
     print 'Building src tarball'
-    bot.RunProcess(args)
+    Run([sys.executable, './tools/create_tarball.py',
+         '--tar_filename', tarfile])
+
     print 'Building Debian packages'
-    args = [sys.executable, './tools/create_debian_packages.py',
-            '--tar_filename', tarfile,
-            '--out_dir', builddir]
-    bot.RunProcess(args)
-    
+    Run([sys.executable, './tools/create_debian_packages.py',
+         '--tar_filename', tarfile,
+         '--out_dir', builddir])
+
+  with bot.BuildStep('Sanity check installation'):
+    if os.path.exists('/usr/bin/dart'):
+      print "Dart already installled, removing"
+      UninstallDart()
+    TestInstallation(assume_installed=False)
+
+    InstallFromDep(builddir)
+    TestInstallation(assume_installed=True)
+
+    # We build the runtime target to get everything we need to test the
+    # standalone target.
+    Run([sys.executable, './tools/build.py', '-mrelease', '-ax64', 'runtime'])
+    # Copy in the installed binary to avoid poluting /usr/bin (and having to
+    # run as root)
+    Run(['cp', '/usr/bin/dart', 'out/ReleaseX64/dart'])
+
+    # We currently can't run the testing script on wheezy since the checked in
+    # binary is built on precise, see issue 18742
+    if (build_info.builder_tag == 'ubuntu_precise'):
+      Run([sys.executable, './tools/test.py', '-ax64',
+          '--mode=release', 'standalone'])
+
+    # Sanity check dart2js and the analyzer against a hello world program
+    with utils.TempDir() as temp_dir:
+      test_file = CreateDartTestFile(temp_dir)
+      Run(['/usr/lib/dart/bin/dart2js', test_file])
+      Run(['/usr/lib/dart/bin/dartanalyzer', test_file])
+      Run(['/usr/lib/dart/bin/dart', test_file])
+
+    # Sanity check that pub can start up and print the version
+    Run(['/usr/lib/dart/bin/pub', '--version'])
+
+    UninstallDart()
+    TestInstallation(assume_installed=False)
+
   with bot.BuildStep('Upload artifacts'):
     bot_name, _ = bot.GetBotName()
     channel = bot_utils.GetChannelFromName(bot_name)
diff --git a/tools/bots/pub.py b/tools/bots/pub.py
index 3d1cbd1..efc6670 100755
--- a/tools/bots/pub.py
+++ b/tools/bots/pub.py
@@ -36,7 +36,6 @@
   return bot.BuildInfo('none', 'vm', mode, system, checked=True,
                        builder_tag=locale)
 
-
 def PubSteps(build_info):
   with bot.BuildStep('Build package-root'):
     args = [sys.executable, './tools/build.py', '--mode=' + build_info.mode,
@@ -47,7 +46,8 @@
   common_args = ['--write-test-outcome-log']
   if build_info.builder_tag:
     common_args.append('--builder-tag=%s' % build_info.builder_tag)
-                
+
+
   # Pub tests currently have a lot of timeouts when run in debug mode.
   # See issue 18479
   if build_info.mode == 'release':
@@ -56,7 +56,6 @@
   else:
     bot.RunTest('pub', build_info,
                 common_args + ['pkg', 'docs'])
-    
 
   if build_info.mode == 'release':
     pkgbuild_build_info = bot.BuildInfo('none', 'vm', build_info.mode,
@@ -64,8 +63,14 @@
     bot.RunTest('pkgbuild_repo_pkgs', pkgbuild_build_info,
         common_args + ['--append_logs', '--use-repository-packages',
                        'pkgbuild'])
-    bot.RunTest('pkgbuild_public_pkgs', pkgbuild_build_info,
-        common_args + ['--append_logs', '--use-public-packages', 'pkgbuild'])
+
+    # We are seeing issues with pub get calls on the windows bots.
+    # Experiment with not running concurrent calls.
+    public_args = (common_args +
+                   ['--append_logs', '--use-public-packages', 'pkgbuild'])
+    if build_info.system == 'windows':
+      public_args.append('-j1')
+    bot.RunTest('pkgbuild_public_pkgs', pkgbuild_build_info, public_args)
 
 if __name__ == '__main__':
   bot.RunBot(PubConfig, PubSteps)
diff --git a/tools/build.py b/tools/build.py
index 48071bd..5f219d2 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -333,6 +333,23 @@
     else:
       icon = 'dialog-error'
     command = "notify-send -i '%s' '%s' '%s' &" % (icon, message, title)
+  elif HOST_OS == 'win32':
+    if success:
+      icon = 'info'
+    else:
+      icon = 'error'
+    command = ("powershell -command \"" 
+      "[reflection.assembly]::loadwithpartialname('System.Windows.Forms')"
+        "| Out-Null;"
+      "[reflection.assembly]::loadwithpartialname('System.Drawing')"
+        "| Out-Null;"
+      "$n = new-object system.windows.forms.notifyicon;"
+      "$n.icon = [system.drawing.systemicons]::information;"
+      "$n.visible = $true;"
+      "$n.showballoontip(%d, '%s', '%s', "
+      "[system.windows.forms.tooltipicon]::%s);\"") % (
+        5000, # Notification stays on for this many milliseconds
+        message, title, icon)
 
   if command:
     # Ignore return code, if this command fails, it doesn't matter.
diff --git a/tools/dart2js/sourceMapViewer/README.TXT b/tools/dart2js/sourceMapViewer/README.TXT
new file mode 100644
index 0000000..aa8cab5
--- /dev/null
+++ b/tools/dart2js/sourceMapViewer/README.TXT
@@ -0,0 +1,7 @@
+This program serves a visualization of a JavaScript source map file generated 
+by dart2js or pub.
+
+Usage: dart bin/source_map_viewer.dart <path to map file>.
+
+The default system browser is started and pointed to the viewer if available.
+
diff --git a/tools/dart2js/sourceMapViewer/bin/source_map_viewer.dart b/tools/dart2js/sourceMapViewer/bin/source_map_viewer.dart
new file mode 100644
index 0000000..8981862
--- /dev/null
+++ b/tools/dart2js/sourceMapViewer/bin/source_map_viewer.dart
@@ -0,0 +1,132 @@
+// 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:io';
+import 'package:http_server/http_server.dart' as http_server;
+import 'package:route/server.dart';
+import 'package:path/path.dart';
+import 'package:http_server/http_server.dart';
+
+/*
+ * This program serves a visualization of a JavaScript source map file generated
+ * by dart2js or pub.
+ *
+ * Usage: dart source_map_viewer.dart <path to map file>.
+ *
+ * The default system browser is started and pointed to the viewer if
+ * available.
+ */
+
+Directory rootDir = null;
+String sourceMapFile;
+
+void main(List<String> args) {
+  if (args.length != 1) {
+    print('One argument expected; the source map file.');
+    exit(-1);
+    return;
+  }
+
+  File mapFile = new File(args[0]);
+  if (!mapFile.existsSync()) {
+    print('Map file not found at ${args[0]}');
+    exit(-2);
+    return;
+  }
+
+  sourceMapFile = basename(mapFile.path);
+  rootDir = mapFile.parent;
+  startServer(rootDir);
+}
+
+// Sends the content of the file requested in the path parameter.
+void handleFile(HttpRequest request) {
+  String path = request.uri.queryParameters["path"];
+  if (path == null) {
+    request.response.close();
+    return;
+  }
+
+  path = rootDir.path + '/' + path;
+  new File(Uri.parse(path).toFilePath()).openRead()
+    .pipe(request.response).catchError((e) {
+  print("Error: $e");
+    request.response.close();
+  });
+}
+
+// Sends back the name of the source map file.
+void handleSourceMapFile(HttpRequest request) {
+  request.response.write(sourceMapFile);
+  request.response.close();
+}
+
+// Starts an HttpServer rooted in [dir] with two special routes, /file and /map.
+//
+// /file takes a parameter [path] and serves the content of the specified file
+//  in path relative to [dir]
+//
+// /map serves the name of the map file such that its content can be requested
+// with a /file request as above.
+void startServer(Directory dir) {
+  rootDir = dir;
+  // Use port 0 to get an ephemeral port.
+  int port = 0;
+  HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, port).then((server) {
+    port = server.port;
+    print("Source mapping server is running on "
+           "'http://${server.address.address}:$port/'");
+    Router router = new Router(server)
+                ..serve('/file').listen(handleFile)
+                ..serve('/map').listen(handleSourceMapFile);
+
+    // Set up default handler. This will serve files from our 'build'
+    // directory. Disable jail root, as packages are local symlinks.
+    VirtualDirectory virDir = new http_server.VirtualDirectory(dir.path)
+      ..jailRoot = false
+      ..allowDirectoryListing = true;
+
+    virDir.directoryHandler = (dir, request) {
+      // Redirect directory requests to index.html files.
+      Uri indexUri = new Uri.file(dir.path).resolve('display.html');
+      virDir.serveFile(new File(indexUri.toFilePath()), request);
+    };
+
+    // Add an error page handler.
+    virDir.errorPageHandler = (HttpRequest request) {
+      print("Resource not found: ${request.uri.path}");
+      request.response.statusCode = HttpStatus.NOT_FOUND;
+      request.response.close();
+    };
+
+    // Serve everything not routed elsewhere through the virtual directory.
+    virDir.serve(router.defaultStream);
+
+    // Start the system' default browser
+    startBrowser('http://${server.address.address}:$port/');
+  });
+}
+
+startBrowser(String url) {
+  String command;
+  if (Platform.isWindows) {
+    command = 'cmd.exe /C start';
+  } else if (Platform.isMacOS) {
+    command = 'open';
+  } else {
+    String xdg = '/usr/bin/xdg-open';
+    if (new File(xdg).existsSync()) {
+      command = xdg;
+    } else {
+      command = '/usr/bin/google-chrome';
+    }
+  }
+
+  print('Starting browser: ${command} ${url}');
+  Process.run(command, ['$url']).then((ProcessResult result) {
+    if (result.exitCode != 0) {
+      print(result.stderr);
+    }
+  });
+}
\ No newline at end of file
diff --git a/tools/dart2js/sourceMapViewer/pubspec.yaml b/tools/dart2js/sourceMapViewer/pubspec.yaml
new file mode 100644
index 0000000..4ab317d
--- /dev/null
+++ b/tools/dart2js/sourceMapViewer/pubspec.yaml
@@ -0,0 +1,7 @@
+name: Display
+description: A sample web application
+dependencies:
+  browser: any
+  http_server: any
+  route: any
+  source_maps: any
diff --git a/tools/dart2js/sourceMapViewer/web/display.dart b/tools/dart2js/sourceMapViewer/web/display.dart
new file mode 100644
index 0000000..a6d02be
--- /dev/null
+++ b/tools/dart2js/sourceMapViewer/web/display.dart
@@ -0,0 +1,323 @@
+// 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:html';
+import 'dart:convert';
+import 'dart:async';
+import 'package:source_maps/source_maps.dart';
+
+Element targetFileName = querySelector("#target_filename");
+Element sourceFileName = querySelector("#source_filename");
+DivElement generatedOutput = querySelector("#generated_output");
+DivElement selectedSource = querySelector("#selected_source");
+DivElement selectedOutputSpan = querySelector("#current_span");
+DivElement decodedMap = querySelector("#decoded_map");
+DivElement originalMap = querySelector("#original_map");
+
+Map<TargetEntry, List<SpanElement>> targetEntryMap = {};
+List<SpanElement> highlightedMapEntry = null;
+List<String> target;
+SingleMapping sourceMap;
+
+void adjustDivHeightsToWindow() {
+  generatedOutput.style.height = "${window.innerHeight / 3 - 50}px";
+  selectedSource.style.height = "${window.innerHeight / 3 - 50}px";
+  decodedMap.style.height = "${window.innerHeight / 3 - 50}px";
+  originalMap.style.height = "${window.innerHeight / 3 - 50}px";
+}
+
+Future getMap() {
+  Completer c = new Completer();
+  HttpRequest httpRequest = new HttpRequest();
+  httpRequest
+      ..open('GET', '/map')
+      ..onLoadEnd.listen((_) => c.complete(httpRequest.responseText))
+      ..send('');
+  return c.future;
+}
+
+Future fetchFile(String path) {
+  Completer c = new Completer();
+  HttpRequest httpRequest = new HttpRequest();
+  sourceFileName.text = path;
+  httpRequest
+      ..open('GET', path)
+      ..onLoadEnd.listen((_) => c.complete(httpRequest.responseText))
+      ..send('');
+  return c.future;
+}
+
+displaySource(String filename, List<String> source, TargetEntry entry) {
+  int line = entry.sourceLine;
+  int column = entry.sourceColumn;
+  int nameId = entry.sourceNameId;
+  String id = nameId == null ? null : sourceMap.names[nameId];
+  selectedSource.children.clear();
+  SpanElement marker = new SpanElement()
+      ..className = "marker"
+      ..appendText("*");
+  for (int pos = 0; pos < source.length; pos++) {
+    String l = source[pos];
+    if (pos != line) {
+      selectedSource.children.add(l.isEmpty ? new BRElement() : new DivElement()
+          ..appendText(l));
+    } else {
+      selectedSource.children.add(new DivElement()
+          ..appendText(l.substring(0, column))
+          ..children.add(marker)
+          ..appendText(l.substring(column)));
+    }
+  }
+  sourceFileName.text = filename;
+  marker.scrollIntoView();
+}
+
+void highlightSelectedSpan(TargetEntry entry, TargetLineEntry lineEntry) {
+  selectedOutputSpan.children.clear();
+  String spanEndCol;
+  TargetEntry spanEnd;
+  bool nextEntryIsSpanEnd = false;
+  for (TargetEntry e in lineEntry.entries) {
+    if (nextEntryIsSpanEnd) {
+      spanEnd = e;
+      break;
+    }
+    if (e == entry) {
+      nextEntryIsSpanEnd = true;
+    }
+  }
+  if (spanEnd == null) {
+    spanEndCol = '${target[lineEntry.line].length} (EOL).';
+  } else {
+    spanEndCol = '${spanEnd.column}.';
+  }
+
+  String targetSpan =
+      'Target:  Line ${lineEntry.line} Col. ${entry.column} - $spanEndCol';
+
+  if (entry.sourceUrlId == null) {
+    targetSpan += ' Source: unknown';
+    selectedOutputSpan.children.add(getTextElement(targetSpan));
+    return;
+  }
+
+  String source = sourceMap.urls[entry.sourceUrlId];
+  String sourceName = source.substring(source.lastIndexOf('/') + 1);
+  String sourcePoint =
+      'Source: Line ${entry.sourceLine} Col. ${entry.sourceColumn}';
+  sourcePoint +=
+      entry.sourceNameId == null ? ''
+      : ' (${sourceMap.names[entry.sourceNameId]})';
+  sourcePoint += ' in $sourceName';
+  selectedOutputSpan.children.add(getTextElement(targetSpan));
+  selectedOutputSpan.children.add(new BRElement());
+  selectedOutputSpan.children.add(getTextElement(sourcePoint));
+
+  if (highlightedMapEntry != null) {
+    highlightedMapEntry[0].style.background = 'white';
+    highlightedMapEntry[1].style.background = 'white';
+  }
+
+  String highlightColor = "#99ff99";
+  highlightedMapEntry = targetEntryMap[entry];
+  highlightedMapEntry[0]
+     ..scrollIntoView()
+     ..style.backgroundColor = highlightColor;
+  highlightedMapEntry[1]
+     ..scrollIntoView()
+     ..style.backgroundColor = highlightColor;
+  highlightedMapEntry[1].onMouseOver.listen((e) {
+    selectedOutputSpan.style.zIndex = "2";
+    selectedOutputSpan.style.visibility = "visible";
+    selectedOutputSpan.style.top = "${decodedMap.offsetTo(document.body).y +
+                                      decodedMap.clientHeight - 20}px";
+    selectedOutputSpan.style.left = "${decodedMap.offsetTo(document.body).x}px";
+    selectedOutputSpan.style.width= "${decodedMap.clientWidth}px";
+  });
+
+  highlightedMapEntry[1].onMouseOut.listen( (e) {
+    selectedOutputSpan.style.visibility = "hidden";
+  });
+
+  adjustDivHeightsToWindow();
+}
+
+void loadSource(TargetEntry entry) {
+  if (entry.sourceUrlId == null) {
+    return;
+  }
+
+  String source = sourceMap.urls[entry.sourceUrlId];
+  fetchFile(new Uri(path: "/file",
+                    queryParameters: {"path": source}).toString()).then((text)
+                        => displaySource(source, text.split("\n"), entry));
+  selectedSource.text = "loading";
+}
+
+SpanElement createSpan(String content, TargetEntry entry,
+                       TargetLineEntry lineEntry) {
+    return new SpanElement()
+    ..addEventListener('click', (e) {
+       loadSource(entry);
+       highlightSelectedSpan(entry, lineEntry);
+     }, false)
+    ..className = "range${entry.sourceUrlId % 4}"
+    ..appendText(content);
+}
+
+Element getLineNumberElement(int line) {
+  SpanElement result = new SpanElement();
+  result.style.fontFamily = "Courier";
+  result.style.fontSize = "10pt";
+  result.appendText("${line} ");
+  return result;
+}
+
+Element getTextElement(String text) {
+  SpanElement result = new SpanElement();
+  result.text = text;
+  return result;
+}
+
+addTargetLine(int lineNumber, String content, TargetLineEntry lineEntry) {
+  if (content.isEmpty) {
+    generatedOutput.children.add(new DivElement()
+        ..children.add(getLineNumberElement(lineNumber)));
+    return;
+  }
+  if (lineEntry == null) {
+    generatedOutput.children.add(new DivElement()
+        ..children.add(getLineNumberElement(lineNumber))
+        ..children.add(getTextElement(content)));
+    return;
+  }
+  DivElement div = new DivElement();
+  div.children.add(getLineNumberElement(lineNumber));
+
+  int pos = 0;
+  TargetEntry previous = null;
+  for (TargetEntry next in lineEntry.entries) {
+    if (previous == null) {
+      if (pos < next.column) {
+        div.appendText(content.substring(pos, next.column));
+      }
+      if (content.length == next.column) {
+        div.children.add(createSpan(" ", next, lineEntry));
+      }
+    } else {
+      if (next.column <= content.length) {
+        String token = content.substring(pos, next.column);
+        div.children.add(createSpan(token, previous, lineEntry));
+      }
+      if (content.length == next.column) {
+        div.children.add(createSpan(" ", next, lineEntry));
+      }
+    }
+    pos = next.column;
+    previous = next;
+  }
+  String token = content.substring(pos);
+  if (previous == null) {
+    div.appendText(token);
+  } else {
+    div..children.add(createSpan(token, previous, lineEntry));
+  }
+  generatedOutput.children.add(div);
+}
+
+// Display the target source in the HTML.
+void displayTargetSource() {
+  List<TargetLineEntry> targetLines = sourceMap.lines;
+  int linesIndex = 0;
+  for (int line = 0; line < target.length; line++) {
+    TargetLineEntry entry = null;
+    if (linesIndex < targetLines.length
+        && targetLines[linesIndex].line == line) {
+      entry = targetLines[linesIndex];
+      linesIndex++;
+    }
+    if (entry != null) {
+      addTargetLine(line, target[line], entry);
+    } else {
+      addTargetLine(line, target[line], null);
+    }
+  }
+}
+
+String getMappedData(String mapFileContent) {
+  // Source map contains mapping information in this format:
+  // "mappings": "A;A,yC;"
+  List<String> mapEntry = mapFileContent.split('mappings');
+  return mapEntry[mapEntry.length-1].split('"')[2];
+}
+
+SpanElement createMapSpan(String segment) {
+  return new SpanElement()..text = segment;
+}
+
+SpanElement createDecodedMapSpan(TargetEntry entry) {
+  return new SpanElement()..text = '(${entry.column}, ${entry.sourceUrlId},'
+                                   ' ${entry.sourceLine},'
+                                   ' ${entry.sourceColumn})';
+}
+
+displayMap(String mapFileContent) {
+  String mappedData = getMappedData(mapFileContent);
+  int sourceMapLine = 0;
+  for (String group in mappedData.split(';')) {
+    if (group.length == 0) continue;
+
+    List<String> segments = [];
+    if (!group.contains(',')) {
+      segments.add(group);
+    } else {
+      segments = group.split(',');
+    }
+
+    TargetLineEntry targetLineEntry = sourceMap.lines[sourceMapLine];
+    decodedMap.children.add(getLineNumberElement(targetLineEntry.line));
+    originalMap.children.add(getLineNumberElement(targetLineEntry.line));
+    bool first = true;
+    int entryNumber = 0;
+    for (String segment in segments) {
+      TargetEntry entry = targetLineEntry.entries[entryNumber];
+      SpanElement orignalMapSpan = createMapSpan(segment);
+      SpanElement decodedMapSpan = createDecodedMapSpan(entry);
+      if (first) {
+        first = false;
+      } else {
+        originalMap.children.add(getTextElement(', '));
+        decodedMap.children.add(getTextElement(', '));
+      }
+      originalMap.children.add(orignalMapSpan);
+      decodedMap.children.add(decodedMapSpan);
+      ++entryNumber;
+      targetEntryMap.putIfAbsent(entry, () => [orignalMapSpan, decodedMapSpan]);
+    }
+    originalMap.children.add(new BRElement());
+    decodedMap.children.add(new BRElement());
+    ++sourceMapLine;
+  }
+}
+
+void main() {
+  Future load(String q) => fetchFile(new Uri(path: "/file", queryParameters: {
+    "path": q
+  }).toString());
+
+  getMap().then((mapFileName) {
+    load(mapFileName).then((mapFileContent) {
+      sourceMap = new SingleMapping.fromJson(JSON.decode(mapFileContent));
+      displayMap(mapFileContent);
+      targetFileName.text = sourceMap.targetUrl;
+      load(targetFileName.text).then((targetFileContent) {
+        target = targetFileContent.split('\n');
+        displayTargetSource();
+        adjustDivHeightsToWindow();
+      });
+    });
+  });
+
+  sourceFileName.text = "<source not selected>";
+}
\ No newline at end of file
diff --git a/tools/dart2js/sourceMapViewer/web/display.html b/tools/dart2js/sourceMapViewer/web/display.html
new file mode 100644
index 0000000..f6d6758
--- /dev/null
+++ b/tools/dart2js/sourceMapViewer/web/display.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>Display</title>
+  </head>
+  <style>
+    span.range0 {color:green;background-color:#DA81F5}
+    span.range1 {color:green;background-color:#81F7D8}
+    span.range2 {color:green;background-color:#BEF781}
+    span.range3 {color:green;background-color:#F79F81}
+    span.marker {
+      color:green;
+      background-color:red;
+      white-space: pre
+    }
+    #group{
+      width:100%;
+      height:100%;
+    }
+    span.source pre {
+      white-space: pre;
+      font-family: monospace
+    }
+    div#generated_output div{
+      white-space: pre;
+      font-family: monospace
+    }
+    div#selected_source div{
+      white-space: pre;
+      font-family: monospace
+    }
+  </style>
+  <body>
+    <h1>Display</h1>
+    <div id="group">
+    <table style="width:100%;">
+    <tr><td>
+      <h2>Generated Output</h2>
+      <div id="target_filename"></div>
+      <div id="generated_output" style="border:2px solid;overflow:scroll;width:550px;height:50px;"></div>
+    </td><td>
+      <h2>Selected Source Code</h2>
+      <div id="source_filename"></div>
+      <div id="selected_source" style="border:2px solid;overflow:scroll;width:550px;height:50px;"></div>
+    </td><td>
+      <div id="current_span" style="background-color: #99ff99;visibility:hidden;border:green 1px dashed;overflow:scroll;width:250px;height:50px;font-size:12pt;position:absolute;"></div>
+    </td>
+    <tr><td>
+     <h2>Decoded Map</h2>
+     <small><i>(&lt;generated column&gt;,&lt;src url id&gt;,&lt;src line&gt;,&lt;src col&gt;)</i></small>
+     <div id="decoded_map" style="border: 2px solid;overflow:scroll;width:550px;height:50px;"></div>
+     </td><td>
+     <h2>Original Map</h2>
+     <small><i>The encoded mapping data.</i></small>
+     <div id="original_map" style="border: 2px solid;overflow:scroll;width:550px;height:50px;"></div>
+     </td>
+    </tr>
+    </table></div>
+    <script type="application/dart" src="display.dart"></script>
+    <script src="packages/browser/dart.js"></script>
+  </body>
+</html>
\ No newline at end of file
diff --git a/tools/dartium/archive.py b/tools/dartium/archive.py
index 04889cc..b5f1e33 100755
--- a/tools/dartium/archive.py
+++ b/tools/dartium/archive.py
@@ -8,7 +8,6 @@
 import optparse
 import os
 import shutil
-import subprocess
 import sys
 import utils
 
@@ -88,7 +87,7 @@
   if HOST_OS == 'win':
     cmd = os.path.normpath(os.path.join(
         os.path.dirname(__file__),
-        '../third_party/lzma_sdk/Executable/7za.exe'))
+        '../../../third_party/lzma_sdk/Executable/7za.exe'))
     options = ['a', '-r', '-tzip']
   else:
     cmd = 'zip'
diff --git a/tools/dartium/buildbot_annotated_steps.py b/tools/dartium/buildbot_annotated_steps.py
index 7f95594..ac6ec7f 100755
--- a/tools/dartium/buildbot_annotated_steps.py
+++ b/tools/dartium/buildbot_annotated_steps.py
@@ -1,154 +1,39 @@
 #!/usr/bin/python
 
-# Copyright (c) 2011 The Chromium Authors. All rights reserved.
+# Copyright (c) 2014 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-"""Chromium buildbot steps
+"""Dartium buildbot steps
 
-Run the Dart layout tests.
+Archive dartium, content_shell, and chromedriver to the cloud storage bucket
+gs://dart-archive, and run tests, including the Dart layout tests.
 """
 
+import imp
 import os
 import platform
 import re
 import shutil
-import socket
 import subprocess
 import sys
-import imp
 
-BUILDER_NAME = 'BUILDBOT_BUILDERNAME'
-REVISION = 'BUILDBOT_REVISION'
-BUILDER_PATTERN = (r'^dartium-(mac|lucid64|lucid32|win)'
-                   r'-(full|inc|debug)(-ninja)?(-(be|dev|stable|integration))?$')
-
-if platform.system() == 'Windows':
-  GSUTIL = 'e:/b/build/scripts/slave/gsutil.bat'
-else:
-  GSUTIL = '/b/build/scripts/slave/gsutil'
-ACL = 'public-read'
-GS_SITE = 'gs://'
-GS_URL = 'https://sandbox.google.com/storage/'
-GS_DIR = 'dartium-archive'
-LATEST = 'latest'
-CONTINUOUS = 'continuous'
-
-REVISION_FILE = 'chrome/browser/ui/webui/dartvm_revision.h'
-
-# Add dartium tools and build/util to python path.
-SRC_PATH = os.path.dirname(os.path.dirname(
-    os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
-DART_PATH = os.path.join(SRC_PATH, 'dart')
-TOOLS_PATH = os.path.join(DART_PATH, 'tools', 'dartium')
-BUILD_UTIL_PATH = os.path.join(SRC_PATH, 'build', 'util')
-# We limit testing on drt since it takes a long time to run
-DRT_FILTER = 'html'
-
-
-sys.path.extend([TOOLS_PATH, BUILD_UTIL_PATH])
-import archive
+import dartium_bot_utils
+import upload_steps
 import utils
 
-bot_utils = imp.load_source('bot_utils',
-    os.path.join(DART_PATH, 'tools', 'bots', 'bot_utils.py'))
+SRC_PATH = dartium_bot_utils.srcPath()
+DART_PATH = os.path.join(SRC_PATH, 'dart')
 
-def DartArchiveFile(local_path, remote_path, create_md5sum=False):
-  # Copy it to the new unified gs://dart-archive bucket
-  # TODO(kustermann/ricow): Remove all the old archiving code, once everything
-  # points to the new location
-  gsutil = bot_utils.GSUtil()
-  gsutil.upload(local_path, remote_path, public=True)
-  if create_md5sum:
-    # 'local_path' may have a different filename than 'remote_path'. So we need
-    # to make sure the *.md5sum file contains the correct name.
-    assert '/' in remote_path and not remote_path.endswith('/')
-    mangled_filename = remote_path[remote_path.rfind('/') + 1:]
-    local_md5sum = bot_utils.CreateChecksumFile(local_path, mangled_filename)
-    gsutil.upload(local_md5sum, remote_path + '.md5sum', public=True)
-
-def UploadDartiumVariant(revision, name, channel, arch, mode, zip_file):
-  name = name.replace('drt', 'content_shell')
-  system = sys.platform
-
-  namer = bot_utils.GCSNamer(channel, bot_utils.ReleaseType.RAW)
-  remote_path = namer.dartium_variant_zipfilepath(revision, name, system, arch,
-      mode)
-  DartArchiveFile(zip_file, remote_path, create_md5sum=True)
-  return remote_path
-
-def ExecuteCommand(cmd):
-  """Execute a command in a subprocess.
-  """
-  print 'Executing: ' + ' '.join(cmd)
-  try:
-    pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-    (output, error) = pipe.communicate()
-    if pipe.returncode != 0:
-      print 'Execution failed: ' + str(error)
-    return (pipe.returncode, output)
-  except:
-    import traceback
-    print 'Execution raised exception:', traceback.format_exc()
-    return (-1, '')
-
-
-# TODO: Instead of returning a tuple we should make a class with these fields.
-def GetBuildInfo():
-  """Returns a tuple (name, dart_revision, version, mode, arch, channel,
-     is_full) where:
-    - name: A name for the build - the buildbot host if a buildbot.
-    - dart_revision: The dart revision.
-    - version: A version string corresponding to this build.
-    - mode: 'Debug' or 'Release'
-    - arch: target architecture
-    - channel: the channel this build is happening on
-    - is_full: True if this is a full build.
-  """
-  os.chdir(SRC_PATH)
-
-  name = None
-  version = None
-  mode = 'Release'
-
-  # Populate via builder environment variables.
-  name = os.environ[BUILDER_NAME]
-
-  # We need to chdir() to src/dart in order to get the correct revision number.
-  with utils.ChangedWorkingDirectory(DART_PATH):
-    dart_tools_utils = imp.load_source('dart_tools_utils',
-                                       os.path.join('tools', 'utils.py'))
-    dart_revision = dart_tools_utils.GetSVNRevision()
-
-  version = dart_revision + '.0'
-  is_incremental = '-inc' in name
-  is_win_ninja = 'win-inc-ninja' in name
-  is_full = False
-
-  pattern = re.match(BUILDER_PATTERN, name)
-  assert pattern
-  arch = 'x64' if pattern.group(1) == 'lucid64' else 'ia32'
-  if pattern.group(2) == 'debug':
-    mode = 'Debug'
-  is_full = pattern.group(2) == 'full'
-  channel = pattern.group(5)
-  if not channel:
-    channel = 'be'
-
-  # Fall back if not on builder.
-  if not name:
-    name = socket.gethostname().split('.')[0]
-
-  return (name, dart_revision, version, mode, arch, channel, is_full,
-          is_incremental, is_win_ninja)
-
+# We limit testing on drt since it takes a long time to run.
+DRT_FILTER = 'html'
 
 def RunDartTests(mode, component, suite, arch, checked, test_filter=None,
                  is_win_ninja=False):
   """Runs the Dart WebKit Layout tests.
   """
   cmd = [sys.executable]
-  script = os.path.join(TOOLS_PATH, 'test.py')
+  script = os.path.join(DART_PATH, 'tools', 'dartium', 'test.py')
   cmd.append(script)
   cmd.append('--buildbot')
   cmd.append('--mode=' + mode)
@@ -170,197 +55,68 @@
   return status
 
 
-def UploadDartTestsResults(layout_test_results_dir, name, version,
-                           component, checked):
-  """Uploads test results to google storage.
+def Test(info, component, suite, checked, test_filter=None):
+  """Test a particular component (e.g., dartium or content_shell(drt)).
   """
-  print ('@@@BUILD_STEP archive %s_layout_%s_tests results@@@' %
-         (component, checked))
-  dir_name = os.path.dirname(layout_test_results_dir)
-  base_name = os.path.basename(layout_test_results_dir)
-  cwd = os.getcwd()
-  os.chdir(dir_name)
-
-  archive_name = 'layout_test_results.zip'
-  archive.ZipDir(archive_name, base_name)
-
-  target = '/'.join([GS_DIR, 'layout-test-results', name, component + '-' +
-                     checked + '-' + version + '.zip'])
-  status = UploadArchive(os.path.abspath(archive_name), GS_SITE + target)
-  os.remove(archive_name)
-  if status == 0:
-    print ('@@@STEP_LINK@download@' + GS_URL + target + '@@@')
-  else:
-    print '@@@STEP_FAILURE@@@'
-  os.chdir(cwd)
-
-
-def ListArchives(pattern):
-  """List the contents in Google storage matching the file pattern.
-  """
-  cmd = [GSUTIL, 'ls', pattern]
-  (status, output) = ExecuteCommand(cmd)
-  if status != 0:
-    return []
-  return output.split(os.linesep)
-
-
-def RemoveArchives(archives):
-  """Remove the list of archives in Google storage.
-  """
-  for archive in archives:
-    if archive.find(GS_SITE) == 0:
-      cmd = [GSUTIL, 'rm', archive.rstrip()]
-      (status, _) = ExecuteCommand(cmd)
-      if status != 0:
-        return status
-  return 0
-
-
-def UploadArchive(source, target):
-  """Upload an archive zip file to Google storage.
-  """
-
-  # Upload file.
-  cmd = [GSUTIL, 'cp', source, target]
-  (status, output) = ExecuteCommand(cmd)
-  if status != 0:
-    return status
-  print 'Uploaded: ' + output
-
-  # Set ACL.
-  if ACL is not None:
-    cmd = [GSUTIL, 'setacl', ACL, target]
-    (status, output) = ExecuteCommand(cmd)
+  print '@@@BUILD_STEP %s_%s_%s_tests@@@' % (component, suite, checked)
+  sys.stdout.flush()
+  layout_test_results_dir = os.path.join(SRC_PATH, 'webkit', info.mode,
+                                         'layout-test-results')
+  shutil.rmtree(layout_test_results_dir, ignore_errors=True)
+  status = RunDartTests(info.mode, component, suite, info.arch, checked,
+                        test_filter=test_filter, is_win_ninja=info.is_win_ninja)
+    # Archive test failures
+  if suite == 'layout' and status != 0:
+    upload_steps.UploadDartTestsResults(layout_test_results_dir,
+                                        info.name,
+                                        info.version,
+                                        component, checked)
   return status
 
 
 def main():
-  (dartium_bucket, dart_revision, version, mode, arch, channel,
-   is_full, is_incremental, is_win_ninja) = GetBuildInfo()
-  drt_bucket = dartium_bucket.replace('dartium', 'drt')
-  chromedriver_bucket = dartium_bucket.replace('dartium', 'chromedriver')
+  # We need to chdir() to src/dart in order to get the correct revision number.
+  with utils.ChangedWorkingDirectory(DART_PATH):
+    dart_tools_utils = imp.load_source('dart_tools_utils',
+                                       os.path.join('tools', 'utils.py'))
+    dart_revision = dart_tools_utils.GetSVNRevision()
 
-  def archiveAndUpload(archive_latest=False):
-    print '@@@BUILD_STEP dartium_generate_archive@@@'
-    cwd = os.getcwd()
-    dartium_archive = dartium_bucket + '-' + version
-    drt_archive = drt_bucket + '-' + version
-    chromedriver_archive = chromedriver_bucket + '-' + version
-    dartium_zip, drt_zip, chromedriver_zip = \
-        archive.Archive(SRC_PATH, mode, dartium_archive,
-                        drt_archive, chromedriver_archive,
-                        is_win_ninja=is_win_ninja)
-    status = upload('dartium', dartium_bucket, os.path.abspath(dartium_zip),
-                    archive_latest=archive_latest)
-    if status == 0:
-      status = upload('drt', drt_bucket, os.path.abspath(drt_zip),
-                      archive_latest=archive_latest)
-    if status == 0:
-      status = upload('chromedriver', chromedriver_bucket,
-                      os.path.abspath(chromedriver_zip),
-                      archive_latest=archive_latest)
-    os.chdir(cwd)
-    if status != 0:
-      print '@@@STEP_FAILURE@@@'
-    return status
-
-  def upload(module, bucket, zip_file, archive_latest=False):
-    status = 0
-
-    # We archive to the new location on all builders except for -inc builders.
-    if not is_incremental:
-      print '@@@BUILD_STEP %s_upload_archive_new @@@' % module
-      # We archive the full builds to gs://dart-archive/
-      revision = 'latest' if archive_latest else dart_revision
-      remote_path = UploadDartiumVariant(revision, module, channel, arch,
-          mode.lower(), zip_file)
-      print '@@@STEP_LINK@download@' + remote_path + '@@@'
-
-    # We archive to the old locations only for bleeding_edge builders
-    if channel == 'be':
-      _, filename = os.path.split(zip_file)
-      if not archive_latest:
-        target = '/'.join([GS_DIR, bucket, filename])
-        print '@@@BUILD_STEP %s_upload_archive@@@' % module
-        status = UploadArchive(zip_file, GS_SITE + target)
-        print '@@@STEP_LINK@download@' + GS_URL + target + '@@@'
-      else:
-        print '@@@BUILD_STEP %s_upload_latest@@@' % module
-        # Clear latest for this build type.
-        old = '/'.join([GS_DIR, LATEST, bucket + '-*'])
-        old_archives = ListArchives(GS_SITE + old)
-
-        # Upload the new latest and remove unnecessary old ones.
-        target = GS_SITE + '/'.join([GS_DIR, LATEST, filename])
-        status = UploadArchive(zip_file, target)
-        if status == 0:
-          RemoveArchives(
-              [iarch for iarch in old_archives if iarch != target])
-        else:
-          print 'Upload failed'
-
-        # Upload unversioned name to continuous site for incremental
-        # builds.
-        if '-inc' in bucket:
-          continuous_name = bucket[:bucket.find('-inc')]
-          target = GS_SITE + '/'.join([GS_DIR, CONTINUOUS,
-                                       continuous_name + '.zip'])
-          status = UploadArchive(zip_file, target)
-
-      print ('@@@BUILD_STEP %s_upload_archive is over (status = %s)@@@' %
-          (module, status))
-
-    return status
-
-  def test(component, suite, checked, test_filter=None):
-    """Test a particular component (e.g., dartium or frog).
-    """
-    print '@@@BUILD_STEP %s_%s_%s_tests@@@' % (component, suite, checked)
-    sys.stdout.flush()
-    layout_test_results_dir = os.path.join(SRC_PATH, 'webkit', mode,
-                                           'layout-test-results')
-    shutil.rmtree(layout_test_results_dir, ignore_errors=True)
-    status = RunDartTests(mode, component, suite, arch, checked,
-                          test_filter=test_filter, is_win_ninja=is_win_ninja)
-
-    if suite == 'layout' and status != 0:
-      UploadDartTestsResults(layout_test_results_dir, dartium_bucket, version,
-                             component, checked)
-    return status
+  version = dart_revision + '.0'
+  info = upload_steps.BuildInfo(version, dart_revision)
 
   result = 0
 
   # Archive to the revision bucket unless integration build
-  if channel != 'integration':
-    result = archiveAndUpload(archive_latest=False)
-
+  if info.channel != 'integration':
+    result = upload_steps.ArchiveAndUpload(info, archive_latest=False)
     # On dev/stable we archive to the latest bucket as well
-    if channel != 'be':
-      result = archiveAndUpload(archive_latest=True) or result
+    if info.channel != 'be':
+      result = (upload_steps.ArchiveAndUpload(info, archive_latest=True)
+                or result)
 
   # Run layout tests
-  if mode == 'Release' or platform.system() != 'Darwin':
-    result = test('drt', 'layout', 'unchecked') or result
-    result = test('drt', 'layout', 'checked') or result
+  if info.mode == 'Release' or platform.system() != 'Darwin':
+    result = Test(info, 'drt', 'layout', 'unchecked') or result
+    result = Test(info, 'drt', 'layout', 'checked') or result
 
   # Run dartium tests
-  result = test('dartium', 'core', 'unchecked') or result
-  result = test('dartium', 'core', 'checked') or result
+  result = Test(info, 'dartium', 'core', 'unchecked') or result
+  result = Test(info, 'dartium', 'core', 'checked') or result
 
   # Run ContentShell tests
   # NOTE: We don't run ContentShell tests on dartium-*-inc builders to keep
   # cycle times down.
-  if not is_incremental:
+  if not info.is_incremental:
     # If we run all checked tests on dartium, we restrict the number of
     # unchecked tests on drt to DRT_FILTER
-    result = test('drt', 'core', 'unchecked', test_filter=DRT_FILTER) or result
-    result = test('drt', 'core', 'checked') or result
+    result = Test(info, 'drt', 'core', 'unchecked',
+                  test_filter=DRT_FILTER) or result
+    result = Test(info, 'drt', 'core', 'checked') or result
 
-  # On the 'be' channel, we only archive to the latest bucket if all tests ran
-  # successfull.
-  if result == 0 and channel == 'be':
-    result = archiveAndUpload(archive_latest=True) or result
+  # On the 'be' channel, we only archive to the latest bucket if all tests were
+  # successful.
+  if result == 0 and info.channel == 'be':
+    result = upload_steps.ArchiveAndUpload(info, archive_latest=True) or result
 
 if __name__ == '__main__':
   sys.exit(main())
diff --git a/tools/dartium/dartium_bot_utils.py b/tools/dartium/dartium_bot_utils.py
new file mode 100644
index 0000000..6fb0303
--- /dev/null
+++ b/tools/dartium/dartium_bot_utils.py
@@ -0,0 +1,23 @@
+#!/usr/bin/python
+
+# Copyright (c) 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Utility functions specific to dartium buildbot checkouts
+"""
+import os
+
+def srcPath():
+  """Return the path [dartium_checkout]/src
+
+       Only valid if this file is in a dartium checkout.
+  """
+  # This file is in [dartium checkout]/src/dart/tools/dartium/,
+  # if we are in a dartium checkout that checks out dart into src.
+  # This function cannot be in utils.py because __file__ is wrong
+  # when other modules with the name 'utils' are imported indirectly.
+  return os.path.dirname(
+         os.path.dirname(
+         os.path.dirname(
+         os.path.dirname(os.path.abspath(__file__)))))
diff --git a/tools/dartium/multivm_archive.py b/tools/dartium/multivm_archive.py
new file mode 100644
index 0000000..6b3877c
--- /dev/null
+++ b/tools/dartium/multivm_archive.py
@@ -0,0 +1,41 @@
+#!/usr/bin/python
+
+# Copyright (c) 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Archive builds from the multivm and dartium perf builders
+
+Archive dartium, content_shell, and chromedriver to the old cloud storage bucket
+gs://dartium-archive.
+"""
+
+import os
+import platform
+import re
+import subprocess
+import sys
+
+import dartium_bot_utils
+import upload_steps
+
+SRC_PATH = dartium_bot_utils.srcPath()
+
+def main():
+  print SRC_PATH
+  multivm_deps = os.path.join(os.path.dirname(SRC_PATH), 'multivm.deps')
+  revision_directory = (multivm_deps if (os.path.isdir(multivm_deps))
+                           else os.path.join(SRC_PATH, 'dart'))
+  output, _ = subprocess.Popen(['svn', 'info'],
+                               stdout=subprocess.PIPE,
+                               stderr=subprocess.STDOUT,
+                               shell=(platform.system == 'Windows'),
+                               cwd=revision_directory).communicate()
+  revision = re.search('Last Changed Rev: (\d+)', output).group(1)
+  version = revision + '.0'
+  info = upload_steps.BuildInfo(version, revision)
+  if info.is_build:
+    upload_steps.ArchiveAndUpload(info, archive_latest=False)
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/tools/dartium/test.py b/tools/dartium/test.py
index 75b85d5..d879d6e 100755
--- a/tools/dartium/test.py
+++ b/tools/dartium/test.py
@@ -142,9 +142,10 @@
     if options.unchecked: checkmodes.append('unchecked')
     if options.checked: checkmodes.append('checked')
 
+  # We are in src/dart/tools/dartium/test.py.
   pathname = os.path.dirname(sys.argv[0])
   fullpath = os.path.abspath(pathname)
-  srcpath = os.path.normpath(os.path.join(fullpath, '..'))
+  srcpath = os.path.normpath(os.path.join(fullpath, '..', '..', '..'))
 
   test_mode = ''
   timeout = 30000
diff --git a/tools/dartium/upload_steps.py b/tools/dartium/upload_steps.py
new file mode 100644
index 0000000..154acac
--- /dev/null
+++ b/tools/dartium/upload_steps.py
@@ -0,0 +1,273 @@
+#!/usr/bin/python
+
+# Copyright (c) 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Steps to archive dartium, content_shell, and chromedriver from buildbots.
+
+Imported by buildbot_annotated_steps.py and multivm_archive.py
+"""
+
+import imp
+import os
+import platform
+import re
+import subprocess
+import sys
+
+import dartium_bot_utils
+import archive
+
+BUILDER_NAME = 'BUILDBOT_BUILDERNAME'
+REVISION = 'BUILDBOT_REVISION'
+BUILDER_PATTERN = (r'^(dartium|multivm)-(mac|lucid64|lucid32|win)'
+   r'-(full|inc|debug|build)(-ninja)?(-(be|dev|stable|integration))?$')
+
+if platform.system() == 'Windows':
+  GSUTIL = 'e:/b/build/scripts/slave/gsutil.bat'
+else:
+  GSUTIL = '/b/build/scripts/slave/gsutil'
+ACL = 'public-read'
+GS_SITE = 'gs://'
+GS_URL = 'https://sandbox.google.com/storage/'
+GS_DIR = 'dartium-archive'
+LATEST = 'latest'
+CONTINUOUS = 'continuous'
+
+SRC_PATH = dartium_bot_utils.srcPath()
+DART_PATH = os.path.join(SRC_PATH, 'dart')
+
+bot_utils = imp.load_source('bot_utils',
+    os.path.join(DART_PATH, 'tools', 'bots', 'bot_utils.py'))
+
+class BuildInfo(object):
+  """
+    name: A name for the build - the buildbot host if a buildbot.
+    mode: 'Debug' or 'Release'
+    arch: target architecture
+    channel: the channel this build is happening on
+    is_full: True if this is a full build.
+    is_incremental: True if this is an incremental build.
+    is_build: True if this is a builder for the performance testers.
+    is_win_ninja: True if this is a ninja build on Windows.
+
+  """
+  def __init__(self, revision, version):
+
+    self.revision = revision
+    self.version = version
+    # Populate via builder environment variables.
+    self.name = os.environ[BUILDER_NAME]
+    # Temporary hack, until we rename the FYI bots.
+    # We should eventually rename all to linux32 and linux64.
+    self.name = self.name.replace('-linux-', '-lucid64-')
+
+    self.is_incremental = '-inc' in self.name
+    self.is_win_ninja = 'win-inc-ninja' in self.name
+    pattern = re.match(BUILDER_PATTERN, self.name)
+    assert pattern
+    self.arch = 'x64' if pattern.group(2) == 'lucid64' else 'ia32'
+    self.mode = 'Debug' if pattern.group(3) == 'debug' else 'Release'
+    self.is_full = pattern.group(3) == 'full'
+    self.is_build = pattern.group(3) == 'build'
+    self.channel = pattern.group(6) if pattern.group(6) else 'be'
+
+
+def ArchiveAndUpload(info, archive_latest=False):
+  print '@@@BUILD_STEP dartium_generate_archive@@@'
+  cwd = os.getcwd()
+
+  dartium_bucket = info.name
+  dartium_bucket = dartium_bucket.replace('multivm', 'multivm-dartium')
+  drt_bucket = dartium_bucket.replace('dartium', 'drt')
+  chromedriver_bucket = dartium_bucket.replace('dartium', 'chromedriver')
+  dartium_archive = dartium_bucket + '-' + info.version
+  drt_archive = drt_bucket + '-' + info.version
+  chromedriver_archive = chromedriver_bucket + '-' + info.version
+  dartium_zip, drt_zip, chromedriver_zip = archive.Archive(
+      SRC_PATH,
+      info.mode,
+      dartium_archive,
+      drt_archive,
+      chromedriver_archive,
+      is_win_ninja=info.is_win_ninja)
+
+  status = 0
+  # Upload bleeding-edge builds to old dartium-archive bucket
+  if info.channel == 'be':
+    status = (OldUpload('dartium', dartium_bucket,
+                        os.path.abspath(dartium_zip),
+                        archive_latest=archive_latest)
+              or OldUpload('drt', drt_bucket,
+                           os.path.abspath(drt_zip),
+                           archive_latest=archive_latest)
+              or OldUpload('chromedriver', chromedriver_bucket,
+                           os.path.abspath(chromedriver_zip),
+                           archive_latest=archive_latest))
+
+  # Upload to new dart-archive bucket using GCSNamer, but not incremental
+  # or perf builder builds.
+  if not info.is_incremental and not info.is_build:
+    Upload('dartium', os.path.abspath(dartium_zip),
+           info, archive_latest=archive_latest)
+    Upload('drt', os.path.abspath(drt_zip),
+           info, archive_latest=archive_latest)
+    Upload('chromedriver', os.path.abspath(chromedriver_zip),
+           info, archive_latest=archive_latest)
+
+  os.chdir(cwd)
+  if status != 0:
+    print '@@@STEP_FAILURE@@@'
+  return status
+
+
+def OldUpload(module, bucket, zip_file, archive_latest=False):
+  """Upload a zip file to the old bucket gs://dartium-archive/
+  """
+  # TODO(whesse): Remove the old archiving code (OldUpload, OldUploadFile,
+  # and constants they use) once everything points to the new location.
+  status = 0
+  _, filename = os.path.split(zip_file)
+  if not archive_latest:
+    target = '/'.join([GS_DIR, bucket, filename])
+    print '@@@BUILD_STEP %s_upload_archive_old@@@' % module
+    status = OldUploadFile(zip_file, GS_SITE + target)
+    print '@@@STEP_LINK@download@' + GS_URL + target + '@@@'
+  else:
+    print '@@@BUILD_STEP %s_upload_latest_old@@@' % module
+    # Clear latest for this build type.
+    old = '/'.join([GS_DIR, LATEST, bucket + '-*'])
+    old_archives = ListArchives(GS_SITE + old)
+
+    # Upload the new latest and remove unnecessary old ones.
+    target = GS_SITE + '/'.join([GS_DIR, LATEST, filename])
+    status = OldUploadFile(zip_file, target)
+    if status == 0:
+      RemoveArchives(
+          [iarch for iarch in old_archives if iarch != target])
+    else:
+      print 'Upload failed'
+
+    # Upload unversioned name to continuous site for incremental
+    # builds.
+    if '-inc' in bucket:
+      continuous_name = bucket[:bucket.find('-inc')]
+      target = GS_SITE + '/'.join([GS_DIR, CONTINUOUS,
+                                   continuous_name + '.zip'])
+      status = OldUploadFile(zip_file, target)
+
+  print ('@@@BUILD_STEP %s_upload_archive is over (status = %s)@@@' %
+      (module, status))
+  return status
+
+
+def Upload(module, zip_file, info, archive_latest=False):
+  """Upload a zip file to cloud storage bucket gs://dart-archive/
+  """
+  print '@@@BUILD_STEP %s_upload_archive @@@' % module
+  revision = 'latest' if archive_latest else info.revision
+  name = module.replace('drt', 'content_shell')
+  namer = bot_utils.GCSNamer(info.channel, bot_utils.ReleaseType.RAW)
+  remote_path = namer.dartium_variant_zipfilepath(revision,
+                                                  name,
+                                                  sys.platform,
+                                                  info.arch,
+                                                  info.mode.lower())
+  UploadFile(zip_file, remote_path, create_md5sum=True)
+
+  print '@@@STEP_LINK@download@' + remote_path + '@@@'
+
+
+def OldUploadFile(source, target):
+  """Upload an archive zip file to Google storage.
+  """
+
+  # Upload file.
+  cmd = [GSUTIL, 'cp', source, target]
+  (status, output) = ExecuteCommand(cmd)
+  if status != 0:
+    return status
+  print 'Uploaded: ' + output
+
+  # Set ACL.
+  if ACL is not None:
+    cmd = [GSUTIL, 'setacl', ACL, target]
+    (status, output) = ExecuteCommand(cmd)
+  return status
+
+
+def UploadFile(local_path, remote_path, create_md5sum=False):
+  # Copy it to the new unified gs://dart-archive bucket
+  gsutil = bot_utils.GSUtil()
+  gsutil.upload(local_path, remote_path, public=True)
+  if create_md5sum:
+    # 'local_path' may have a different filename than 'remote_path'. So we need
+    # to make sure the *.md5sum file contains the correct name.
+    assert '/' in remote_path and not remote_path.endswith('/')
+    mangled_filename = remote_path[remote_path.rfind('/') + 1:]
+    local_md5sum = bot_utils.CreateChecksumFile(local_path, mangled_filename)
+    gsutil.upload(local_md5sum, remote_path + '.md5sum', public=True)
+
+
+def ExecuteCommand(cmd):
+  """Execute a command in a subprocess.
+  """
+  print 'Executing: ' + ' '.join(cmd)
+  try:
+    pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    (output, error) = pipe.communicate()
+    if pipe.returncode != 0:
+      print 'Execution failed: ' + str(error)
+    return (pipe.returncode, output)
+  except:
+    import traceback
+    print 'Execution raised exception:', traceback.format_exc()
+    return (-1, '')
+
+
+def UploadDartTestsResults(layout_test_results_dir, name, version,
+                           component, checked):
+  """Uploads test results to google storage.
+  """
+  print ('@@@BUILD_STEP archive %s_layout_%s_tests results@@@' %
+         (component, checked))
+  dir_name = os.path.dirname(layout_test_results_dir)
+  base_name = os.path.basename(layout_test_results_dir)
+  cwd = os.getcwd()
+  os.chdir(dir_name)
+
+  archive_name = 'layout_test_results.zip'
+  archive.ZipDir(archive_name, base_name)
+
+  target = '/'.join([GS_DIR, 'layout-test-results', name, component + '-' +
+                     checked + '-' + version + '.zip'])
+  status = OldUploadFile(os.path.abspath(archive_name), GS_SITE + target)
+  os.remove(archive_name)
+  if status == 0:
+    print ('@@@STEP_LINK@download@' + GS_URL + target + '@@@')
+  else:
+    print '@@@STEP_FAILURE@@@'
+  os.chdir(cwd)
+
+
+def ListArchives(pattern):
+  """List the contents in Google storage matching the file pattern.
+  """
+  cmd = [GSUTIL, 'ls', pattern]
+  (status, output) = ExecuteCommand(cmd)
+  if status != 0:
+    return []
+  return output.split(os.linesep)
+
+
+def RemoveArchives(archives):
+  """Remove the list of archives in Google storage.
+  """
+  for archive in archives:
+    if archive.find(GS_SITE) == 0:
+      cmd = [GSUTIL, 'rm', archive.rstrip()]
+      (status, _) = ExecuteCommand(cmd)
+      if status != 0:
+        return status
+  return 0
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index cd457d6..7aa1b29 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -23,12 +23,6 @@
 };
 
 [Supplemental]
-interface Clipboard {
-  [Suppressed] void setDragImage(HTMLImageElement image, long x, long y);
-  [Custom] void setDragImage(Element element, long x, long y);
-};
-
-[Supplemental]
 interface Document {
   [Suppressed] DOMObject getCSSCanvasContext(DOMString contextId, DOMString name, long width, long height);
   CanvasRenderingContext getCSSCanvasContext(DOMString contextId, DOMString name, long width, long height);
@@ -293,21 +287,6 @@
   [Custom] Dictionary item(unsigned long index);
 };
 
-[Supplemental]
-interface WebSocket {
-  // Suppress the default since it has non-standard return type and add
-  // overrides.
-  [Suppressed] boolean send(ArrayBuffer data);
-  [Suppressed] boolean send(ArrayBufferView data);
-  [Suppressed] boolean send(Blob data);
-  [Suppressed] boolean send(DOMString data);
-
-  [Custom] void send(DOMString data);
-  [Custom] void send(Blob data);
-  [Custom] void send(ArrayBuffer data);
-  [Custom] void send(ArrayBufferView data);
-};
-
 [Supplemental, Constructor]
 interface XMLHttpRequest {
    [Custom] void send();
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index 4183eb6..e57e678 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -101,7 +101,8 @@
     template_paths = ['html/dart2js', 'html/impl', 'html/interface', '']
     template_loader = TemplateLoader(template_dir,
                                      template_paths,
-                                     {'DARTIUM': False, 'DART2JS': True})
+                                     {'DARTIUM': False, 'DART2JS': True,
+                                      'DART_USE_BLINK' : False})
     backend_options = GeneratorOptions(
         template_loader, webkit_database, type_registry, renamer,
         metadata)
diff --git a/tools/dom/scripts/database.py b/tools/dom/scripts/database.py
index 624ad00..b5e4df9 100755
--- a/tools/dom/scripts/database.py
+++ b/tools/dom/scripts/database.py
@@ -247,7 +247,7 @@
   def AddEnum(self, enum):
     self._enums[enum.id] = enum
 
-  def TransitiveSecondaryParents(self, interface):
+  def TransitiveSecondaryParents(self, interface, propagate_event_target):
     """Returns a list of all non-primary parents.
 
     The list contains the interface objects for interfaces defined in the
@@ -267,7 +267,8 @@
     result = []
     if interface.parents:
       parent = interface.parents[0]
-      if IsPureInterface(parent.type.id) or parent.type.id == 'EventTarget':
+      if (IsPureInterface(parent.type.id) or
+          (propagate_event_target and parent.type.id == 'EventTarget')):
         walk(interface.parents)
       else:
         walk(interface.parents[1:])
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index ca8763f..c81be53 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -114,7 +114,8 @@
     # interfaces need to be added.  Sometimes the attribute or operation is
     # defined in the current interface as well as a parent.  In that case we
     # avoid making a duplicate definition and pray that the signatures match.
-    secondary_parents = self._database.TransitiveSecondaryParents(interface)
+    secondary_parents = self._database.TransitiveSecondaryParents(interface,
+                          not self._dart_use_blink)
     for parent_interface in sorted(secondary_parents):
       if isinstance(parent_interface, str):
         continue
diff --git a/tools/dom/scripts/htmleventgenerator.py b/tools/dom/scripts/htmleventgenerator.py
index 612ed7a..66ffaec 100644
--- a/tools/dom/scripts/htmleventgenerator.py
+++ b/tools/dom/scripts/htmleventgenerator.py
@@ -325,7 +325,8 @@
 
   def _GetRawEvents(self, interface):
     all_interfaces = ([ interface ] +
-                      self._database.TransitiveSecondaryParents(interface))
+                      self._database.TransitiveSecondaryParents(interface,
+                                                                False))
     events = set([])
     for super_interface in all_interfaces:
       events = events.union(
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index f2cac7e..c149025 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -303,6 +303,7 @@
   'Screen.availLeft',
   'Screen.availTop',
   'Screen.availWidth',
+  'ShadowRoot.resetStyleInheritance',
   'Storage.clear',
   'Storage.getItem',
   'Storage.key',
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 0ecc980..42d252e 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -25,6 +25,7 @@
     'AudioContext.createGain',
     'AudioContext.createScriptProcessor',
     'CanvasRenderingContext2D.drawImage',
+    'CanvasRenderingContext2D.fill',
     'CanvasRenderingContext2D.fillText',
     'CanvasRenderingContext2D.lineDashOffset',
     'CanvasRenderingContext2D.setLineDash',
@@ -486,6 +487,9 @@
 
   def GenerateInterface(self):
     interface_name = self._interface_type_info.interface_name()
+    implementation_name = self._interface_type_info.implementation_name()
+    self._library_emitter.AddTypeEntry(self._library_name,
+                                       self._interface.id, implementation_name)
 
     factory_provider = None
     if interface_name in interface_factories:
@@ -1204,6 +1208,9 @@
       self._dart_libraries.AddFile(basename, library_name, path)
     return self._path_to_emitter[path]
 
+  def AddTypeEntry(self, basename, idl_name, dart_name):
+    self._dart_libraries.AddTypeEntry(basename, idl_name, dart_name)
+
   def EmitLibraries(self, auxiliary_dir):
     self._dart_libraries.Emit(self._multiemitter, auxiliary_dir)
 
@@ -1215,10 +1222,14 @@
     self._dart_path = os.path.join(
         output_dir, '%s_%s.dart' % (name, library_type))
     self._paths = []
+    self._typeMap = {}
 
   def AddFile(self, path):
     self._paths.append(path)
 
+  def AddTypeEntry(self, idl_name, dart_name):
+    self._typeMap[idl_name] = dart_name
+
   def Emit(self, emitter, auxiliary_dir):
     def massage_path(path):
       # The most robust way to emit path separators is to use / always.
@@ -1227,14 +1238,29 @@
     library_emitter = emitter.FileEmitter(self._dart_path)
     library_file_dir = os.path.dirname(self._dart_path)
     auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir)
-    imports_emitter = library_emitter.Emit(
+    emitters = library_emitter.Emit(
         self._template, AUXILIARY_DIR=massage_path(auxiliary_dir))
+    if isinstance(emitters, tuple):
+      imports_emitter, map_emitter = emitters
+    else:
+      imports_emitter, map_emitter = emitters, None
+      
 
     for path in sorted(self._paths):
       relpath = os.path.relpath(path, library_file_dir)
       imports_emitter.Emit(
           "part '$PATH';\n", PATH=massage_path(relpath))
 
+    if map_emitter:
+      items = self._typeMap.items()
+      items.sort()
+      for (idl_name, dart_name) in items:
+        map_emitter.Emit(
+          "  '$IDL_NAME': $DART_NAME,\n",
+          IDL_NAME=idl_name,
+          DART_NAME=dart_name)
+      
+
 # ------------------------------------------------------------------------------
 
 class DartLibraries():
@@ -1247,6 +1273,9 @@
   def AddFile(self, basename, library_name, path):
     self._libraries[library_name].AddFile(path)
 
+  def AddTypeEntry(self, library_name, idl_name, dart_name):
+    self._libraries[library_name].AddTypeEntry(idl_name, dart_name)
+
   def Emit(self, emitter, auxiliary_dir):
     for lib in self._libraries.values():
       lib.Emit(emitter, auxiliary_dir)
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 86cf994..c3a7d19 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -13,6 +13,21 @@
 from idlnode import IDLArgument, IDLAttribute
 from systemhtml import js_support_checks, GetCallbackInfo, HTML_LIBRARY_NAMES
 
+# This is an ugly hack to get things working on the M35 roll.  Once we
+# generate dart:blink from the new scripts, this shouldn't be needed.
+_cpp_resolver_string_map = {
+    # These custom constructors all resolve to a common entry, so choosing any
+    # of the generated strings works.
+    'Blob_constructorCallback_RESOLVER_STRING_3_Array_DOMString_DOMString':
+        'Blob_constructorCallback_RESOLVER_STRING_0_',
+    'ConsoleBase_assertCondition_Callback_RESOLVER_STRING_2_boolean_object':
+        'ConsoleBase_assert_Callback_RESOLVER_STRING_2_boolean_object',
+    'FormData_constructorCallback':
+        'FormData_constructorCallback_RESOLVER_STRING_1_HTMLFormElement',
+    'XMLHttpRequest_constructorCallback_RESOLVER_STRING_0_':
+        'XMLHttpRequest_constructorCallback_RESOLVER_STRING_1_XMLHttpRequestOptions',
+}
+
 # TODO(vsm): This logic needs to pulled from the source IDL.  These tables are
 # an ugly workaround.
 _cpp_callback_map = {
@@ -136,6 +151,13 @@
   ('DOMURL', '_createObjectURL_3Callback'): 'URLMediaStream',
 }
 
+_blink_1916_rename_map = {
+  'NavigatorID': 'Navigator',
+  'CanvasRenderingContext' : 'CanvasRenderingContext2D',
+  'Clipboard': 'DataTransfer',
+  'Player': 'AnimationPlayer',
+}
+
 _cpp_partial_map = {}
 
 _cpp_no_auto_scope_list = set([
@@ -301,6 +323,11 @@
         return None
     return matched.group(1)
 
+def TypeIdToBlinkName(interface_id):
+  if interface_id in _blink_1916_rename_map:
+    interface_id = _blink_1916_rename_map[interface_id]
+  return interface_id
+
 def _GetCPPTypeName(interface_name, callback_name, cpp_name):
   # TODO(vsm): We need to track the original IDL file name in order to recover
   # the proper CPP name.
@@ -323,6 +350,20 @@
         fields.append(suffix)
     return "_".join(fields)
 
+def DeriveResolverString(interface_id, operation_id, native_suffix, type_ids, is_custom=False):
+    type_string = \
+        "_".join(map(TypeIdToBlinkName, type_ids))
+    if native_suffix:
+        operation_id = "%s_%s" % (operation_id, native_suffix)
+    if is_custom:
+        components = \
+            [TypeIdToBlinkName(interface_id), operation_id]
+    else:
+        components = \
+            [TypeIdToBlinkName(interface_id), operation_id,
+             "RESOLVER_STRING", str(len(type_ids)), type_string]
+    return "_".join(components)
+
 # FIXME(leafp) This should really go elsewhere.  I think the right thing
 # to do is to add support in the DartLibraries objects in systemhtml
 # for emitting top level code in libraries.  This can then just be a
@@ -548,20 +589,38 @@
         INTERFACE_NAME=self._interface.id);
 
   def _EmitConstructorInfrastructure(self,
-      constructor_info, constructor_callback_cpp_name, factory_method_name,
-      argument_count=None, emit_to_native=False):
-    constructor_callback_id = self._interface.id + '_' + constructor_callback_cpp_name
-    if argument_count is None:
-      argument_count = len(constructor_info.param_infos)
+      constructor_info, cpp_prefix, cpp_suffix, factory_method_name,
+      arguments=None, emit_to_native=False, is_custom=False):
+
+    constructor_callback_cpp_name = cpp_prefix + cpp_suffix
+
+    if arguments is None:
+        if self._dart_use_blink:
+            arguments = constructor_info.idl_args[0]
+            argument_count = len(arguments)
+        else:
+            argument_count = len(constructor_info.param_infos)
+    else:
+      argument_count = len(arguments)
 
     typed_formals = constructor_info.ParametersAsArgumentList(argument_count)
     parameters = constructor_info.ParametersAsStringOfVariables(argument_count)
     interface_name =  self._interface_type_info.interface_name()
 
     if self._dart_use_blink:
+        type_ids = [p.type.id for p in arguments[:argument_count]]
+        constructor_callback_id = \
+            DeriveResolverString(self._interface.id, cpp_suffix, None, type_ids, is_custom)
+    else:
+        constructor_callback_id = self._interface.id + '_' + constructor_callback_cpp_name
+
+    if self._dart_use_blink:
         # First we emit the toplevel function
         dart_native_name = \
             DeriveNativeName(self._interface.id, constructor_callback_cpp_name, "")
+        if constructor_callback_id in _cpp_resolver_string_map:
+            constructor_callback_id = \
+                _cpp_resolver_string_map[constructor_callback_id]
         self._native_library_emitter.Emit(
             '\n'
             '$FACTORY_METHOD_NAME($PARAMETERS) native "$ID";\n',
@@ -616,7 +675,8 @@
 
     constructor_callback_cpp_name = 'constructorCallback'
     self._EmitConstructorInfrastructure(
-        constructor_info, constructor_callback_cpp_name, '_create')
+        constructor_info, "", constructor_callback_cpp_name, '_create', 
+        is_custom=True)
 
     self._cpp_declarations_emitter.Emit(
         '\n'
@@ -629,10 +689,11 @@
     return False
 
   def EmitStaticFactoryOverload(self, constructor_info, name, arguments):
-    constructor_callback_cpp_name = name + 'constructorCallback'
+    constructor_callback_cpp_name = name + 'constructorCallback'  
     self._EmitConstructorInfrastructure(
-        constructor_info, constructor_callback_cpp_name, name, len(arguments), 
-        emit_to_native=self._dart_use_blink)
+        constructor_info, name, 'constructorCallback', name, arguments, 
+        emit_to_native=self._dart_use_blink, 
+        is_custom=False)
 
     ext_attrs = self._interface.ext_attrs
 
@@ -978,12 +1039,18 @@
               DeriveNativeName(self._interface.id, "NativeIndexed", "Getter")
           # First emit a toplevel function to do the native call
           # Calls to this are emitted elsewhere,
+          resolver_string = \
+              DeriveResolverString(self._interface.id, "item", "Callback",
+                                   ["unsigned long"])
+          if resolver_string in _cpp_resolver_string_map:
+              resolver_string = \
+                  _cpp_resolver_string_map[resolver_string]
           self._native_library_emitter.Emit(
               '\n'
               '$(DART_NATIVE_NAME)(mthis, index) '
-              'native "$(INTERFACE)_item_Callback";\n',
+              'native "$(RESOLVER_STRING)";\n',
               DART_NATIVE_NAME = dart_native_name,
-              INTERFACE=self._interface.id)
+              RESOLVER_STRING=resolver_string)
 
           # Emit the method which calls the toplevel function, along with
           # the [] operator.
@@ -1108,10 +1175,19 @@
       argument_count = (0 if info.IsStatic() else 1) + len(info.param_infos)
       native_suffix = 'Callback'
       auto_scope_setup = self._GenerateAutoSetupScope(info.name, native_suffix)
+      if self._dart_use_blink:
+          type_ids = [argument.type.id
+                      for argument in operation.arguments[:len(info.param_infos)]]
+          resolver_string = \
+              DeriveResolverString(self._interface.id, operation.id,
+                                   native_suffix, type_ids, is_custom)
+      else:
+          resolver_string = None
       cpp_callback_name = self._GenerateNativeBinding(
         info.name, argument_count, dart_declaration,
         info.IsStatic(), return_type, parameters,
-        native_suffix, is_custom, auto_scope_setup)
+        native_suffix, is_custom, auto_scope_setup, 
+        resolver_string=resolver_string)
       if not is_custom:
         self._GenerateOperationNativeCallback(operation, operation.arguments, cpp_callback_name, auto_scope_setup)
     else:
@@ -1124,6 +1200,8 @@
       native_suffix = 'Callback'
       actuals = info.ParametersAsListOfVariables(argument_count)
       return_type = self.SecureOutputType(operation.type.id)
+      native_suffix = 'Callback'
+      is_custom = 'Custom' in operation.ext_attrs
       if self._dart_use_blink:
           base_name = '_%s_%s' % (operation.id, version)
           overload_name = \
@@ -1134,6 +1212,11 @@
           actuals_s = ", ".join(actuals)
           dart_declaration = '%s(%s)' % (
             base_name, actuals_s)
+          type_ids = [argument.type.id
+                      for argument in operation.arguments[:argument_count]]
+          resolver_string = \
+              DeriveResolverString(self._interface.id, operation.id,
+                                   native_suffix, type_ids)
       else:
           base_name = '_%s_%s' % (operation.id, version)
           overload_name = base_name
@@ -1143,17 +1226,16 @@
             'static ' if static else '',
             return_type,
             overload_name, actuals_s)
+          resolver_string = None
 
       call_emitter.Emit('$NAME($ARGS)', NAME=overload_name, ARGS=actuals_s)
-      is_custom = 'Custom' in operation.ext_attrs
-      native_suffix = 'Callback'
       auto_scope_setup = \
         self._GenerateAutoSetupScope(base_name, native_suffix)
       cpp_callback_name = self._GenerateNativeBinding(
         base_name, (0 if static else 1) + argument_count,
         dart_declaration, static, return_type, actuals,
         native_suffix, is_custom, auto_scope_setup, emit_metadata=False,
-        emit_to_native=self._dart_use_blink)
+        emit_to_native=self._dart_use_blink, resolver_string=resolver_string)
       if not is_custom:
         self._GenerateOperationNativeCallback(operation,
           operation.arguments[:argument_count], cpp_callback_name,
@@ -1581,7 +1663,8 @@
 
   def _GenerateNativeBinding(self, idl_name, argument_count, dart_declaration,
       static, return_type, parameters, native_suffix, is_custom,
-      auto_scope_setup=True, emit_metadata=True, emit_to_native=False):
+      auto_scope_setup=True, emit_metadata=True, emit_to_native=False,
+      resolver_string=None):
     metadata = []
     if emit_metadata:
       metadata = self._metadata.GetFormattedMetadata(
@@ -1589,7 +1672,16 @@
           self._interface, idl_name, '  ')
     dart_native_name = \
         DeriveNativeName(self._interface.id, idl_name, native_suffix)
-    native_binding = '%s_%s_%s' % (self._interface.id, idl_name, native_suffix)
+
+    if (resolver_string):
+        native_binding = resolver_string
+    else:
+        native_binding_id = self._interface.id
+        if self._dart_use_blink:
+          native_binding_id = TypeIdToBlinkName(native_binding_id)
+        native_binding = \
+            '%s_%s_%s' % (native_binding_id, idl_name, native_suffix)
+
     if self._dart_use_blink:
         if not static:
             formals = ", ".join(['mthis'] + parameters)
@@ -1597,7 +1689,9 @@
         else:
             formals = ", ".join(parameters)
             actuals = ", ".join(parameters)
-
+        if native_binding in _cpp_resolver_string_map:
+            native_binding = \
+                _cpp_resolver_string_map[native_binding]
         self._native_library_emitter.Emit(
             '\n'
             '$DART_NAME($FORMALS) native "$NATIVE_BINDING";\n',
diff --git a/tools/dom/src/blink_native_DOMImplementation.dart b/tools/dom/src/blink_native_DOMImplementation.dart
index 2a86d3b..8e7582a 100644
--- a/tools/dom/src/blink_native_DOMImplementation.dart
+++ b/tools/dom/src/blink_native_DOMImplementation.dart
@@ -19,32 +19,32 @@
 
 Native_Utils_changeElementWrapper(element, type) native "Utils_changeElementWrapper";
 
-// _DOMWindowCrossFrame native entry points
-Native_DOMWindowCrossFrame_get_history(_DOMWindowCrossFrame) native "WindowCrossFrame_history_Getter";
+// FIXME: Return to using explicit cross frame entry points after roll to M35
+Native_DOMWindowCrossFrame_get_history(_DOMWindowCrossFrame) native "Window_history_cross_frame_Getter";
 
-Native_DOMWindowCrossFrame_get_location(_DOMWindowCrossFrame) native "WindowCrossFrame_location_Getter";
+Native_DOMWindowCrossFrame_get_location(_DOMWindowCrossFrame) native "Window_location_cross_frame_Getter";
 
-Native_DOMWindowCrossFrame_get_closed(_DOMWindowCrossFrame) native "WindowCrossFrame_closed_Getter";
+Native_DOMWindowCrossFrame_get_closed(_DOMWindowCrossFrame) native "Window_closed_Getter";
 
-Native_DOMWindowCrossFrame_get_opener(_DOMWindowCrossFrame) native "WindowCrossFrame_opener_Getter";
+Native_DOMWindowCrossFrame_get_opener(_DOMWindowCrossFrame) native "Window_opener_Getter";
 
-Native_DOMWindowCrossFrame_get_parent(_DOMWindowCrossFrame) native "WindowCrossFrame_parent_Getter";
+Native_DOMWindowCrossFrame_get_parent(_DOMWindowCrossFrame) native "Window_parent_Getter";
 
-Native_DOMWindowCrossFrame_get_top(_DOMWindowCrossFrame) native "WindowCrossFrame_top_Getter";
+Native_DOMWindowCrossFrame_get_top(_DOMWindowCrossFrame) native "Window_top_Getter";
 
-Native_DOMWindowCrossFrame_close(_DOMWindowCrossFrame) native "WindowCrossFrame_close_Callback";
+Native_DOMWindowCrossFrame_close(_DOMWindowCrossFrame) native "Window_close_Callback_RESOLVER_STRING_0_";
 
-Native_DOMWindowCrossFrame_postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "WindowCrossFrame_postMessage_Callback";
+Native_DOMWindowCrossFrame_postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "Window_postMessage_Callback";
 
 // _HistoryCrossFrame native entry points
-Native_HistoryCrossFrame_back(_HistoryCrossFrame) native "HistoryCrossFrame_back_Callback";
+Native_HistoryCrossFrame_back(_HistoryCrossFrame) native "History_back_Callback_RESOLVER_STRING_0_";
 
-Native_HistoryCrossFrame_forward(_HistoryCrossFrame) native "HistoryCrossFrame_forward_Callback";
+Native_HistoryCrossFrame_forward(_HistoryCrossFrame) native "History_forward_Callback_RESOLVER_STRING_0_";
 
-Native_HistoryCrossFrame_go(_HistoryCrossFrame, distance) native "HistoryCrossFrame_go_Callback";
+Native_HistoryCrossFrame_go(_HistoryCrossFrame, distance) native "History_go_Callback_RESOLVER_STRING_1_long";
 
 // _LocationCrossFrame native entry points
-Native_LocationCrossFrame_set_href(_LocationCrossFrame, h) native "LocationCrossFrame_href_Setter";
+Native_LocationCrossFrame_set_href(_LocationCrossFrame, h) native "Location_href_Setter";
 
 // _DOMStringMap native entry  points
 Native_DOMStringMap_containsKey(_DOMStringMap, key) native "DOMStringMap_containsKey_Callback";
diff --git a/tools/dom/src/WrappedEvent.dart b/tools/dom/src/dart2js_WrappedEvent.dart
similarity index 100%
rename from tools/dom/src/WrappedEvent.dart
rename to tools/dom/src/dart2js_WrappedEvent.dart
diff --git a/tools/dom/src/dartium_CustomElementSupport.dart b/tools/dom/src/dartium_CustomElementSupport.dart
index 3afc56a..37baa55 100644
--- a/tools/dom/src/dartium_CustomElementSupport.dart
+++ b/tools/dom/src/dartium_CustomElementSupport.dart
@@ -30,7 +30,8 @@
     if (element.runtimeType != _nativeType) {
       throw new UnsupportedError('Element is incorrect type');
     }
-    return _Utils.changeElementWrapper(element, _type);
+    _Utils.changeElementWrapper(element, _type);
+    return null;
   }
 }
 
diff --git a/tools/dom/src/dartium_WrappedEvent.dart b/tools/dom/src/dartium_WrappedEvent.dart
new file mode 100644
index 0000000..2f7b8b8
--- /dev/null
+++ b/tools/dom/src/dartium_WrappedEvent.dart
@@ -0,0 +1,86 @@
+// 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 dart.html;
+
+/**
+ * Helper class to implement custom events which wrap DOM events.
+ */
+class _WrappedEvent implements Event {
+  final Event wrapped;
+
+  /** The CSS selector involved with event delegation. */
+  String _selector;
+
+  _WrappedEvent(this.wrapped);
+
+  bool get bubbles => wrapped.bubbles;
+
+  bool get cancelable => wrapped.cancelable;
+
+  DataTransfer get clipboardData => wrapped.clipboardData;
+
+  EventTarget get currentTarget => wrapped.currentTarget;
+
+  bool get defaultPrevented => wrapped.defaultPrevented;
+
+  int get eventPhase => wrapped.eventPhase;
+
+  EventTarget get target => wrapped.target;
+
+  int get timeStamp => wrapped.timeStamp;
+
+  String get type => wrapped.type;
+
+  void _initEvent(String eventTypeArg, bool canBubbleArg,
+      bool cancelableArg) {
+    throw new UnsupportedError(
+        'Cannot initialize this Event.');
+  }
+
+  void preventDefault() {
+    wrapped.preventDefault();
+  }
+
+  void stopImmediatePropagation() {
+    wrapped.stopImmediatePropagation();
+  }
+
+  void stopPropagation() {
+    wrapped.stopPropagation();
+  }
+
+  /**
+   * A pointer to the element whose CSS selector matched within which an event
+   * was fired. If this Event was not associated with any Event delegation,
+   * accessing this value will throw an [UnsupportedError].
+   */
+  Element get matchingTarget {
+    if (_selector == null) {
+      throw new UnsupportedError('Cannot call matchingTarget if this Event did'
+          ' not arise as a result of event delegation.');
+    }
+    var currentTarget = this.currentTarget;
+    var target = this.target;
+    var matchedTarget;
+    do {
+      if (target.matches(_selector)) return target;
+      target = target.parent;
+    } while (target != null && target != currentTarget.parent);
+    throw new StateError('No selector matched for populating matchedTarget.');
+  }
+
+  /**
+   * This event's path, taking into account shadow DOM.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM extensions to Event]
+   * (http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event) from
+   * W3C.
+   */
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
+  @Experimental()
+  List<Node> get path => wrapped.path;
+}
diff --git a/tools/dom/src/html_native_DOMImplementation.dart b/tools/dom/src/html_native_DOMImplementation.dart
index af2983c..304c474 100644
--- a/tools/dom/src/html_native_DOMImplementation.dart
+++ b/tools/dom/src/html_native_DOMImplementation.dart
@@ -146,12 +146,22 @@
   /**
    * Header passed in from the Dartium Developer Tools when an expression is
    * evaluated in the console as opposed to the watch window or another context
-   * that does not expect REPL support.
+   * that does not expect REPL support in Dartium 34.
    */
-  static const _CONSOLE_API_SUPPORT_HEADER =
+  static const _CONSOLE_API_SUPPORT_HEADER_34 =
       'with ((console && console._commandLineAPI) || { __proto__: null }) {\n';
+  /**
+   * Header passed in from the Dartium Developer Tools when an expression is
+   * evaluated in the console as opposed to the watch window or another context
+   * that does not expect REPL support in Dartium 35.
+   */
+  static const _CONSOLE_API_SUPPORT_HEADER_35 =
+      'with (__commandLineAPI || { __proto__: null }) {\n';
+
+
   static bool expectsConsoleApi(String expression) {
-    return expression.indexOf(_CONSOLE_API_SUPPORT_HEADER) == 0;;
+    return expression.indexOf(_CONSOLE_API_SUPPORT_HEADER_34) == 0 ||
+        expression.indexOf(_CONSOLE_API_SUPPORT_HEADER_35) == 0;
   }
 
   /**
@@ -166,7 +176,7 @@
    * For example:
    * <code>
    * _consoleTempVariables = {'a' : someValue, 'b': someOtherValue}
-   * wrapExpressionAsClosure("${_CONSOLE_API_SUPPORT_HEADER}foo + bar + a",
+   * wrapExpressionAsClosure("${_CONSOLE_API_SUPPORT_HEADER35}foo + bar + a",
    *                         ["bar", 40, "foo", 2])
    * </code>
    * will return:
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index 1695b66..d5d4f86 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -81,7 +81,6 @@
 part '$AUXILIARY_DIR/KeyboardEventStream.dart';
 part '$AUXILIARY_DIR/NodeValidatorBuilder.dart';
 part '$AUXILIARY_DIR/ReadyState.dart';
-part '$AUXILIARY_DIR/WrappedEvent.dart';
 part '$AUXILIARY_DIR/WrappedList.dart';
 part '$AUXILIARY_DIR/_HttpRequestUtils.dart';
 part '$AUXILIARY_DIR/_ListIterators.dart';
@@ -90,6 +89,7 @@
 part '$AUXILIARY_DIR/dart2js_DOMImplementation.dart';
 part '$AUXILIARY_DIR/dart2js_KeyEvent.dart';
 part '$AUXILIARY_DIR/dart2js_Platform.dart';
+part '$AUXILIARY_DIR/dart2js_WrappedEvent.dart';
 part '$AUXILIARY_DIR/shared_html.dart';
 part '$AUXILIARY_DIR/Validators.dart';
 
diff --git a/tools/dom/templates/html/dartium/_blink_dartium.darttemplate b/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
index dec9dba..36c722b 100644
--- a/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
@@ -28,13 +28,33 @@
 import 'dart:nativewrappers';
 import 'dart:typed_data';
 import 'dart:web_gl' as gl;
+import 'dart:web_gl' show web_glBlinkMap;
 import 'dart:web_sql';
 // Not actually used, but imported since dart:html can generate these objects.
 import 'dart:svg' as svg;
 import 'dart:svg' show Matrix;
 import 'dart:svg' show SvgSvgElement;
-import 'dart:web_audio' show AudioNode, AudioParam;
+import 'dart:svg' show svgBlinkMap;
+import 'dart:web_audio' show AudioNode, AudioParam, web_audioBlinkMap;
 
 part '$AUXILIARY_DIR/blink_native_DOMImplementation.dart';
 
 $!GENERATED_DART_FILES
+
+// TODO(vsm): This should be moved out of this library.  Into dart:html?
+Type _getType(String key) {
+  // TODO(vsm): Add Cross Frame and JS types here as well.
+  if (htmlBlinkMap.containsKey(key))
+    return htmlBlinkMap[key];
+  if (indexed_dbBlinkMap.containsKey(key))
+    return indexed_dbBlinkMap[key];
+  if (web_audioBlinkMap.containsKey(key))
+    return web_audioBlinkMap[key];
+  if (web_glBlinkMap.containsKey(key))
+    return web_glBlinkMap[key];
+  if (web_sqlBlinkMap.containsKey(key))
+    return web_sqlBlinkMap[key];
+  if (svgBlinkMap.containsKey(key))
+    return svgBlinkMap[key];
+  return null;
+}
\ No newline at end of file
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index 09d9a58..512ff7d 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -37,6 +37,7 @@
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:isolate';
+import 'dart:js' as js;
 import "dart:convert";
 import 'dart:math';
 // TODO(vsm): Remove this when we can do the proper checking in
@@ -60,7 +61,6 @@
 $!GENERATED_DART_FILES
 
 // Issue 14721, order important for WrappedEvent.
-part '$AUXILIARY_DIR/WrappedEvent.dart';
 part '$AUXILIARY_DIR/AttributeMap.dart';
 part '$AUXILIARY_DIR/CanvasImageSource.dart';
 part '$AUXILIARY_DIR/CrossFrameTypes.dart';
@@ -84,6 +84,7 @@
 part '$AUXILIARY_DIR/dartium_CustomElementSupport.dart';
 part '$AUXILIARY_DIR/dartium_KeyEvent.dart';
 part '$AUXILIARY_DIR/dartium_Platform.dart';
+part '$AUXILIARY_DIR/dartium_WrappedEvent.dart';
 part '$AUXILIARY_DIR/shared_html.dart';
 
 $if DART_USE_BLINK
@@ -140,22 +141,16 @@
   return _Utils.spawnDomUri(uri.toString());
 }
 $if DART_USE_BLINK
-// FIXME: This should be generated.
-const _typeMap = const {
-  'EventTarget': EventTarget,
-  'Window': Window,
-  'Element': Element,
-  'Console': Console,
-  'Node': Node,
-  'Document': Document,
-  'HTMLElement': HtmlElement,
-  'HTMLCanvasElement': CanvasElement,
-  'HTMLDocument': HtmlDocument,
+// FIXME: Can we make this private?
+const htmlBlinkMap = const {
+  '_HistoryCrossFrame': _HistoryCrossFrame,
+  '_LocationCrossFrame': _LocationCrossFrame,
+  '_DOMWindowCrossFrame': _DOMWindowCrossFrame,
+  // FIXME: Move these to better locations.
+  'DateTime': DateTime,
+  'JsObject': js.JsObject,
+  'JsFunction': js.JsFunction,
+  'JsArray': js.JsArray,
+$!TYPE_MAP
 };
-
-Type _getType(String key) {
-  if (!_typeMap.containsKey(key))
-    return null;
-  return _typeMap[key];
-}
 $endif
diff --git a/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate b/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
index 448d492..340bbec 100644
--- a/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
@@ -35,3 +35,9 @@
       [bool lowerOpen = false, bool upperOpen = false]) =>
       KeyRange.bound_(lower, upper, lowerOpen, upperOpen);
 }
+$if DART_USE_BLINK
+// FIXME: Can we make this private?
+const indexed_dbBlinkMap = const {
+$!TYPE_MAP
+};
+$endif
diff --git a/tools/dom/templates/html/dartium/svg_dartium.darttemplate b/tools/dom/templates/html/dartium/svg_dartium.darttemplate
index 85381f7..e0cca26 100644
--- a/tools/dom/templates/html/dartium/svg_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/svg_dartium.darttemplate
@@ -16,3 +16,9 @@
 part '$AUXILIARY_DIR/shared_SVGFactoryProviders.dart';
 
 $!GENERATED_DART_FILES
+$if DART_USE_BLINK
+// FIXME: Can we make this private?
+const svgBlinkMap = const {
+$!TYPE_MAP
+};
+$endif
diff --git a/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate b/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
index 153e1db..ea6c581 100644
--- a/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
@@ -15,3 +15,9 @@
 $endif
 
 $!GENERATED_DART_FILES
+$if DART_USE_BLINK
+// FIXME: Can we make this private?
+const web_audioBlinkMap = const {
+$!TYPE_MAP
+};
+$endif
diff --git a/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate b/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
index 08f9dbb..f3d8c40 100644
--- a/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
@@ -17,3 +17,9 @@
 part '$AUXILIARY_DIR/WebGLConstants.dart';
 
 $!GENERATED_DART_FILES
+$if DART_USE_BLINK
+// FIXME: Can we make this private?
+const web_glBlinkMap = const {
+$!TYPE_MAP
+};
+$endif
diff --git a/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate b/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
index 70f3b67..1af98eb 100644
--- a/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
@@ -25,3 +25,9 @@
 $endif
 
 $!GENERATED_DART_FILES
+$if DART_USE_BLINK
+// FIXME: Can we make this private?
+const web_sqlBlinkMap = const {
+$!TYPE_MAP
+};
+$endif
diff --git a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
index 08146ec..ee4df4f 100644
--- a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
@@ -342,6 +342,11 @@
       JS('void', '#.fillText(#, #, #)', this, text, x, y);
     }
   }
+
+  @DomName('CanvasRenderingContext2D.fill')
+  void fill([String winding = 'nonzero']) {
+    JS('void', '#.fill(#)', this, winding);
+  }
 $endif
 }
 
diff --git a/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate b/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate
index 5093f5d..7cdf52b 100644
--- a/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate
+++ b/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate
@@ -14,4 +14,37 @@
 $else
   static final bool supported = true;
 $endif
+
+$if DART_USE_BLINK
+  static bool _resetStyleInheritanceDeprecationReported = false;
+  static void _resetStyleInheritanceDeprecationReport() {
+    if (!_resetStyleInheritanceDeprecationReported) {
+      window.console.warn('''
+ShadowRoot.resetStyleInheritance is now deprecated in dart:html.
+Please remove from your code.
+''');
+      _resetStyleInheritanceDeprecationReported = true;
+    }
+  }
+
+  @deprecated
+  bool get resetStyleInheritance {
+    _resetStyleInheritanceDeprecationReport();
+    // Default value from when it was specified.
+    return false;
+  }
+
+  @deprecated
+  void set resetStyleInheritance(bool value) {
+    _resetStyleInheritanceDeprecationReport();
+  }
+$else
+  @deprecated
+  bool get resetStyleInheritance => this._resetStyleInheritance;
+
+  @deprecated
+  void set resetStyleInheritance(bool value) {
+    this._resetStyleInheritance = value;
+  }
+$endif
 }
diff --git a/tools/gyp/configurations_make.gypi b/tools/gyp/configurations_make.gypi
index dbc7cb5..bf2c3bb 100644
--- a/tools/gyp/configurations_make.gypi
+++ b/tools/gyp/configurations_make.gypi
@@ -44,18 +44,12 @@
         'abstract': 1,
         'cflags': [ '-O3', '-m32', '-msse2' ],
         'ldflags': [ '-m32', ],
-        'defines': [
-          'ARM_FLOAT_ABI_HARD',
-        ],
       },
 
       'Dart_Linux_simarm64_Base': {
         'abstract': 1,
         'cflags': [ '-O3', '-m64', '-msse2' ],
         'ldflags': [ '-m64', ],
-        'defines': [
-          'ARM64_FLOAT_ABI_HARD',
-        ],
       },
 
       # ARM cross-build
@@ -69,10 +63,6 @@
             '-Wno-psabi', # suppresses va_list warning
             '-fno-strict-overflow',
           ],
-          'defines': [
-            # In build.py, we specify the hf compiler.
-            'ARM_FLOAT_ABI_HARD',
-          ],
         }],
         ['_toolset=="host"', {
           'cflags': ['-m32', '-msse2'],
@@ -89,10 +79,6 @@
           '-Wno-psabi', # suppresses va_list warning
           '-fno-strict-overflow',
         ],
-        'defines': [
-          # In build.py, we specify the hf compiler.
-          'ARM_FLOAT_ABI_HARD',
-        ],
       },
 
       'Dart_Linux_simmips_Base': {
diff --git a/tools/only_in_release_mode.py b/tools/only_in_release_mode.py
index 2713b10..089d30c 100644
--- a/tools/only_in_release_mode.py
+++ b/tools/only_in_release_mode.py
@@ -28,6 +28,7 @@
   separator_index = sys.argv.index('--')
   outputs = sys.argv[1:separator_index]
   arguments = sys.argv[separator_index + 1:]
+  arguments[0] = os.path.normpath(arguments[0])
   mode = os.getenv('DART_BUILD_MODE', default='release')
   if mode != 'release':
     print >> sys.stderr, 'Not running %s in mode=%s' % (arguments, mode)
diff --git a/tools/status_clean.dart b/tools/status_clean.dart
index 18043ec..fb97590 100644
--- a/tools/status_clean.dart
+++ b/tools/status_clean.dart
@@ -49,6 +49,7 @@
 ];
 
 void main(List<String> args) {
+  TestUtils.setDartDirUri(Platform.script.resolve('..'));
   usage() {
     print("Usage: ${Platform.executable} <deflake|remove-nonexistent-tests>");
     exit(1);
diff --git a/tools/test.dart b/tools/test.dart
index 229cf0f..430a7ff 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -306,6 +306,8 @@
 }
 
 void main(List<String> arguments) {
+  // This script is in [dart]/tools.
+  TestUtils.setDartDirUri(Platform.script.resolve('..'));
   deleteTemporaryDartDirectories().then((_) {
     var optionsParser = new TestOptionsParser();
     var configurations = optionsParser.parse(arguments);
diff --git a/tools/testing/dart/co19_test.dart b/tools/testing/dart/co19_test.dart
index a55f0a7..48558fb 100644
--- a/tools/testing/dart/co19_test.dart
+++ b/tools/testing/dart/co19_test.dart
@@ -20,7 +20,6 @@
 
 import "test_options.dart";
 import "test_suite.dart";
-import "utils.dart" show Path;
 import "../../test.dart" as test_dart;
 
 const List<String> COMMON_ARGUMENTS =
@@ -44,10 +43,7 @@
 ];
 
 void main(List<String> args) {
-  File scriptFile = new File(new Path(Platform.script.path).toNativePath());
-  Path scriptPath = new Path(scriptFile.absolute.path)
-      .directoryPath.directoryPath.directoryPath.append('test.dart');
-  TestUtils.testScriptPath = scriptPath.toNativePath();
+  TestUtils.setDartDirUri(Platform.script.resolve('../../..'));
   var optionsParser = new TestOptionsParser();
   List<Map> configurations = <Map>[];
   for (var commandLine in COMMAND_LINES) {
diff --git a/tools/testing/dart/drt_updater.dart b/tools/testing/dart/drt_updater.dart
index 73af52d..3f34885 100644
--- a/tools/testing/dart/drt_updater.dart
+++ b/tools/testing/dart/drt_updater.dart
@@ -10,7 +10,6 @@
 import "dart:io";
 
 import "test_suite.dart";
-import "utils.dart" show Path;
 
 class _DartiumUpdater {
   String name;
@@ -40,9 +39,8 @@
   }
 
   List<String> get _getUpdateCommand {
-    Path testScriptPath = new Path(TestUtils.testScriptPath);
-    Path updateScriptPath = testScriptPath.directoryPath.append(script);
-    List<String> command = [updateScriptPath.toNativePath()];
+    Uri updateScript = TestUtils.dartDirUri.resolve(script);
+    List<String> command = [updateScript.toFilePath()];
     if (null != option) {
       command.add(option);
     }
@@ -72,13 +70,15 @@
     // Download the default content shell from Google Storage.
     if (_contentShellUpdater == null) {
       _contentShellUpdater = new _DartiumUpdater('Content Shell',
-                                                 'get_archive.py', 'drt');
+                                                 'tools/get_archive.py',
+                                                 'drt');
     }
     return _contentShellUpdater;
   } else if (runtime == 'dartium' && configuration['dartium'] == '') {
     // Download the default Dartium from Google Storage.
     if (_dartiumUpdater == null) {
-      _dartiumUpdater = new _DartiumUpdater('Dartium Chrome', 'get_archive.py',
+      _dartiumUpdater = new _DartiumUpdater('Dartium Chrome',
+                                            'tools/get_archive.py',
                                             'dartium');
     }
     return _dartiumUpdater;
diff --git a/tools/testing/dart/http_server.dart b/tools/testing/dart/http_server.dart
index c96ddb9..42fed87 100644
--- a/tools/testing/dart/http_server.dart
+++ b/tools/testing/dart/http_server.dart
@@ -38,6 +38,8 @@
 // Issue: 8368
 
 main(List<String> arguments) {
+  // This script is in [dart]/tools/testing/dart.
+  TestUtils.setDartDirUri(Platform.script.resolve('../../..'));
   /** Convenience method for local testing. */
   var parser = new ArgParser();
   parser.addOption('port', abbr: 'p',
@@ -60,14 +62,6 @@
   if (args['help']) {
     print(parser.getUsage());
   } else {
-    // Pretend we're running test.dart so that TestUtils doesn't get confused
-    // about the "current directory." This is only used if we're trying to run
-    // this file independently for local testing.
-    TestUtils.testScriptPath = new Path(Platform.script.path)
-        .directoryPath
-        .join(new Path('../../test.dart'))
-        .canonicalize()
-        .toNativePath();
     var servers = new TestingServers(new Path(args['build-directory']),
                                      args['csp'],
                                      args['runtime']);
diff --git a/tools/testing/dart/runtime_configuration.dart b/tools/testing/dart/runtime_configuration.dart
index f36c43e..1358b01 100644
--- a/tools/testing/dart/runtime_configuration.dart
+++ b/tools/testing/dart/runtime_configuration.dart
@@ -171,6 +171,7 @@
       case 'arm':
       case 'simmips':
       case 'mips':
+      case 'simarm64':
         multiplier *= 4;
         break;
     }
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 24b1510..b87d7ea 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -1395,6 +1395,13 @@
       args.add('--no-hints');
     }
 
+    if ((configuration["compiler"] == "dartanalyzer" ||
+        configuration["compiler"] == "dart2analyzer") &&
+        (filePath.filename.contains("dart2js") ||
+        filePath.directoryPath.segments().last.contains('html_common'))) {
+      args.add("--use-dart2js-libraries");
+    }
+
     bool isMultitest = optionsFromFile["isMultitest"];
     List<String> dartOptions = optionsFromFile["dartOptions"];
 
@@ -1867,18 +1874,19 @@
 
 class TestUtils {
   /**
-   * The libraries in this directory relies on finding various files
-   * relative to the 'test.dart' script in '.../dart/tools/test.dart'. If
-   * the main script using 'test_suite.dart' is not there, the main
-   * script must set this to '.../dart/tools/test.dart'.
+   * Any script using TestUtils must set dartDirUri to a file:// URI
+   * pointing to the root of the Dart checkout.
    */
-  static String testScriptPath = new Path(Platform.script.path).toNativePath();
+  static setDartDirUri(uri) {
+    dartDirUri = uri;
+    dartDir = new Path(uri.toFilePath());
+  }
+  static Uri dartDirUri;
+  static Path dartDir;
   static LastModifiedCache lastModifiedCache = new LastModifiedCache();
   static ExistsCache existsCache = new ExistsCache();
   static Path currentWorkingDirectory =
       new Path(Directory.current.path);
-  static Path dartDir = new Path(new File(testScriptPath).absolute.path)
-      .directoryPath.directoryPath;
 
   /**
    * Creates a directory using a [relativePath] to an existing